2012-05-19 53 views
3

我想創建一個函數指針數組並能夠在for循環中調用它們。我怎樣才能做到這一點?我曾嘗試:C中的函數指針數組

void (**a) (int); 
a[0] = &my_func1; 
a[1] = &my_func2; 
a[2] = &my_func3; 

for (i = 0; i < 3; i++){ 
    a[0](); 
    (*a[0])(); // Neither does work 
} 

但我錯過了一些語法我猜:

error: too few arguments to function ‘*(a + (long unsigned int)((long unsigned int)i * 8ul))’ 
+1

你應該爲這個數組分配一些空間...... –

回答

2

我想下面的代碼是你所需要的。

typedef void * func_pointer(int); 

func_pointer fparr[10]; 

for(int i = 0; i<10; i++) 
{ 
    fparr[i](arg); //pass the integer argument here 
} 
+0

可能是'typedef'語句中的一個輸入錯誤,我在編譯代碼時遇到錯誤,'typedef void(* func_pointer)(int);'工作。請仔細檢查:)。 –

3

你宣佈a是一個指針的指針(或指針數組)的函數需要一個int作爲參數 - 所以你需要傳遞一個int當你調用函數,例如a[0](42);

7

聲明預計將需要一個int作爲參數的函數:

a[0](1); 

另外請注意,你聲明的指針,指針的功能,但你不爲他們分配任何內存(我假定這只是例子),否則它可能應該是:你去哪兒分配或定義的數組存儲函數地址

void (*a[3]) (int); 
1

1)?

2)在循環中,您總是調用(* A [0])();應該有循環計數器

1

您可以typedef void (*pfun)(int);然後pfun a[3];是你想要的陣列。

下面的代碼可能會爲你工作:

typedef void (*pfun)(int); 

int main() { 
    pfun a[3]; 
    a[0] = myfunc1; // or &myfunc1 whatever you like 
    a[1] = myfunc2; 
    a[2] = myfunc3; 
} 
1

你忘了給一個參數傳遞給你的函數。

void (**a) (int); // here it takes an int argument 
a[0] = &my_func1; 
a[1] = &my_func2; 
a[2] = &my_func3; 

for (i = 0; i < 3; i++){ 
    a[0](); // here you do not give an argument 
} 

但要小心,你不分配內存以你的a陣列,它失敗,一個漂亮的分段錯誤。

void my_func1(int i) { 
    ; 
} 
void my_func2(int i) { 
    ; 
} 
void my_func3(int i) { 
    ; 
} 

int main() { 
    void (**a) (int); 
    a = malloc(3*sizeof(void*)); // allocate array ! 
    a[0] = &my_func1; 
    a[1] = &my_func2; 
    a[2] = &my_func3; 

    for (int i = 0; i < 3; i++){ 
     a[i](1); // respect your own function signature 
    } 
    free(a); // it's always a good habit to free the memory you take 
    return 0; 
} 
1

您可以使用所需的尺寸定義功能陣列,並與你的函數初始化它像:

void my_func1(int x){} 
void my_func2(int x){} 
void my_func3(int x){} 

void (*a[])(int)={my_func1,my_func2,my_func3}; 


int i; 
for(i=0;i<sizeof a/sizeof*a;++i) 
    a[i](i); 

任何函數名前的地址運算符「&」是多餘的。