2017-01-03 2 views
2

使用されるバージョンでは異なる結果:OMNeT ++ 5.0INET 3.4.0OMNeT ++:「速い」または「表現」モード

と私は私の「ステップ・バイで信頼性の高い結果が得られるいくつかのコードを、作成しましたステップ・アンド・アニメート・シミュレーション・モードです。私が「高速」モードまたは「エクスプレス」モードに変わると、バギーになります。以下の簡単な例では、私の問題を説明します:


void MyMacSlave::handleSelfMessage(cMessage *msg) 
{ 
    if (msg == CheckAck) { 
     std::cout << “CheckAck: “ << msg << std::endl; 
    } 

    if (msg == transmissionAnnouncement) { 
     std::cout << “transmissionAnncouncement: “ << msg << std::endl; 
    } 

    if (msg == transmissionEvent) { 
     std::cout << “transmissionEvent: “ << msg << std::endl; 
    } 

    delete msg; 
} 

は、自己のメッセージを処理するために呼び出される関数、があります。私が得た自己メッセージに応じて、異なるifクエリを実行する必要があります。

私はステップバイステップやアニメーションモードで正しい出力を得る:

CheckAck: (omnetpp::cMessage)CheckAck 
transmissionAnncouncement: (omnetpp::cMessage)transmissionAnncouncement 
transmissionEvent: (omnetpp::cMessage)transmissionEvent 

をそして、これは私が高速またはエクスプレスモードを使用して取得する奇妙な出力である。第3の出力

CheckAck: (omnetpp::cMessage)CheckAck 
transmissionAnncouncement: (omnetpp::cMessage)transmissionAnncouncement 
transmissionAnncouncement: (omnetpp::cMessage)transmissionEvent 
transmissionEvent: (omnetpp::cMessage)transmissionEvent 

transmissionEvent」というメッセージが表示されますが、「if(msg == transmissionAnnouncement)」も誤って真と見なされます。


私の上に示されているように、私が使用していますシミュレーションモードに応じて、さまざまなシミュレーション結果を得ることができます。異なる出力の理由は何ですか?どうして違いがありますか?

+1

ポインタを比較しています。つまり、受信したメッセージが、既知のメッセージが割り当てられた場所と同じ場所に割り当てられたメモリを使用しているかどうかを確認しています。これは本質的に間違っているのではなく、危険に満ちている。たとえば、「transmissionEvent」が割り当てられたメモリを既に割り当て解除している可能性があります。メモリチェッカー(Valgrindなど)がそのことを明らかにするのに役立つかもしれません。より安全な代替手段は、メッセージの種類やクラスをチェックすることです。 –

+0

あなたはそうです。問題はポインタを削除して新しいポインタを定義することと関係していることが分かりました。メッセージの種類の使用に関するあなたの提案は非常に便利で、私のコードはすべてのモードで現在動作しています。 しかし、私はまだ、最初にモードの違いがあった理由を理解していません。 –

+0

私はあなたのプログラムが自由に割り当てを解除されたメモリを再利用できるので、あなたのコードがいくつかの条件の下で動作したと仮定します。つまり、シーケンス 'int * a = new int;削除a;/* ... */int * b =新しいint; assert(a == b); 'は、2つのポインタaとbが同じメモリ位置を指し示すようにすることができます。もちろん、異なるコードが2つのコードの半分の間で実行されている場合(たとえば、高速モードまたは高速モードで実行されているOMNeT ++)に変更される可能性があります。 –

答えて

0

ChristophとRudiは、メモリ割り当てに問題があると述べています。ポインタが割り当て解除され、新しいメモリが同じメモリに割り当てられると、何か問題が発生します。異なる走行モードの使用に関する違いは、その旨の誤りがあるという兆候に過ぎない。私の場合

ではなく、もともとqeustionで使用される方法の

if (msg->getKind() == checkAckAckType) { 

ようなメッセージの種類をチェックするために有用でした。私は単純なenumを使ってメッセージの種類を定義しました。