2013-10-14 2 views
2

함수에 함수 포인터의 배열을 전달하려고했습니다. 일단 그 함수 포인터의 배열에 포인터가 필요하지만 오류가 계속. 함수 인수가 아닐 때 수행 할 수 있습니다. 함수 인수 목록에서C에서 함수 포인터의 전달 된 배열을 "가리킬"수 없습니다

void (*(*PointerToFuncPtrArray)[2])(unsigned char data[], unsigned char length); 
void (*FuncPtr[2])(unsigned char data[], unsigned char length) = { 

    func1, 
    func2, 
} 

void NotArguement(void) // attempt to point to without passing as parameter 
{ 
    PointerToFuncPtrArray = &FuncP; // this works 
} 


// attempt to pass as argument 
void AsArguement((void (*ptr[])(unsigned char data[], unsigned char length)) 
{ 
    PointerToFuncPtrArray = &ptr; // This throws error 


} 

이 발생합니다 ...

Error 1 error C2440: '=' : cannot convert from 'void (__cdecl **[])(unsigned char [],unsigned char)' to 'void (__cdecl *(*)[2])(unsigned char [],unsigned char)'  
+0

오류 메시지가 매우 분명해 보입니다. 'PointerToFuncPtrArray'는 명시적인 크기 정보를 가지고 있습니다; 불완전한 유형 (예 : 누락 된 크기 정보)을 할당하려고합니다. –

+1

타입 변환 문제 외에'AsArgement' 매개 변수 선언에서'()'의 불균형이 생겼습니다. 사실, 컴파일러가 처음보고 할 때의 오류 일 뿐이므로, 그 부분을 간과 해 버리는 것이 궁금합니다. 컴파일하려고하는 실제 코드는 무엇입니까? – AnT

답변

5

배열 선언은 포인터 선언에 붕괴. 따라서 함수 매개 변수는 잘못된 모양에도 불구하고 배열로 선언되지 않습니다. 이것은 pointer-to-pointer로 선언됩니다. 즉, 함수 내부에서 배열 유형이 되돌릴 수 없게 손실됩니다.

동일한 오류

은 상기 예 a이 간단한 예

int x[2]; 
... 
void foo(int a[2]) /* <- equivalent to `void foo(int *a)` */ 
{ 
    int (*p1)[2] = &x; /* <- OK */ 
    int (*p2)[2] = &a; /* <- ERROR: can't convert `int **` to `int (*)[2]` */ 
} 
... 
foo(x); 

보고한다 더 이상 배열 없다. int * 유형의 포인터이며 유형은 int **이고 int (*)[2] 유형의 오브젝트를 초기화하는 데 사용할 수 없음을의 L합니다. 은 "arrayness"인자 "는 전체 배열 포인터"를 통과된다 유지하면서

는 C에서, 유일한 방법

int x[2]; 
... 
void foo(int (*a)[2]) 
{ 
    int (*p)[2] = a; /* <- OK */ 
} 
... 
foo(&x); 

주에서와 같이 함수 배열을 전달할 것을 & 연산자의 적용은 기능의 내부에서 호출 지점으로 "이동"됩니다.

당신은 당신이이 함수를 호출 할 때 배열 인수에 & 연산자를 적용하는 것을 기억해야

void AsArguement(void (*(*ptr)[2])(unsigned char data[], unsigned char length)) 
{ 
    PointerToFuncPtrArray = ptr; 
} 

을 다음과 같이 코드에서 동일한 수정이 보일 것이다.

+0

굉장하고, 빨리 답변 해 주셔서 감사합니다. – bassplayer142

+0

컴파일하는 동안 지금 메서드를 호출하는 데 문제가 있습니다 ... – bassplayer142

+0

(* PointerToFuncPtrArray [1]) (* PointerToFuncPtrArray [1]) (test, sizeof (test)); 첫 번째 줄은 func1 메서드를 제대로 호출하지만 두 번째 함수는 액세스 위반이 발생했습니다 – bassplayer142

관련 문제