2012-02-22 29 views
4

私は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) { 
.... 
} 

お知らせ関数呼び出しでnmaxftol引数を反転しました。

驚いたことに、amoeba()は依然としてです。デバッガでこれを実行すると、正しい値がnmaxftolに割り当てられていることが確認されます。

私のメインルーチン#include d amoeba()ルーチンの署名を定義し、メインルーチンをコンパイルするヘッダーファイルにはエラーは発生しませんでした。しかし、amoeaba()ソースファイルはではなく、にそのヘッダ(私の間違い)が含まれているため、コンパイラはエラーも発生しませんでした。

私のリンクされたプログラムは、正しい順序で引数が与えられていなくても、どのように機能するのでしょうか?

UPDATE

@Binyamin Sharetは、私は右amoebaへの呼び出し前とamoebaにここにアセンブリを示しています。あなたの仮説を支持していますか?

Before call to <code>amoeba</code>

Inside <code>amoeba</code>

UPDATE 2

@Binyamin Sharet確か、ここにある:

enter image description here

+1

これらは固有の値で、関数内に正しい値を示していますか? –

+0

まず、警告を有効にしてください... –

+0

@ DanFはい。同じ種類でもありません。 nmaxは1000、ftolは約5e-5である。 @yi_H、ここに私が有効にした警告があります: '-Wall -Wextra -Wshadow -Wswitch-default -Wswitch-enum -Wconversion' – lindelof

答えて

6

理由はおそらく、浮動小数点パラメータので、通過していないスタック上ではなくコプロセッサスタック上にあるので、これら2つの順序は関係ありませんでした。あなたはnmaxftolを切り替えると、スタック上の順序が同じになるので

|   p    |        | 
    |   y    |        | 
    |   ndim   |        | 
    |   nmax   |        | 
    |   funk   |        | 
    |   nfunk   |   ftol    | 
    +------------------------+-----------------------------+ 
    |  stack   |  coprocessor stack | 

それは、問題ではありませんでした、とamoeba試行:

例えば

は、この関数は、引数の順を期待しますそれらを読むためには、同じ理由で混乱することはありません。


編集解体を読む

は、私は少し離れたことを示しているが、理由SSEのフロート変数を渡すために使用される命令を使用すると、両方のassemblt一覧で見ることができるmovss、あること(発信者の)xmm0登録に1回、(着信音の)xmm0から1回追加しました。 コプロセッサースタックxmmレジスタと置き換えることができます。これはあなたの状況です。

+2

言うまでもなく、これは偶然にしか働いていません。ほとんどの場合、別のプラットフォームで動作しませんでした。 – CAFxX

+0

私は絶対に同意します。「あなたは幸運でした」と書いたかったのですが、とてもラッキーです。おそらくチャンスはそのための正しい言葉です。 – MByD

+0

Well ...私は単体テストでこれを見つけましたが、実際のコードは浮動小数点のハードウェアサポートを持たない組み込みプラットフォーム上で動作します... woops ;-) – lindelof

関連する問題