ニューメリカルレシピ・イン・シー(技術評論社)にある
最適化法の一つの黄金分割法(最初に極小を囲い込むためのルーチン)
のコードを試しているのですがうまくいきません。
関数
void mnbrak(double *ax, double *bx, double *cx,
double *fa, double *fb, double *fc, double (*func)(double));
に対して、
mnbrak(&ax,&bx,&cx,&fa,&fb,&fc,Keisan);
と呼び出しているのですが、以下のエラーが出てしまいます。
「error C2664: 'mnbrak' : 7 番目の引数を 'double (double)' から
'double (__cdecl *)(double)' に変換できません。 」
Keisanは2乗を行う関数で次のものです。
double CDVAppView::Keisan(double x)
{
return x*x;
}
関数へのポインタを引数として「Keisan」としているのですが、
間違っているのでしょうか。
よろしくお願い致します。
環境
Visual Stadio 6.0
Windows XP Home Eddition
&Keisan が正解じゃないかしら
επιστημηさま、お返事、
ありがとうございました。
早速試してみたのですが、以下のエラーが出てしまい、
駄目のようです。
error C2276: '&' : 仮想関数のアドレスを取ろうとしました。
mnbrak は非メンバ関数または静的メンバ関数を求めているのに
Keisan は通常のメンバ関数だから、型が違う。だから動かない。
という説明がわからないのであれば、たぶん今それに手を出すのは早すぎる、
ってことなんだろうと思うぞ。
とりあえず Keisan が C*View のメンバである必然があるわけ?
必然がないなら非メンバにするといい。
http://www.geocities.jp/ky_webid/cpp/language/034.html
この辺が参考になるかもしれません。
クラスのメンバー関数を渡そうとしているため、エラーになると思います。
tetrapodさま、NowNowさま、
お返事、ありがとうございました。
tetrapodさまの仰られるとおり目的の関数が
メンバである必要は全くなく、
静的メンバ関数で宣言することで
解決することができました!
NowNowさまに至っては、参考となる
アドレスなども指摘して頂き、
大変申し訳なかったです。
まさに対処法が一番下に書かれておりました!
昨日、一日中、この問題から進めずにいたので、
やっと次の段階に進めることができます。
皆様、そして、επιστημηさまや
管理人のらららさま、
心からお礼申し上げます。