回答受付中のQ&A
C言語のプログラミング問題だれか教えてください><
C言語のプログラミング問題だれか教えてください><
以下の関数を呼び出すmain関数を記述しろという問題です。試行錯誤しましたがコンパイルすら通りません。
main文で②の関数から返ってくる値を受け取る変数ってvoid (**x)();は違いますか?
②の行は何がなんだかわかりません。
どなたか取り敢えず②の行が何をしているか教えてください。。。><
void hoge(void) {
printf("hoge\n");
}
void (*a(void))(void){ //①
printf("a\n");
return hoge;
}
void (*(*b(void))(void))(void){ //②
printf("b\n");
return a;
}
void (*(*(*c(void))(void))(void))(void){ //③
printf ("c\n");
return b;
}
-
- 質問日時:
- 2014/5/5 16:18:57
-
- 残り時間:
- 6日間
-
- 閲覧数:
- 56
- 回答数:
- 3
-
- お礼:
- 知恵コイン
- 25枚
回答
(3件中1〜3件)
- 並べ替え:回答日時の
- 新しい順
- |
- 古い順
n2q37さん
『②の行が何をしているか』ですか。なるほど、確かに b 関数の戻り値の型って、これは凄いことになっていますね。
②の意味するところとしましては、まず、hoge 関数みたいに戻り値がない関数というのがありますよね。で、そのような形式の関数へのポインタというのがある。それを返すのが a 関数なのですが、その a 関数みたいな形式の関数へのポインタを返す。それが、b 関数っていうことです。
え?分からない?それで普通。分かるわけないでしょ、こんなの。説明するともっと難しくなる。コードの記述をそのまま素直に読むしかないです。普通なら typedef で逃げるところです。
さて、コンパイルすら通らないとの事で、それは辛いですね。一つの例として、以下をご覧下さい。
int main()
{
void (*(*(* const p )(void))(void))(void) = c();
void (*(* const q)(void))(void) = (*p)();
void (* const r)(void) = (*q)();
(*r)();
return 0;
}
これでコンパイルは通るし、ちゃんと動作しますからね。
あ、const ですけど、全部取り除いて構いません。個人的なこだわりです。ただ、それだけのことなので。
- 違反報告
- 回答日時:2014/5/6 16:45:29
>以下の関数を呼び出すmain関数を記述しろという問題です。
int main(void)
{
hoge();
a();
b();
c();
return 0;
}
- 違反報告
- 回答日時:2014/5/5 16:33:29
「関数ポインタ」を学んでください。
http://www.c-lang.org/pointer_function.html
少しは理解できたら、typedef を使って①②③を
置換してってみれば、なんとなく見えてくると思います。
P.S.
さっきの http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1312861474...
と同じ人でしょ?
同じことです。 typedef で1歩ずつ自力置換してけば。
- 違反報告
- 編集日時:2014/5/5 16:30:36
- 回答日時:2014/5/5 16:23:08