関数呼び出しの不具合について

このQ&Aのポイント
  • C言語のプログラムで特定の関数呼び出しに問題が発生しています。
  • 呼び出し側のプログラム例を作成しましたが、意図した引数の値が関数に渡らず、予期しない結果が生じています。
  • 変数へのポインタの値を渡すために使用した * 演算子によって、正しい引数が渡されない問題が発生しています。
回答を見る
  • ベストアンサー

value=(*func)(*ax)

参考にしたいある関数mnbrakの定義は,次のようになっています. void mnbrak(float *ax, float *bx, float *cx, float *fa, float *fb, float *fc, float (*func)(float)) { float ulim,u,r,q,fu,dum; *fa=(*func)(*ax); *fb=(*func)(*bx); if (*fb > *fa) { ・・・ } (中略) } ここで知りたいことは, この中の「*fa=(*func)(*ax);」という文を実行するために必要な呼び出し側のプログラム例です. そこで,次のようなプログラムを作成してみました. /* test.c */ #include <stdio.h> float quad(float alf) { float z; z=(10.0+alf*5.0)*(10.0+alf*5.0); return z; } int main() { float* ax; float value; float alpha; float (*func)(); alpha=1.0; ax=&alpha; func=quad; value=(*func)(*ax); printf("value=%f\n",value); return 0; } このプログラムtest.cを実行すると,期待する答えの225すなわち(10.0+5.0)*(10.0+5.0)にならずに,100すなわち10.0*10.0となってしまいました. デバッグモードで,上記の文「value=(*func)(*ax);」を実行するすると,ちゃんとquadへ飛んで行くのですが,引数「1.0」をquadに渡すことができずに,quad側では,alf=0.0となっていました. 私は,「ax」は変数「alpha」へのポインタなので,alphaのアドレスを保持しており,したがって「*ax」は,そのアドレスの内容,すなわち「1.0」であり,「(*func)(*ax)」によって,この「1.0」が実引数としてquadの仮引数「alph」に渡ると思ったのですが(実際quadへ飛んでいく直前では,*axは1.0になっていましたが),そうは行かなかったようなのです. 長い質問文で失礼しますが,よろしくお願いいたします.

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

float (*func)(); の部分を float (*func)(float); とすることで期待するように(225に)なりました

takana049
質問者

お礼

早速のご回答ありがとうございました.私も修正後,255になったことを確認できました. ということは,関数へのポインタの宣言では,「float (*func)(float);」のように引数の型を入れる必要があったのですね.(参考にしていたCの本では,たまたま()のように引数が空欄になっていましたので,そのまま記述してしまっていました.) おかげさまで助かりました.

