• ベストアンサー

C言語の高階関数についてです。

C言語の高階関数についてです。 double f ( (*g)(double) ){...} とすると「関数を引数にする関数」が作れますが、 「関数を引数にする関数」を引数にする関数って作れますか??? その場合は、引数のところどうやって書けばいいでしょうか??

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

  • ベストアンサー
回答No.1

void f(void (*g)(void (*)(double))) {...} と書けます。 「g」が「関数を引数にする関数」で、 「f」が「関数を引数にする関数を引数にする関数」です。 一点、注意なのですが、 「関数を引数にする」というのは、関数ポインタ(4バイト)を引数にするっていうことです。 つまり、書き方は面倒だけど、動作は単にアドレスを1つ引数に渡しているだけです。 なので、「g」が呼び出す先の関数のアドレスは、他の引数なりで、渡す必要があります。 こんな感じ: void hhh(double v) { printf("h:%f\n", v); } void ggg(void (*h)(double)) { printf("g\n"); h(9.99); } void fff(void (*g)(void (*)(double))) { printf("f\n"); g(hhh); } void main(void) { fff(ggg); }

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

typedef を使うといいかもよ.

関連するQ&A

  • C言語(引数)

    はじめまして。 C言語を習い始めたものです。 関数を定義するとき、よく耳にする、仮引数や実引数があると思います。 仮引数は関数の定義内で値をうけとる変数のことであり 実引数は関数を呼び出す際に渡す値を実引数というらしいのですが どこからどこまでを仮引数と呼ぶのかわかりません。 例えば、 fの関数の定義内で ↓があるとします。 (関数にする意味はないのですが、確認のためあしからず・・・) double f(double x) {     x=5;     return(x); } この場合、仮引数とよばれるものは double f(double x)の xが仮引数であって x=5;のxは仮引数と呼ばないのでしょうか?? もしそうならば void f(double x) { printf("%f",x); } のprintf("%f",x);内のxは仮引数とよぶのでしょうか? 質問の内容が意味不明かもしれませんが よろしくお願いします。

  • C言語によるガンマ関数の記述

    今、C言語を用いてガンマ関数を計算する方法を模索中でです。 理想的にはガンマ関数の引数に数値を入れたら戻り値を返すというのがいいのですがそうもうまくいかないと思います。 そこで以下のような形で整数の場合と非整数の場合で作ることを考えています。しかし、引数が整数のときはわかるのですが、非整数のときがわかりません。どうしたらよいでしょうか。 以下に関数の概要を掲載します。 ==========関数の概要=========== 関数名:Gamma(x) 戻り値:double 引数:x[double] 1)引数が0より大きい整数(1,2,3...)のとき   階乗の自己回帰文を使用して計算 2)引数が0より大きい非整数の場合 ==========▲ここまで==========

  • 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 で定義せよ”って理解できません、どのように定義したいいか、ご教授お願いします。

  • C言語の関数を分かりやすく説明してください。

    C言語を学習しています。 C言語の入門書を読んでいて、どうしても関数のこと(引数とか戻り値とか自作関数についてのこと)が分かりませんでした。ネットで調べてみたりもしたのですが分かりませんでした。 かみ砕いて説明していただけるとありがたいです。

  • C言語:関数の返り値と引数について

    C言語:関数の返り値と引数について C言語の関数を作るとき、ほしい値とかを引数にして渡す場合と、そのまま返り値で渡す場合の二種類がありますよね? 例えば、 ・void Smooth( Image *src, Image *dst, int param ); ・Image *Smooth( Image *src, int param ); みたいな感じで mallocとかは返り値で渡してますけど、opencvの関数(例えばcvSmooth)とかは引数にしてます これって使い分けとかあるんでしょうか?

  • C言語の関数の実引数と仮引数の名前について

     C言語で関数を使う場合、実引数と仮引数の名前(変数名)は、変えなければならないのでしょうか、同じでもいいのでしょうか。C言語のルールでは、どうなっているのでしょうか。よろしくお願い致します。

  • C言語の標準関数の引数の順番について

    C言語標準関数の引数についての質問です。 strcpy、memsetなど C言語の標準関数の引数に注目したところ 前に出力パラメータを持ってきているものが多いように思えます。 例えば、 char *strcpy(char *dest, const char *src); の場合、 第1引数の"dest"が出力パラメータで 第2引数の"src"が入力パラメータとなっています。 入力よりも出力を前に持ってきている理由が何かあるのでしょうか。 今後、自分が設計をするときの参考にしたいと考えているので 理由を知っている方がいたら教えて下さい。

  • 関数に値の代入 [C言語]

    C言語初心者です。関数とポインタについて勉強していたのですが、ふと関数の型を知りたくなってVC++で型を調べてみたんです。そしたら、void型で引数のない関数の型は void (__cdecl*)() となっていました。voidと__cdeclはわかります。 そしてこれ型に*が入ってるじゃないですか。ということは関数はポインタということになると思います。なので私はもしかしたら値の代入ができるのではないか、と思ったのです。早速、 f1=f2;(f1とf2は型と内容の同じ関数) や、 (*f1)=(*f2); としてポインタの中身や参照先の関数の実態の値を処理中に書き換えてみようとしました。ですが、多分そうなるとは思ったのですが、コンパイルエラーが出ました。 《エラーの内容》 error C2106:'=':左のオペランドが、左辺値になっていません。 warning C4550:式は引数リストのない関数として評価します。 関数を書き換えようとすること自体馬鹿げていることは重々承知です。でも、微かにいけそうな気がするんですよ。代入させたくないなら関数の型は一律constにすると思うし(実際関数をconstをつけて宣言してもOKだった、(プロトタイプ有り無しでも))、関数への代入は問答無用で駄目なのならばそういうエラーメッセージを出すと思うんです。 関数の書き換えは100%無理でしょうか?それとも関数を書き換える方法があるでしょうか?回答よろしくお願いします。

  • (C,C++言語)関数の引数は自動キャストされる?

    プログラミング言語C,C++の数値計算に関する質問です. 整数データ変数同士のみの計算結果は小数点以下は切り捨てられますよね. もし実数型で計結果を得たいときは,int変数を(double)や(float)でキャストしてあげなければならないことは知っています. ここで,仮引数リストにdouble型変数が設定されている関数の引数にint型変数を与えた時,関数の呼び出し時にキャストしなくても自動でキャストされるのでしょうか. 以下のサンプルコードを作成し,実行してみた結果を次に示します. ---サンプル--- #include <iostream> using namespace std; void printDouble(double val, double val2) { cout << "(double)val = " << val / val2 << endl; } int main(void) { for (int i = 1; i < 5; i++) { cout << i / (i * 2) << endl; printDouble(i,i*2); } } -----実行結果---- 0 (double)val = 0.5 0 (double)val = 0.5 0 (double)val = 0.5 0 (double)val = 0.5 ------------------------- 関数の外での計算は整数に丸められてしまうので i / ( i * 2 ) 計算結果はゼロに,関数の中では与えられた i はdouble型として扱われるので小数点以下の値も残っているということですよね. この場合,printDouble関数へ整数を与えるときには printDouble( (double)i , (double)( i * 2 ) ); といったようにわざわざキャストしなくても自動で仮引数の型でキャストされて関数が呼び出されると理解してもよいのでしょうか. 実行結果から明らかだろ,思われてしまうかもしれませんが,何かの参考書に記述されているのを見たり,人からそう教わったわけではなく,また関数のオーバーロードのこともありますので,質問させて頂きました.よろしくお願いいたします.

  • C言語;関数をfor文に入れる(物理のシミュレーション)

    C言語;関数をfor文に入れる(物理のシミュレーション) こんにちは、いつもお世話になっています。 for文、関数、それぞれC言語で勉強したのですが、そこで質問です。 今、複数の質点について考えています。 1つ1つの動きはルンゲクッタ法を使って解くことが出来ます。 もしこれを複数解くことになる場合を考えたとき、最初にまず思いついたのが i番目の質点をルンゲクッタ法 (参考にしたサイトが   http://www.geocities.jp/supermisosan/rk.html     です) で関数f1(t,x[i],v[i])などを用いて書き、for(i=0;i<Nmax;i++)により 全質点について計算するといったことです。(質点同士の相互作用は考えません。) が、私が書いたものではどうもうまくいかず・・・ このような場合どうしたらよいのでしょうか? main()の外に関数f1の定義を書きましたが、その書き方に問題があるのかもしれません。 私はこのように書いてみたのですが・・・ double f1(double t,double x[i],double v[i]){ return v[i]; } 説明がうまく出来ず申し訳ありません。 わかる方よろしくお願いします。

専門家に質問してみよう