这可能是因为这个条件不正确而且执行了
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 {...}
}
答案 0 :(得分:2)
您的问题是NED
中INET
个文件中PPP和以太网接口的默认队列类型声明不同的结果。
请查看以下两个文件:src/inet/linklayer/ppp/PPPInterface.ned
和src/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(错误)。