プロが教える店舗&オフィスのセキュリティ対策術

参考にしたいある関数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になっていましたが),そうは行かなかったようなのです.

長い質問文で失礼しますが,よろしくお願いいたします.

A 回答 (1件)

float (*func)();


の部分を
float (*func)(float);
とすることで期待するように(225に)なりました
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました.私も修正後,255になったことを確認できました.

ということは,関数へのポインタの宣言では,「float (*func)(float);」のように引数の型を入れる必要があったのですね.(参考にしていたCの本では,たまたま()のように引数が空欄になっていましたので,そのまま記述してしまっていました.)

おかげさまで助かりました.

お礼日時:2004/12/24 14:37

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