Omnet ++:C ++简单条件

时间:2016-11-14 11:28:31

标签: c++ omnet++ inet

这可能是因为这个条件不正确而且执行了

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.

1 个答案:

答案 0 :(得分:2)

您的问题是NEDINET个文件中PPP和以太网接口的默认队列类型声明不同的结果。
请查看以下两个文件: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(错误)。