omnet++: c++简单条件

Omnet++: C++ simple condition

本文关键字:条件 简单 c++ omnet++      更新时间:2023-10-16

是什么原因导致这个条件不为真而执行else

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

[edit1]根据下面的答案,我在这里添加了我试图强制条件为真的原因

下面的代码总是检查第一个条件并执行else。它在初始化中,所以它不依赖于任何先前执行的类,并且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]这是Jerzy d问的调试图片

您的问题是INETNED文件中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 (false)。