2016-09-28 15 views
-2

関数へのポインタの配列を関数の引数として渡すにはどうすればよいですか?関数の型が無効でポインタがそうである場合、関数にはどのようにアクセスしますか?配列と関数ポインタ

int main() { 

    void(*fun_ptr[])(void) = {fun1, fun2, fun3}; 
    pickFun(fun_ptr); 
    return 0; 
} 

すべての3つの機能は、メッセージを印刷し、私は機能が選択されたときに表示されるように関数のprintfの声明を得ることはできないのボイド

void pickFun(void *function_ptr[]) 
{ 
    int pick = 0; 
    while(pick != 0) 
    { 
    scanf("%i", &pick); 
    *(function_ptr + (pick - 1)); 
    } 
} 

として宣言されています。プログラムは単にループし、各機能に含まれるメッセージを印刷しません。任意の提案や手がかり?

+0

まず、配列を使用している場合は、配列インデックス構文を使用します(例:代わりに 'function_ptr [pick-1]'を使うと、あなたがしていることがはっきり分かります。第二に、実際に関数を呼び出すことはありません。 –

+0

ああ、3番目に、あなたのループ条件についてもう一度考えてみてください。 –

+0

'int pick = 0; while(pick!= 0){... 'ループは決してチャンスを得られません。 –

答えて

1

機能パラメータvoid *function_ptr[]は、pointer to pointer to voidである。

void pickFun(void (*function_ptr[])(void)); 

コメントに指摘されているように、プログラムはループ本体に入ることはありません。

(*function_ptr[pick-1])(); 

か(不潔):より良いここdo whileループを使用する

void pickFun(void *function_ptr[]) 
{ 
    do 
    { 
     scanf("%i", &pick); 
     //*(function_ptr + (pick - 1)); 
     function_ptr[pick-1]();  //Function call. pick should not be greater than 3 
    } while(pick != 0) 
} 
+1

つまり、* main *で宣言されているように*正確に*、イニシャライザは少なくなります。 – WhozCraig

+0

私はmainをこのmain mainに変更しました{ \t void(* fun_ptr [])(void)= {fun1、fun2、fun3、fun4}; \t pickFun(fun_ptr); \t return(0); } 私はこの voidpickFun(ボイド(* function_ptr [])(ボイド)){}ピック楽しい内部 私が使用function_ptrにpickFunを変更し、[ピック - 1] 3件の法的回答の各々を0 を終了します 私のpickFun宣言はこれです void selectFunction(void(* []));次 \t言っ コンパイラエラー '無効pickFunを(void *型[])': –

0

また、あなたがあなたの関数を呼び出すことができ

(*(function_ptr + (pick-1)))(); 

か:

function_ptr[pick-1](); 

をまたは:

(function_ptr + (pick-1))(); 
+0

このdoesnの '* []無効' に '無効(__cdecl * [4])(空)' から、引数1を変換することはできません関数へのポインタの配列を関数の引数として渡す方法は? – Lundin

+0

「どのように機能にアクセスしますか?」という質問に答えます。 –

関連する問題