2014-10-06 152 views
0

我正在用C編寫一個使用函數指針數組的程序。如果我不包含一個參數,我可以用我的代碼調用函數而不會出現問題。將參數傳遞給函數指針數組

int (*functionsArray[2][3])() = { 
    {functionOne,functionTwo,functionThree}, 
    {functionFour,functionFive,functionSix} 
}; 

然而,當我試圖傳遞參數int x

int (*functionsArray[2][3])(int x) = { 
    {functionOne,functionTwo,functionThree}, 
    {functionFour,functionFive,functionSix} 
}; 

我得到一個錯誤:

invalid conversion from 'int (*)()' to 'int (*)(int)' 

還沒有這些函數返回一個int,我不應該能夠宣佈它們是無效的?

void(*functionsArray[2][3])(int x) = { 
    {functionOne,functionTwo,functionThree}, 
    {functionFour,functionFive,functionSix} 
}; 

嘗試這將導致一個錯誤:

error: invalid conversion from 'int (*)()' to 'void (*)(int)' 

感謝。

+0

向我們展示至少'functionOne'並告訴我們在哪條線上出現錯誤。 – 2014-10-06 06:45:28

+0

'functionOne','functionTwo',...應該有完全相同的原型。原型應該與您用於陣列的原型相同。 – j123b567 2014-10-06 06:53:16

+0

你有沒有嘗試重新組織括號,也許像(void(* functionsArray(int x)))[2] [3])= ...。其次,更重要的是,我強烈建議爲函數指針創建一個typedef,所以用法可以是直接的固件數組聲明。 – racraman 2014-10-06 06:56:40

回答

1

這將做工精細,提供你正確聲明功能:

#include <stdio.h> 

int functionOne(int x) { return 1; } 
int functionTwo(int x) { return 2; } 
int functionThree(int x) { return 3; } 
int functionFour(int x) { return 4; } 
int functionFive(int x) { return 5; } 
int functionSix(int x) { return 6; } 

int (*functionsArray[2][3])(int x) = { 
    {functionOne, functionTwo, functionThree}, 
    {functionFour, functionFive, functionSix} 
}; 

int main (void) { 
    printf ("%d\n", (functionsArray[0][1])(99)); 
    printf ("%d\n", (functionsArray[1][2])(99)); 
    return 0; 
} 

該程序的輸出是26


如果你想它也將工作沒有返回值:

#include <stdio.h> 

void functionOne(int x) { puts ("1"); } 
void functionTwo(int x) { puts ("2"); } 
void functionThree(int x) { puts ("3"); } 
void functionFour(int x) { puts ("4"); } 
void functionFive(int x) { puts ("5"); } 
void functionSix(int x) { puts ("6"); } 

void (*functionsArray[2][3])(int x) = { 
    {functionOne, functionTwo, functionThree}, 
    {functionFour, functionFive, functionSix} 
}; 

int main (void) { 
    (functionsArray[0][1])(99); 
    (functionsArray[1][2])(99); 
    return 0; 
} 

該方案輸出26,符合市場預期。


這一切都歸結爲確保函數聲明與數組中給出的類型匹配。

+0

gee我覺得啞巴。 修復它,非常感謝! – twwyt 2014-10-06 07:19:22

0

當聲明的數組:

int (*functionsArray[2][3])(int x) = 
{ 
    {functionOne,functionTwo,functionThree}, 
    {functionFour,functionFive,functionSix} 
}; 

陣列的每個元素必須是int (*)(int)類型。否則,編譯器會正確報告錯誤。

舉一個簡單的情況:

void foo() 
{ 
} 

int (*fp)(int x) = foo; 

應該得到相同的編譯器錯誤,因爲你正試圖初始化使用fooint (*)(int)類型的變量,其類型爲void (*)()