関連するQ&A

  • *fa=(*func)(*ax)

    何度もすみません. 次のようなプログラムtest2.cを作成してみました. /* test2.c */ #include <stdio.h> float quad(float alf) { float z; z=(10.0+alf*5.0)*(10.0+alf*5.0); return z; } int main() { float* ax; float value; float* fa; float alpha; float (*func)(float); alpha=1.0; ax=&alpha; fa=&value; func=quad; value=(*func)(*ax); printf("value=%f\n",value); printf("*fa=%f\n",*fa); return 0; } これについては,先ほどのBLUEPIXYさんに助けられて,期待する答え225.0を得ることができました. そこで今度は「value=(*func)(*ax);」を「*fa=(*func)(*ax);」に変えて,test3.cを作成して実行したところ,「Segmentation fault」となりました.以下はtetst3.cです. /* test3.c */ #include <stdio.h> float quad(float alf) { float z; z=(10.0+alf*5.0)*(10.0+alf*5.0); return z; } int main() { float* ax; float* fa; float alpha; float (*func)(float); alpha=1.0; ax=&alpha; func=quad; *fa=(*func)(*ax); printf("*fa=%f\n",*fa); return 0; } test3.cの「*fa=(*func)(*ax);」は,「Numerical Recipes in C」に記載の関数mnbrakの定義内の記述に従ったのですが,何がいけないのでしょうか.よろしくお願いいたします.

  • func.arityで、undefined

    とほほのjavascriptで勉強しているのですが http://www.tohoho-web.com/js/function.htm 関数オブジェクトのfunc.arityのところ 関数が要求する引数の個数を返します。 とあるのに、 function goukei(a, b, c) { return(a + b + c); } n = goukei.arity; document.write(n); このコードを書いて実行しても 引数の個数の3ではなく、undefinedが表示されます。 ちゃんと引数は3個だし、functionで定義した関数も、document.write文の前に宣言してあり ぱっとみ問題ないように思われるのですが、どうしてundefinedと表示されるのでしょうか。

  • 関数プロトタイプ無しで、引数が float の場合

    またまた float がらみでつまずています。 以下のようなソース(2つのファイルに分割されています)を実行すると、 f = 2.000000 と表示されました。 test1.c で、func() のプロトタイプを書いてないのが諸悪の根源だとは思うのですが(警告もでています)プロトタイプの役割は、 ・引数の型の不整合がないようにする ・必要に応じて、仮引数と実引数の型変換を発生させる だと思います。 このソースでは(たまたまですが)引数の型もあっているので、正常に実行できそうな気がするのですが、なぜ、結果がおかしくなってしまうのでしょうか。 確かに、プロトタイプがないのは好ましくはないですが。 test1.c に、int func(float f); を追加したときには、確かに f = 0.010000 と表示されます。 また、f と func() の引数を double にしたときには、プロトタイプがなくても、正常に実行されます。 ----- test1.c ------------- int main() { float f = 0.01; func(f); return 0; } ----- test2.c ------------- #include <stdio.h> int func(float f) { printf("f = %f", f); return 0; } ----- ここまで ------------

  • 教えてください。

    普通にint main (void)   return 0 のように1つのプログラムなら出来るんですが 以下の問題になると訳が分かりません。 正しいプログラムを載せて頂くと助かります。 2つの実数a,bを入力して大きい値を返すプログラムを作れ。 ただし、プログラムはデータ入力がある間くり返されるようにする。また、a,bを引数として与え、大きい方の数を返す関数を作ること。 float Func1(float,float);このような関数プロトタイプ プログラムは2つのソースプログラムに分けて作ること。

  • C言語におけるtxtファイルの読み込みと出力

    環境:WinXP,Borland C++compiler 以下のようなプログラムを考えました。 ・sample.c #include <stdio.h> float func(float x,float y,float z); int main(void) { float x,y,z; scanf("%f",&x); scanf("%f",&y); scanf("%f",&z); printf("%f",func(x,y,z)); return 0; } float func(float x,float y,float z) { return x+y+z; }//ここまで。 例えば(x,y,z)=(1,2,3)と入力すると6が出力されます。 このプログラムを、任意のn組の(x,y,z)の記述されたテキストファイルを読み込んで出力outを計算し、別のテキストファイルにn組の(x,y,z,out)を書き込むようにするにはどのような変更を加えればよいのでしょうか。 具体例は以下のような感じです。用意しておいたinput.txtをsample.cで読み込んで計算し、また作成されていないoutput.txtに出力するのが目標です。 (n=3の場合) ・input.txt //x y z 1 2 3 1 8 9 -1 7 5 ・output.txt //x y z out 1 2 3 6 1 8 9 18 -1 7 5 11

  • ax + by + cz + d の符号を求める計算

    式 ax + bx + cz + d = 0 (d>0) であらわされる平面があります。任意の点P(x,y,z)が与えられたとき、点Pと原点O(0,0,0)をつなぐ線分OPがこの平面と交わるかどうかを判断するプログラムを書いています。 a,b,c,dは8ビットの符号つきの整数です。つまり、-129 < a,b,c < 128、 0 < d < 128 です。 点pの座標x,y,z は32ビットの符号付整数です。 単純にax + bx + cz + dを計算すると、途中の計算は最大32+8+2=42ビットの値になるのはわかりますが、答えは1ビット(交わるか交わらないか)なので、32ビットの範囲内での計算で済ますことを考えてみました。そのようなアルゴリズムってありますか?

  • 三角形OABの面積を求めるプログラム

    三角形OABの面積を求めるプログラムを作りました(課題ですがw)。が、うまく動かないんです。 どこが間違っているか教えてください。(VC++6.0) /*三角形OABの面積を求めるプログラム*/ #include <stdio.h> #include <math.h> void main(){ float ax,ay,bx,by,s; printf("点Aの座標を入力してください。\n"); scanf("%f%f",&ax,&ay); printf("点Bの座標を入力してください。\n"); scanf("%f%f",&bx,&by); s=(1/2)*abs(ax*by-ay*bx); printf("三角形OABの面積は%fです。\n",s); } ◇点A(ax,ay) 、点B(bx,by) 面積の公式s=(1/2)*|ax*by-bx*ay| と与えられています。 また、警告の意味もわからないんで、できればお願いします。

  • 関数の書き方と使い方

    Nを引数として受け取り、 y=1+x+x^2+x^3+...+x^N ただし |x|<1 を計算する関数 float func1(float x, int N) を定義してその動作を確認するプログラムkadai3-1.cを書きなさい。 ただしNとxはキーボードから次で入力するものとする。 scanf("%f %d", &x, &N); 答えは以下で出力されるものとする。 printf("answer = %f\n", answer); 実行例 $ gcc kadai3-1.c $ ./a.out 0.1 5 answer = 1.111110 よろしくお願いいたします。

  • プログラミングの問題なのですが

    学校の課題でプログラムを作らなければならないのですが、いまいちよくわからないので教えてください>< 1、インチ単位の数を引数として何cmかを出力する関数を作成しなさい。 2、f(x)=ax^2+bx+cのa,b,cを順に引数として、f(x)=0の実数解の個数を出力する関数を作成しなさい。 よろしくお願いします。

  • 関数のプログラムについて

    任意の二次方程式ax^2+bx+c=0をとくプログラムの作成です 引数をa,b,cとして、解の大きい方を返すというものなのですが、 僕は以下のようにして組んだのですが、うまくいきません。 と、いうより、関数の作り方がいまいちわからないです。 どこが駄目なのか教えてください。 作ってみたやつ↓ #include<math.h> #include<stdio.h> int a,b,c; double d; double x,y,z; int main(void) { a=1; b=2; c=1; printf("ax^2+bx+c=0\n "); d=b^2-4*a*c; if (d<0){printf("kyosuukai\n)} else if(d>=0) { x=(b+sqrt(b^2-4*a*c))/2*a; y=(b-sqrt(b^2-4*a*c))/2*a; if(x>=y){z=x} else if(x<y){z=y} printf("x= %f\n",z); } }

専門家に質問してみよう