2016-11-14 50 views
-4

可能是什麼,這種情況是不正確的,否則被執行的原因OMNET ++:C++簡單的條件

IPassiveQueue *queueModule = nullptr;  
queueModule = nullptr; 
    if (queueModule == nullptr) {...} 
    else {...} 

[EDIT1]基於答案下面我在這裏增加的背後,爲什麼我的原因試圖強制條件爲真

下面的代碼始終檢查第一個條件並執行其他。它在初始化所以它不依賴於任何先前的執行類和queueModule件類定義設置爲保護成員

class INET_API EtherMACBase : public MACBase 
{virtual void initializeQueueModule(); 
IPassiveQueue *queueModule = nullptr; 
...} 

void EtherMACBase::initializeQueueModule() 
{ 
    queueModule = nullptr; 
    if (par("queueModule").stringValue()[0]) {...} 

    else {...} 

} 

而在這種情況下,雖然參數設置爲相同

條件爲真
class INET_API PPP : public MACBase 
{ 
    protected: 
    IPassiveQueue *queueModule = nullptr; 
    virtual void initialize(int stage) override; 
    ... 
} 

void PPP::initialize(int stage) 
{ 
    queueModule = nullptr; 
    if (par("queueModule").stringValue()[0]) {...} 

    else {...} 
} 

[EDIT2]This picture for Debugging asked by Jerzy D.

+5

請提供[mcve]。錯誤不能只在您發佈的代碼位中。 – Angew

+0

可能你忘了重建或部署與代碼對應的新鮮二進制文件。 – nikitoz

+0

目前沒有理由,如果'else'塊可以在這裏執行,我不認爲任何人會使用C++。 – George

回答

2

你的問題是PPP默認隊列類型的不同聲明和以太網接口的結果文件在INET
看看這兩個文件:src/inet/linklayer/ppp/PPPInterface.nedsrc/inet/linklayer/ethernet/EthernetInterface.ned。這些文件的關鍵部分如下。

module PPPInterface like IWiredNic 
{ 
    parameters: 
     string queueType = default("DropTailQueue"); 
    submodules: 
     queue: <queueType> like IOutputQueue if queueType != "" { 
     } 
     ppp: PPP { 
      parameters: 
       queueModule = (queueType == "" ? "" : "^.queue"); 
     } 
} 

module EthernetInterface like IWiredNic 
{ 
    parameters: 
     string queueType = default(""); 
    submodules: 
     queue: EtherQoSQueue if queueType != "" { 
     } 
     mac: <macType> like IEtherMAC { 
      parameters: 
       queueModule = (queueType == "" ? "" : "^.queue"); 
     } 
} 

可以注意到,PPPInterface具有分配的缺省值queueType參數,並且因此存在一個隊列子模塊以及參數queueModule不爲空。
但是,EthernetInterface的值不是queueType,所以沒有隊列子模塊,並且參數queueModule是空字符串。讀取[0]空字符串的元素會導致0(false)。

+0

感謝您的回答,這是有幫助的,我明白,外部隊列是空的或根本看不到,但我不知道是什麼原因,仍然不知道爲什麼強迫條件是真實的,它仍然是假。如果我在同一主題中有進一步的問題,我是否應該提出新問題或再次編輯我的問題或將問題發送給答案? –

+0

1.你在哪個文件中寫過這個條件?你能展示整個方法嗎?是的,你應該成爲一個新的問題。 –

+0

我發現我不能提出新的問題,因爲我得到了這個問題的負面反饋。我現在只能在2天后問。 「我不知道是否有解決方案?」。我在上面解釋過的初始化中強制它在'MACEtherBase.cc'中是真的。我用那行'if(queueModule == nullptr)'替換那行'if(par(「queueModule」)。stringValue()[0])''。 –