関数へのポインタを引数にする方法 – プログラミング – Home

関数へのポインタを引数にする方法
 
通知
すべてクリア

[解決済] 関数へのポインタを引数にする方法


はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
Topic starter  

ニューメリカルレシピ・イン・シー(技術評論社)にある
最適化法の一つの黄金分割法(最初に極小を囲い込むためのルーチン)
のコードを試しているのですがうまくいきません。

関数
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


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

&Keisan が正解じゃないかしら


返信引用
はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
Topic starter  

επιστημηさま、お返事、
ありがとうございました。

早速試してみたのですが、以下のエラーが出てしまい、
駄目のようです。

error C2276: '&' : 仮想関数のアドレスを取ろうとしました。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

mnbrak は非メンバ関数または静的メンバ関数を求めているのに
Keisan は通常のメンバ関数だから、型が違う。だから動かない。

という説明がわからないのであれば、たぶん今それに手を出すのは早すぎる、
ってことなんだろうと思うぞ。

とりあえず Keisan が C*View のメンバである必然があるわけ?
必然がないなら非メンバにするといい。


返信引用
NowNow
 NowNow
(@NowNow)
ゲスト
結合: 20年前
投稿: 27
 

http://www.geocities.jp/ky_webid/cpp/language/034.html

この辺が参考になるかもしれません。
クラスのメンバー関数を渡そうとしているため、エラーになると思います。


返信引用
はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
Topic starter  

tetrapodさま、NowNowさま、
お返事、ありがとうございました。

tetrapodさまの仰られるとおり目的の関数が
メンバである必要は全くなく、
静的メンバ関数で宣言することで
解決することができました!

NowNowさまに至っては、参考となる
アドレスなども指摘して頂き、
大変申し訳なかったです。
まさに対処法が一番下に書かれておりました!

昨日、一日中、この問題から進めずにいたので、
やっと次の段階に進めることができます。

皆様、そして、επιστημηさまや
管理人のらららさま、
心からお礼申し上げます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました