All++:C++ 简单条件
Omnet++: C++ simple condition
条件不成立执行else的可能原因是什么
IPassiveQueue *queueModule = nullptr;
queueModule = nullptr;
if (queueModule == nullptr) {...}
else {...}
[edit1] 根据下面的答案,我在这里添加我试图强制条件为真的原因
下面的代码总是检查第一个条件并执行其他条件。它处于初始化状态,因此它不依赖于任何先前执行的 class 并且 queueModule 成员在 class 定义中设置为受保护成员
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.
您的问题是 INET
.
的 NED
文件中 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
的值,所以没有queue子模块,参数queueModule
为空串。读取空字符串的 [0]
元素结果为 0(假)。
条件不成立执行else的可能原因是什么
IPassiveQueue *queueModule = nullptr;
queueModule = nullptr;
if (queueModule == nullptr) {...}
else {...}
[edit1] 根据下面的答案,我在这里添加我试图强制条件为真的原因
下面的代码总是检查第一个条件并执行其他条件。它处于初始化状态,因此它不依赖于任何先前执行的 class 并且 queueModule 成员在 class 定义中设置为受保护成员
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.
您的问题是 INET
.
的 NED
文件中 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
的值,所以没有queue子模块,参数queueModule
为空串。读取空字符串的 [0]
元素结果为 0(假)。