- ベストアンサー
関数の戻り値に関数のアドレスを返すできませんか?
戻り値に関数のアドレスを与える方法が良く分かりません. ひとまず,以下のように動くプログラムを作りたいと思っています. f2(1,2)(1); //このように引数の()を二種類に分けたいのですが 無理でしょうか?? プログラムは下のように作って実験しているのですが良く分かりません・・ どなたか分かる方居たら教えてください. int f1(int x , int y){ return 0; } ????? int ff(int x){ return f; };
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 こっちの方がいいかも。 #include <stdio.h> typedef int (*FUNC)(int, int); int f0(int a, int b) { return a + b; } int f1(int a, int b) { return a * b; } FUNC func(int n) { FUNC f[] = { f0, f1 }; return f[n]; } int main(void) { printf("%d\n", func(0)(10, 20)); printf("%d\n", func(1)(10, 20)); return 0; }
その他の回答 (3)
- salsberry
- ベストアンサー率69% (495/711)
typedefしましょう。f()は、g1()またはg2()のアドレスを返します。 int g1(int x) { return x+1; } int g2(int x) { return x-1; } typedef int (*FUNCP)(int); FUNCP f(int y) { if (y == 1) { return g1; } else { return g2; } } int a1 = (f(1))(5); int a2 = (f(2))(5);
お礼
回答ありがとうございます. なるほどtypedefで関数のポインタの型を作ったわけですね. 早速実験してみたところ,エラー無く動作しました.
- asuncion
- ベストアンサー率33% (2127/6289)
こんなことがしたいのでしょうか。 #include <stdio.h> typedef void (*FUNC)(int, int); void f0(int a, int b) { printf("f0() was called.\n"); printf("%d+%d=%d\n\n", a, b, a + b); } void f1(int a, int b) { printf("f1() was called.\n"); printf("%d*%d=%d\n\n", a, b, a * b); } FUNC func(int n) { FUNC f[] = { f0, f1 }; return f[n]; } int main(void) { int i, a = 10, b = 20; for (i = 0; i < 2; i++) { (*func(i))(a, b); } return 0; }
- Tacosan
- ベストアンサー率23% (3656/15482)
えぇと.... 関数名が混乱してますね. さておき, 関数へのポインタを返す関数は作れます. 宣言するのが面倒なだけ. ISO C の範囲でも, signal は関数へのポインタを返してます.
お礼
回答ありがとうございます. signalの関数を調べてみます. 関数はff→f2の間違いでした. int f1(int x , int y){ return 0; } ????? int f2(int x){ return f; };
お礼
分かりやすいプログラムで回答していただいてありがとうございます. FUNC f[]のように配列も作れるとは驚きました. 大変勉強になりました.