メルセンヌツイスター乱数ジェネレーターの単純なラッパーがあります。目的は、ジェネレーターによって返される数(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でデバッグし、print関数を使用すると、正しい結果が表示されます。それで私は物事を線に分けて何が起こるか見てみました
inline float xlRandomFloat(float begin, float end) {
float ret;
ret=(((end-begin)*genrand_real2()));
ret+=begin;
return ret;};
デバッグ時には、最初の行からgenrand_real2()関数に直接ジャンプし、他のすべてを完全にスキップしました。それは本当に混乱していたので、インライン化と関係があるのではないかと思いました。この.hppファイルから.cppにファイルを移動し、inlineキーワードを削除すると、すべてが正しく機能します。
しかし、なぜこの動作が発生するのでしょうか。また、この関数をどのようにインライン化できますか?また、これが適切かどうかはわかりませんが、ソースに変更を加えたときに、Makeのコンパイルで何もする必要がないと表示されることがよくあります。通常、ソースの変更を取得してそれに応じて再構築することを期待しているため、これは珍しいことです。
何か案は。
ありがとう
ゼナ