• ベストアンサー

関数の戻り値に関数のアドレスを返すできませんか?

戻り値に関数のアドレスを与える方法が良く分かりません. ひとまず,以下のように動くプログラムを作りたいと思っています.  f2(1,2)(1); //このように引数の()を二種類に分けたいのですが 無理でしょうか?? プログラムは下のように作って実験しているのですが良く分かりません・・ どなたか分かる方居たら教えてください. int f1(int x , int y){ return 0; } ????? int ff(int x){ return f; };

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.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; }

sorokuku
質問者

お礼

分かりやすいプログラムで回答していただいてありがとうございます. FUNC f[]のように配列も作れるとは驚きました. 大変勉強になりました.

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

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);

sorokuku
質問者

お礼

回答ありがとうございます. なるほどtypedefで関数のポインタの型を作ったわけですね. 早速実験してみたところ,エラー無く動作しました.

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

こんなことがしたいのでしょうか。 #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)
回答No.1

えぇと.... 関数名が混乱してますね. さておき, 関数へのポインタを返す関数は作れます. 宣言するのが面倒なだけ. ISO C の範囲でも, signal は関数へのポインタを返してます.

sorokuku
質問者

お礼

回答ありがとうございます. signalの関数を調べてみます. 関数はff→f2の間違いでした. int f1(int x , int y){ return 0; } ????? int f2(int x){ return f; };

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c言語の関数定義について

    次の関数定義を考える. int f(int x) {if (x > 0) {return x * f(x-1);} else {return 1;} } この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ.ただし,オーバーフロー(overflow) については考慮しなくてよい. ”この関数f と働き(すなわち,引数と戻り値の関係)が同じで再帰呼出(recursive call) を使わない関数g をC で定義せよ”って理解できません、どのように定義したいいか、ご教授お願いします。

  • お願いします

    int c(int x)    { x = x + 3;     { int t; t = 6;      { int x; x = 6; t = x + t + 12; }    return x + t;    } } 上の関数の変数の名前替えだけが許されるという条件の下で,関数f の働き(すなわち,引数と戻り値の関係)を変えずに,上記の関数定義の4行目 { int x; x = 6; t = x + t + 12; } の(int x)を(int t) に変更して.必要最小限の変数の名前替えを施した関数定義を書け. 私はこのように定義していますので、正しいですか、「関数の変数の名前替えだけが許されるという条件の下で,関数f の働き(すなわち,引数と戻り値の関係)を変えずに」ってあまり理解できてないので、ご教授お願いいたします。 int c(int x)    { x = x + 3;     { int y; y = 6;      { int t; t = 6; y = t + y + 12; }    return x + y;    } } }

  • 関数名、パラメータは同じで、戻り値によって異なる処理?

    戻り値というより、受け側によって関数の振る舞いを変えたいのですが、 C++では、同名、同パラメータはC2556のコンパイルエラーになります。 Perlでいうリスト値を返すかスカラー値を返すかは呼び出し側によるようなことをしたいのですが、C++では無理でしょうか? 下の例では、//...部分は戻り値によって異なるのでC++のテンプレート?では無理そうですが、そんなことはC++でできるのでしょうか? 似たようなテクニックでも構いませんので、知識の豊富な方、教えてください。 #include <iostream> #include <string> using namespace std; class A { public: A(){} ~A(){} int test(int x, int y){           //... return 0; } string test(int x, int y){ // ... return ""; } }; void main(void){ A a; int ret1 = a.test(1,2); string ret2 = a.test(1,2); cout << endl << "End..." << endl; }

  • こんな条件を満たす乱数生成関数教えてください

    1.任意の周期を指定できる 2.種を指定できる(直前の生成値を引数にとる) 3.逆関数が定義できる 4.生成された乱数 x、y の距離を(定数時間で)求められる   つまり y = f(x) ならxとyの距離は1、 y = f( f( f(x) ) ) なら距離3、というように 乱数としての質(均等に分布していること)はあまり重視しません。 ビット幅は32~128bitくらい(任意ならベスト)であればいいと思っています。 以下のような感じにしたいです。  int rand(x, p);   // 戻り値 y = f(x)、pは周期、xは直前の乱数値  int inv(y, p);   // 戻り値 x = f^-1(y)  int distance(x, y) // y = f(f(x)) のとき、distance(x, y) = 2 で distance(y, x) = -2 一応以下の関数が条件1~4を満たすのですが、残念ながら乱数としての性質が皆無なので使えないです。  int rand(x, p) { return (x+1) % p; }  int inv(y, p) { return y ? y - 1 : p-1; }  int distance(x, y) { return y - x; } よろしくご教授お願いします。

  • 他のクラスから呼び出した関数の戻り値がおかしい

    今、アクションゲームのようなものを作成しています。 このプログラムには Map_Draw クラスと Jchara クラスの二つのクラスが存在しており、 Map_Draw クラスには mapdata というプライベートな二次元配列が存在し、マップのデータを格納しています。 Map_Drawクラスにはmapdata の要素を参照するために、re_mapdata という関数があります。 このre_mapdata関数は、引数x,yをとり、mapdata[x][y]の値を返します。 ここで、Jcharaクラス内の関数からre_mapdata関数を呼び出したところ、 戻り値が滅茶苦茶な数字になり、正常に動作しません。 このre_mapdata関数は、Map_Drawクラスから呼び出すと正常に動作します。 なお、JcharaクラスにはMap_Drawクラスのオブジェクトjmdがあり、 jmd.re_mapdata という形で呼び出しています。 どなたか、回答をお願いします。 //re_mapdata関数のコード int re_mapdata(int x,int y){return mapdata[x][y];}

  • 関数から戻り値を得る方法について

    知り合いの方から関数の戻り値をえるときにreturn以外に例えば File(&i,&k);←関数呼び出し int File(int **j, double *k)←関数 {      ~      ~ } とやると(double *k)は関数からの出力として、呼び出しているFile(&i,&k)の(&k)に返されると聞きました。しかも、戻り値はint File()のintに依存しないと言われて試してみたのですが、どうもうまくいきません。 正しいやり方知っている方いましたら、教えて下さい。あと複数戻り値を返したいときはどうすればいいんでしょうか?

  • main関数の戻り値

    C言語のmain関数の戻り値はint型ですよね。 私もそういう決まりだと思って守ってきました。 しかし、「mainが戻り値を返すって、どこに返すの?」ということが、私は理解できていません。 私が調べたところでは、「ホスト実行環境」という言葉がこの問題に関係あるようですが、この言葉の意味はよくわからないですし、似た言葉で「ホスト環境」ということばがあるのですが意味も関係もわかりません。 これらは、OSとは違うと思うんですが、自信はありません。 それでも、ない知識を振り絞っていろいろ考えてみると、次のようなことらしいのですが、正しいでしょうか。 ・OSはプログラムの実行に先立ちホスト実行環境を作る。 ・静的記憶域のオブジェクトを初期化するのはホスト実行環境である。 ・関数が、main関数を呼ぶことは可能である。(以下では、main関数が関数から呼ばれる場合は除く。) ・main関数を呼ぶのは、ホスト実行環境が行なう。 ・main関数の中のreturnによってプログラムが終了するのと、exit関数でプログラムが終了することに違いはない。 ・main関数の戻り値は、ホスト実行環境に返される。 ・returnによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・exitによってホスト実行環境に返される値は、int型である限りなんでもよい。 ・必ずexitで値が返されるならば、main関数の中にreturnはなくてもよい。 main関数からの戻り値をどうしようと構わないんだと思うんですが、皆さんの経験の中で、実例としてこういうふうに使われる、というのは何かないのでしょうか。 (ホスト実行環境に値が返される、といっても無視するのでは意味はないと思うのです。 その値の使用例としては、 0が返ってくると「プログラムは正常終了しました。」と表示するとか、0以外の値が返されると別のプログラムが走るとか、 そういうことだと思うんですが。)

  • C++基底クラスに戻り値の異なる関数が宣言されている場合

    こんにちは。 質問させてください。 以下のようなコードがあったとします。 class Base1 { public:   virtual int get()=0; }; class Base2 { public:   virtual float get()=0; }; class Ex : public Base1, public Base2 { public:   int get(){return 0;}   float get(){return 0.0f;} }; void main() { } このプログラムをコンパイルすると 「'Ex::get': オーバーライドする仮想関数の戻り値の型が異なり、'Base1::get' の covariant ではありません。」 というエラーが出てしまいます。 関数の名前と引数が同じで戻り値だけが異なる場合はエラーが出るのはわかるのですが、基底クラスのBase1、Base2は変更不可能だとするとどのように回避すればいいのでしょうか? よろしくお願いします。 /*   WindowsXP Professional SP3   VisualStudio2005 AcademicEdition */

  • C++で他のファイルの関数の引数を引きだす方法

    C++初心者です。 あるCプログラムに関数: testFunction(const char x[ ], int a, int b, int c)があり、 この関数はchar y[ ]を戻り値として返します。 次の段階で、別のC++を作成し、その中で、上記testFunctionを呼び出し、 使用している引数を引き出して以降のプログラムで使用する仕様のプログラムを組んでいます。 他のファイルに存在する関数を呼び出す方法は、 std::cout << testFunction(x[], a, b, c) << std::endl; ではないかと思っているのですが、ここから先が進まず困っている状況です。 戻り値だけではなく、引数も呼び出すことは可能でしょうか。 可能であれば、どのようにして呼び出すことができるのでしょうか。 アドバイスをお願いいたします。

  • この関数を使ったプログラムの修正箇所。

    xとyをそれぞれ0から10まで1きざみで変え、そのすべてを組み合わせた平面上の11x11個の点(x,y)のうちで、上記の領域に含まれる点の数を出力するmainプログラムとプロトタイプ宣言、 さらに入力パラメータであるx,yを組み合わせた平面上の点(x,y)を考え,この点が原点が(4,7)、半径5の円の内側(円周上は除く)に含まれるなら戻り値は1,含まれないなら戻り値は0 #include <stdio.h> int judgment(int x, int y); int main(void) { int x,y,count; count=0; for(x=0; x<=10; x++) for(y=0; y<=10; y++) if(judgment(x,y)==1) count++; printf("%d\n",count); } int judgment(int x, int y){ int a,b; if ((4 - a) * (4 - a) + (7 - b) * (7 - b) < 5 * 5) return(1); else return(0); } という関数を使ったプログラムを上記の様に書いたんですが、上手く結果が出力されず結果が0となってしまいます。 自分的にはこれでいけると思ったんですが…。 何処を手直しするべきかわからなく困っているので、どなたかヒントをもらえたら助かります。