c++ - 来自随机数生成器包装器 (C++) 的令人困惑的内联行为

标签 c++ c random inline

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

所以我的功能是

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

我不认为 genrand_real2() 函数的实现很重要,但如果我错了,可以找到它 here

问题是函数不返回翻译结果。缩放(乘以(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 接受源中的更改并相应地重建。

任何想法。

谢谢

珍娜

最佳答案

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

首先,关于调试,您描述了我认为或多或少预期的行为,因为当您内联一个函数时,没有生成代码来处理函数的原始问题。所以,第一个声明是

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

第一步是调用 genrand_real2()。如果 genrand_real2() 也是内联的,那么您会在其中的第一条语句处结束,没有停下来喘口气。

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

第三,制作一个带有内联的非常简单的程序,并确保它的行为符合您的预期。

关于c++ - 来自随机数生成器包装器 (C++) 的令人困惑的内联行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/771012/

相关文章:

c++ - 安装 visual studio 2013 后 visual studio 2012 崩溃

c - 通过 C 中的 for 循环将字母表附加到数组

excel - 我可以使用 Excel 函数从句子中生成随机单词吗?

java - 位图从右侧随机出现的游戏

c++ - 比较 int 的正向和反向循环,其中一个限制为 0

c++ - Pe编辑库?

c++ - 如何构建 VS 2010 的 C 运行时库?

c - 粘贴字符作为标记

c - 如何将 C 中的 unix 时间戳作为 int 获取?

mysql - mysql中有字段函数时如何使用随机函数