【发布时间】:2012-02-22 18:17:50
【问题描述】:
我正在研究一种来自 Numerical Recipes 的 Nelder-Mead 算法的变体,它允许用户指定要进行的目标函数调用的最大数量。
在我的主程序中,我如何调用实现 Nelder-Mead 算法的 amoeba() 函数:
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。
我的主例程#included 定义了amoeba() 例程的签名的头文件,并且编译主例程没有产生错误。但是,amoeaba() 源文件确实不包含该标头(我的一个错误),因此编译器也没有产生任何错误。
那么为什么我的链接程序仍然可以正常运行,即使参数没有按正确的顺序给出?
更新
@Binyamin Sharet,我在调用amoeba 和amoeba 之前在这里展示了这个程序集。它支持你的假设吗?
更新 2
@Binyamin Sharet 当然,这里是:
【问题讨论】:
-
它们是唯一值并且在函数内部仍然显示正确的值?
-
首先,启用警告...
-
@DanF 是的。甚至不是同一类型。 nmax 为 1000,ftol 约为 5e-5。 @yi_H,这是我启用的警告:
-Wall -Wextra -Wshadow -Wswitch-default -Wswitch-enum -Wconversion -
看看你的代码,是的,它看起来就是这样。指令
movss用于移动浮点数(在 SSE 中引入)。好像我有点不对劲,因为它将数字移动到一个特殊的寄存器,而不是协处理器堆栈,但这是同一个想法...... -
顺便说一句,你发布的第一个反汇编很好,我看错了,对不起。
标签: c compiler-construction linker