関数のコールバックは、次のような別の関数の呼び出しに別の関数ポインターを埋め込んでいることを知っています。
関数宣言:
function_call_back(int x, int y, void (*functonPtr)(int x, char y , struct newStruct* sptr))
void func(int x , char y , struct newStruct* sptr1)
{
//perform Algorithm 1 on x,y ,sptr1
}
void func2(int x , char y , struct newStruct* sptr2)
{
//perform Algorithm 1 on x,y ,sptr2
}
void func3(int x , char y , struct newStruct* sptr3)
{
//perform Algorithm 1 on x,y ,sptr3
}
void func4(int x , char y , struct newStruct* sptr4)
{
//perform Algorithm 1 on x,y ,sptr4
}
main()
{
// function calling
function_call_back(23, 2256, func1);
}
func
関数名は関数ポインタと同等であるため、ここで3番目の引数はです。
function_call_backを呼び出す前に、上記のメインにこの行を追加することfunc
で、同様の関数シグネチャのさまざまなバリエーションでここを変更できることに同意します。
typedef void (*fptr)(int int x , char y , struct newStruct* ptr);
fptr f1 = func2; // or func3, or func4
function_call_back(23, 2256, f1);
3番目の引数はfunc
、関数名と同じですが、次の呼び出しに関数呼び出しコードを追加するだけで、以下の方法でも実現できるのではないかと思いましたfunction_call_back
。
function_call_back(23, 2256, functionCallingcode); //third argument is func
の新しい宣言function_call_back
は次のとおりです。
function_call_back(int x, int y, int functionCallingCode)
そして、その新しい定義は次のとおりです。
void function_call_back(int x, int y, int functionCallingCode)
{
switch(functionCallingCode)
case 1:
func1(1,"g",sptr1);
break;
case 2:
func2(1,"c",sptr2);
break
case 3:
func3(1,"d",sptr3);
break;
case 4 :
func4(1,"s",sptr4);
break ;
default :
printf("Wrong Function calling code");
}
}
では、なぜ関数ポインタを使うのでしょうか?