Я работаю над вариантом алгоритма Нелдера-Мида из Числовые рецепты , который позволил бы пользователю указать максимальное количество вызовов целевой функции, которое будет сделано.
Из моей основной процедуры, вот как я вызываю функцию amoeba()
, которая реализует алгоритм Nelder-Mead:
amoeba(p,y,params->ndim,params->tol,params->nmax,internal_funk,&nfunc);
Но вот как это реализовано:
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
. Поддерживает ли это вашу гипотезу?
amoeba">
amoeba">
ОБНОВЛЕНИЕ 2
@ Биньямин Шарет уверен, вот оно: