2009-04-21 7 views
1

私はメルセンヌツイスター乱数ジェネレータ用の単純なラッパーを用意しています。目的は、ジェネレータによって返された(0と1の間の)数を、引数で定義された制限(beginとend)の間に拡大することです。乱数ジェネレータラッパー(C++)のインライン動作を妨げる

だから私の機能は、私はgenrand_real2()関数の実装は重要ですが、私が間違っている場合、それは問題は関数がないですhere

を見つけることができるとは思わない

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

です翻訳結果を返さない。

xlR​​andomFloat(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にファイルを移動し、インラインキーワードを削除して、すべて正常に動作します。

しかし、なぜこの現象が発生し、この機能をインライン化することができますか?また、これが適切かどうかは確かではありませんが、ソースに変更を加えたときに、Make compilationは何もする必要がないと言います。通常、私はmakeがソースの変更を受け取り、それに応じて再構築することを期待しているので、これは珍しいことです。

アイデア

おかげ

Zenna

答えて

1

さて、ここではいくつかのことが働いています。

最初に、デバッグでは、関数をインライン化すると、関数のfromtの問題に対応するコードが生成されないため、多かれ少なかれ予想される動作として考えることができます。だから、最初の文は

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

があり、その上の最初のステップは、genrand_real2()を呼び出すことです。 genrand_real2()がでもインラインの場合、その中の最初のステートメントで終了し、息を止めることはありません。

次に、実際にあなたが思っているコードを実行していることを確認します。きれいなディレクトリから作成してみてください - あるC++コンパイラはコンパイルを高速化するためにプリコンパイルされた部分を作成します。インライン定義が完全に削除されているか、ヘッダーファイルからコメントアウトされていることを確認してください。 m

Thrdの場合、インラインで非常に簡単なプログラムを作成し、期待通りに動作していることを確認してください。

1

あなたのコードは完全に罰金です、あなたはコンパイルしている途中に何か問題がなければなりません。あなたのMakefileが適切な依存関係を持っていることを確認してください。ソースファイルは、それらがインクルードするヘッダファイルに依存する必要があります。これらの依存関係を手動で追跡することはほとんどありません。通常、非常に小さなプロジェクトの場合のみです。通常はmakedependなどのツールで生成されます。

インライン化で問題が発生しているかどうかを確認するには、GCCで-O0(ダッシュ・キャピタル・ゼロ)オプションを使用してすべての最適化を無効にします。 -gでデバッグシンボルを有効にしてください。

+0

ありがとうございました あなたは正しいです。私はcodeblocksで構築し、正しく動作します。現時点では、私は以下の構造を有する: すべて:$(SOURCES)$(実行) $(実行):$(OBJECTS) $(CC)$(LDFLAGS)$(OBJECTS)-o $ @ .cpp.o: $(CFLAGS)$ <-o $ @ あなたが言ったように、ヘッダーの依存関係を含めるようにしようとしていますが、依存関係はMakeが再コンパイルするようにヘッダーが変更されていますが、すべてを最初から再構築すれば、どのように違いが生まれますか? – zenna

関連する問題