私はNumerical RecipesからNelder-Meadアルゴリズムのバリエーションを開発しています。これにより、ユーザーはターゲット関数呼び出しの最大数を指定できます。私のメインルーチンから2つのパラメータを逆にしても、この関数が呼び出されるのはなぜですか?
は、ここで私はネルダー・ミードアルゴリズムを実装しamoeba()
関数を呼び出す方法です:
amoeba(p,y,params->ndim,params->tol,params->nmax,internal_funk,&nfunc);
しかし、ここではそれが実現してしまった方法である:I
void amoeba(float **p, float y[], int ndim, unsigned nmax, float ftol, float (*funk)(float []), int *nfunk) {
....
}
お知らせ関数呼び出しでnmax
とftol
引数を反転しました。
驚いたことに、amoeba()
は依然としてです。デバッガでこれを実行すると、正しい値がnmax
とftol
に割り当てられていることが確認されます。
私のメインルーチン#include
d amoeba()
ルーチンの署名を定義し、メインルーチンをコンパイルするヘッダーファイルにはエラーは発生しませんでした。しかし、amoeaba()
ソースファイルはではなく、にそのヘッダ(私の間違い)が含まれているため、コンパイラはエラーも発生しませんでした。
私のリンクされたプログラムは、正しい順序で引数が与えられていなくても、どのように機能するのでしょうか?
UPDATE
@Binyamin Sharetは、私は右amoeba
への呼び出し前とamoeba
にここにアセンブリを示しています。あなたの仮説を支持していますか?
UPDATE 2
@Binyamin Sharet確か、ここにある:
これらは固有の値で、関数内に正しい値を示していますか? –
まず、警告を有効にしてください... –
@ DanFはい。同じ種類でもありません。 nmaxは1000、ftolは約5e-5である。 @yi_H、ここに私が有効にした警告があります: '-Wall -Wextra -Wshadow -Wswitch-default -Wswitch-enum -Wconversion' – lindelof