アプリ版:「スタンプのみでお礼する」機能のリリースについて

戻り値に関数のアドレスを与える方法が良く分かりません.
ひとまず,以下のように動くプログラムを作りたいと思っています.
 f2(1,2)(1); //このように引数の()を二種類に分けたいのですが
無理でしょうか??

プログラムは下のように作って実験しているのですが良く分かりません・・
どなたか分かる方居たら教えてください.

int f1(int x , int y){
return 0;
}
????? int ff(int x){
return f;
};

A 回答 (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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/20 21:15

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);
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/08/20 21:13

こんなことがしたいのでしょうか。



#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;
}
    • good
    • 0

えぇと.... 関数名が混乱してますね.


さておき, 関数へのポインタを返す関数は作れます. 宣言するのが面倒なだけ.
ISO C の範囲でも, signal は関数へのポインタを返してます.
    • good
    • 0
この回答へのお礼

回答ありがとうございます.
signalの関数を調べてみます.

関数はff→f2の間違いでした.
int f1(int x , int y){
return 0;
}
????? int f2(int x){
return f;
};

お礼日時:2008/08/20 19:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!