2013-10-14 150 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

除了類型轉換問題之外,您還在'AsArguement'參數聲明中使'()'失衡。應該只有一個'(''在'AsArguement'之後'。實際上,這通常是編譯器會首先報告的錯誤。我想知道你是如何忽略它的。是否真的要編譯的代碼? – AnT

回答

5

數組聲明衰變爲指針聲明。所以,你的函數參數沒有聲明爲一個數組(儘管誤導的外觀)。它被聲明爲指針指針,這意味着在函數內數組類型不可逆地丟失。

相同的錯誤將在這個簡單的例子

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); 

在上面的例子a報告不再是一個數組。它是int *類型的指針,這意味着&a的類型爲int **,並且不能用於初始化類型爲int (*)[2]的對象。

在C中,只有這樣才能傳遞數組到功能,同時保留了「arrayness」的變量是「由指針整個陣列」通過它,如在

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 [0])(test,sizeof(test)); \t(* PointerToFuncPtrArray [1]) (測試的sizeof(測試)); 第一行正確調用該方法FUNC1,但第二個給出了一個訪問衝突 – bassplayer142