2016-05-17 7 views
-5

私は、異なる戻り値の型と異なる引数を持つ3つの関数を持っています。私は関数ポインタの配列を作成し、その後それらを呼び出すことを試みています。しかし、それは動作しません。提案をお願いします。異なる戻り値の型と引数を持つCの関数ポインタの配列

#include <stdio.h> 

/* Array of function pointers (different return types and parameters) */ 

void sayHello() 
{ 
    printf("Hello World\n"); 
} 

int add(int a, int b) 
{ 
    return a+b; 
} 

int twice(int a) 
{ 
    return 2*a; 
} 

int main() 
{ 
    int choice; 
    int(*add_ptr)(int,int) = NULL; 
    void(*hello_ptr)(void) = NULL; 
    int(*twice_ptr)(int) = NULL; 

    void * func_table[] = {(void *)sayHello, (void *)add, (void *)twice}; 


    printf("Add : %d\n", ((add_ptr)func_table[1])(10,5)); 
    printf("Hello : \n",((hello_ptr)func_table[0])()); 
    printf("Twice : %d\n",((twice_ptr)func_table[2])(10)); 
    return 0; 
} 

私が見えるようにコードを編集したEDIT

#include <stdio.h> 

/* Array of function pointers (different return types and parameters) */ 

void sayHello() 
{ 
    printf("Hello World\n"); 
} 

int add(int a, int b) 
{ 
    return a+b; 
} 

int twice(int a) 
{ 
    return 2*a; 
} 

int main() 
{ 
    int choice; 
    typedef int(*add_ptr)(int,int); 
    typedef void(*hello_ptr)(void); 
    typedef int(*twice_ptr)(int); 

    void * func_table[] = {(void *)sayHello, (void *)add, (void *)twice}; 


    printf("Add : %d\n", ((add_ptr)func_table[1])(10,5)); 
    printf("Hello : ",((hello_ptr)func_table[0])()); 
    printf("Twice : %d\n",((twice_ptr)func_table[2])(10)); 
    return 0; 
} 

しかし、それでもまだ、私はエラーを取得しています:

error: invalid use of void expression 
    printf("Hello : ",((hello_ptr)func_table[0])()); 
^
+4

"_ただし、動作していません" - 何が機能していないかを説明してください。 –

+2

_types_ではなく_variables_にキャストできます。 'int a; printf( "%d \ n"、(int)3.14); 'コンパイルして' 3'を出力しますが、 'int a; printf( "%d \ n"、(a)3.14); 'はできません。 –

+0

http://ideone.com/GXveEC – BLUEPIXY

答えて

4

あなたがadd_ptrをしたいようです、hello_ptr、およびtwice_ptrは、関数ポインタであることを種類むしろ変数よりも、(あなたがそれらにキャストしているので):

typedef int(*add_ptr)(int,int); 
typedef void(*hello_ptr)(void); 
typedef int(*twice_ptr)(int); 

を別の方法として、あなたは変数であるとするfunc_tableの要素を割り当てることがadd_ptrhello_ptr、およびtwice_ptrのためのものならばその後、これらの変数、:

add_ptr = func_table[1]; 
hello_ptr = func_table[0]; 
twice_ptr = func_table[2]; 
printf("Add : %d\n", add_ptr(10,5)); 
printf("Hello : "); hello_ptr(); 
printf("Twice : %d\n", twice_ptr(10)); 

また、あなたはここでvoid*にキャストする必要はありません。

void * func_table[] = {sayHello, add, twice}; 

また、お使いのゼロパラメータ機能sayHellomainはそのパラメータリストでキーワードvoidが欠落しています。

void sayHello(void) { … } 
int main(void) { … } 
+0

はい。 'typedef'する必要がありますか?どうして?私は混乱しています.... –

+0

'typedef void(* hello_ptr)(void);'は 'typedef void(* hello_ptr)();'にする必要がありますか? –

+1

@CoolGuyこれは 'void'でなければなりません。 'sayHello'と' main'の宣言は引数リストに 'void'がありません。 – emlai

関連する問題