1

我有一个 Mersenne twister 随机数生成器的简单包装器。目的是将生成器返回的数字(在 0 和 1 之间)缩放到参数定义的限制(开始和结束)之间。

所以我的功能是

inline float xlRandomFloat(float begin, float end) {return (begin+((end-begin)*genrand_real2()));}

我不相信 genrand_real2() 函数的实现很重要,但如果我错了,可以在这里找到

问题是函数不返回翻译结果。缩放 (乘以 (begin-end) 似乎工作正常,但似乎没有返回 begin 的添加。

因此,如果我调用 xlRandomFloat(5,10) - 我会得到 0 到 5 之间的值。

如果我使用 GDB 进行调试,并使用打印功能,那么它会显示正确的结果。所以我试着把事情分成几行,看看会发生什么

inline float xlRandomFloat(float begin, float end) {
    float ret;
    ret=(((end-begin)*genrand_real2()));
    ret+=begin;
    return ret;};

调试时,它直接从第一行跳转到 genrand_real2() 函数并完全跳过其他所有内容。这真的很令人困惑,所以我认为这可能与内联有关。我将文件从这个 .hpp 文件移动到 .cpp 并删除了 inline 关键字,一切正常。

但是为什么会出现这种行为,我该如何内联这个函数呢?此外,我不确定这是否相关,但通常当我对源代码进行更改时,我的 Make 编译会说没有什么可做的。这是不寻常的,因为通常我希望 make 能够了解源代码的变化并相应地进行重建。

有任何想法吗。

谢谢

曾娜

4

2 回答 2

1

您的代码非常好,您的编译方式一定有问题。确保您的 Makefile 具有正确的依赖关系:源文件需要依赖于它们包含的头文件。跟踪这些依赖项很少手动完成,通常只针对非常小的项目——它们通常由诸如makedepend.

要查看内联是否导致问题,只需使用-O0GCC 的 (dash capital-oh zero) 选项禁用所有优化。还要确保使用-g.

于 2009-04-21T04:21:19.207 回答
1

好的,这里有几件事在起作用。

首先,在调试时,您描述了我认为或多或少预期的行为,因为当您内联函数时,没有生成的代码与函数的 fromt 问题相匹配。所以,第一个声明是

ret=(((end-begin)*genrand_real2()));

第一步是调用genrand_real2(). 如果genrand_real2()也是内联的,那么您将在其中的第一个语句处结束,而无需停下来喘口气。

其次,确保你真的在运行你认为的代码。尝试从一个干净的目录中制作——一些 C++ 编译器会制作预编译的片段,它们会保留这些片段以加快编译速度。确保您的内联定义已从头文件中完全删除或注释掉。米

Thrd,使用内联创建一个非常简单的程序,并确保它的行为符合您的预期。

于 2009-04-21T04:41:10.970 回答