2016-12-22 2 views
0

struct의 행렬을 반환하는 함수 포인터에 typedef를 만들려고합니다. 나는 시도했다 :C의 구조체의 행렬을 반환하는 함수의 포인터

typedef struct my_struct** (*func)(void) 
typedef struct my_struct[4][4] (*func)(void) 

그러나 그들 중 누구도 일하지 않았다. 구조체의 내 행렬처럼 초기화 :

static struct my_struct matrix[4][4]; 

내 코드는 타입 정의의이 옵션을 사용하여 컴파일하지 않았다. 이 typedef는 어떻게 작성해야합니까? 감사합니다. .

+3

컴파일 오류 란 무엇입니까? –

+0

예상 이전) [(또는 이와 비슷한) –

+1

첫 번째'typedef'에는 행렬 (일명 2D 배열)이없고, 하나를 가리킬 수있는 것도 없습니다. 포인터가 배열이 아닙니다! 그리고 배열을 함수간에 전달할 수 없습니다. – Olaf

답변

1

배열을 반환 할 수 없습니다. 그러나 배열에 대한 포인터를 반환 할 수는 있습니다. 함수에서 2 차원 배열을 검색하려면이 값을 반환해야합니다.

함수는 4 구조체의 배열에 대한 포인터를 리턴 것이다 : 이런 유형의

struct my_struct (*function(void))[4]; 

타입 정의 :

typedef struct my_struct (*type(void))[4]; 
type* p = function; 
+0

또한, 복사 의미론을 원할 경우 배열이 포함 된'struct'를 반환 할 수 있습니다. –

+0

struct my_struct matrix [2] [4]의 경우에 이해했습니다. typedef struct my_struct (* type (void)) [2]를 써야합니까? 4 구조체의 배열에 어떤 포인터를 반환합니까? –

+0

@Rotemben이 경우 정의는 변경되지 않습니다. 이 함수가 반환하는 것은 4 개의 구조체의 배열에 대한 포인터입니다. 'struct my_struct matrix [2] [4] .'는 4 개의 구조체로 이루어진 두 배열의 배열을 정의합니다. – 2501

1

어레이 함수로부터 반환 될 수있다.

배열의 첫 번째 요소에 대한 포인터를 반환 할 수 있습니다. 귀하의 경우, 배열의 첫 번째 요소는 자체적으로 배열 (행렬에있는 행)입니다. 배열에 대한 포인터를 반환하는 함수에 대한 포인터를 선언하는 데 필요한 구문은 너무 직접적으로 사용하기에 이상합니다. 상황을 다루는 가장 간단하고 사용하기 쉬운 방법은 typedef를 사용하는 것입니다.

typedef struct my_struct row[4]; // a 4-element row in a matrix 
typedef row* (*func)(void);  // pointer-to-function returning pointer-to-row 

당신 의 크기를 생략 할 수없고 당신은 지역 배열에 대한 포인터를 반환하는 것은 아니라는 것을 알아야합니다 즉, 배열 대신

typedef struct my_struct row[]; 
typedef row* (*func)(void); // doesn't do what you want 

typedef struct my_struct *row; 
typedef row* (*func)(void); // doesn't do what you want 

을 포인터를 사용할 수 없습니다 허용치 :

row* myfunc(void) 
{ 
    struct my_struct my_matrix[4][4]; 
    return my_matrix; // will compile, but the behaviour is undefined 
        // a good compiler will warn you 
} 

poin 이러한 방식으로 정적 객체 또는 동적으로 할당 된 객체에 적용 할 수 있습니다.

포인터가 아닌 객체를 반환하려면 래퍼 구조체를 사용해야합니다.

typedef struct { struct my_struct elements[4][4]; } wrapper; 

wrapper (*foo)(void); //OK 
wrapper myfunc(void) 
{ 
    wrapper w; 
    return w; // OK 
} 
+0

나는 이해하지 못했다 : typedef struct matrix row [4]; // 행렬의 4 요소 행 ... 당신은 typedef struct my_struct matrix [2] [4] row [4]를 의미합니까? –

+0

@Rotemben 귀하의 ID와 일치하도록 식별자를 변경했습니다. 희망은 지금 더 분명하다. –

+0

고마워,하지만 전체 매트릭스를 반환해야합니다. 행을 지정할 수 없습니다. –