Omnet++ 在子 Class 中设置参数并在另一个子 Class 中调用它时出错
Omnet++ Error setting parameter in child Class and calling it in another child Class
我正在尝试在子 class 的 PassiveQueueBase 中设置一个参数,并在另一个子 class PriorityScheduler 用于基础 Class IPassiveQueue.
PriorityScheduler 继承自 SchedulerBase,它有一个指针 (inputQueue) 指向 IpassiveQueue 类型的人,并将调用 PacketEnqueued() 函数给 PriorityScheduler。这显示在这段代码中
class INET_API SchedulerBase : public cSimpleModule, public IPassiveQueue, public IPassiveQueueListener
{
public:
virtual void packetEnqueued(IPassiveQueue *inputQueue) override;
};
注: IpassiveQueue.h没有.cc文件,它是许多其他classes的接口文件。
我尝试做的事情如下所示,
class INET_API IPassiveQueue
{
public:
simtime_t sendWindowStart;
simtime_t sendWindowEnd;
virtual void setWindows() {};
};
class INET_API PassiveQueueBase : public cSimpleModule, public IPassiveQueue
{ protected:
void setWindows(simtime_t SWS,simtime_t SWE);
};
void PassiveQueueBase :: setWindows(simtime_t SWS,simtime_t SWE)
{ SWS = 3; SWE = 4;
sendWindowStart = SWS;
sendWindowEnd = SWE;
};
bool PriorityScheduler::schedulePacket()
{
IPassiveQueue *pqueue;
pqueue->setWindows();
sendWindowStart = inputQueue->sendWindowStart;
sendWindowEnd = inputQueue->sendWindowEnd;
}
我在运行模拟时出错,如下图
Simulation terminated with exit code: 139 Working directory:
/home/usrname/omnetpp-5.0/samples/inet/examples/mysimulation Command line:
opp_run -r 0 -n ..:../../src:../../tutorials -l ../../src/INET
--debug-on-errors=false omnetpp.ini
而且我在这一行上有感叹号
pqueue->setWindows();
附上这张便条
‘Pqueue’ may be used uninitialized in this function
[-Wmaybe-uninitialized]
你还没有分配pqueue
,你正在使用它
IPassiveQueue *pqueue;
这个仍然指向内存中的未知位置。
要解决此问题,您可以使用 new
分配它
IPassiveQueue *pqueue = new IPassiveQueue;
并确保使用 delete
删除它
delete pqueue;
也可以使用智能指针分配,这样更安全
std::unique_ptr<IPassiveQueue> pqueue(new IPassiveQueue);
好吧,我考虑过使用 inputQueue 本身作为指针,而不是在与子 class 完全相同但为空的函数上创建新指针,但它起作用了。
class INET_API PriorityScheduler : public SchedulerBase
{
protected:
virtual bool schedulePacket() override;
simtime_t sendWindowStart;
simtime_t sendWindowEnd;
simtime_t SWS;
simtime_t SWE;
};
bool PriorityScheduler::schedulePacket()
{
inputQueue->setWindows( SWS, SWE);
sendWindowStart = inputQueue->sendWindowStart;
sendWindowEnd = inputQueue->sendWindowEnd;
}
class INET_API IPassiveQueue
{
public:
simtime_t sendWindowStart;
simtime_t sendWindowEnd;
virtual void setWindows(simtime_t SWS,simtime_t SWE) {};
}
class INET_API PassiveQueueBase : public cSimpleModule, public IPassiveQueue
{
protected:
virtual void setWindows(simtime_t SWS,simtime_t SWE) {};
}
void PassiveQueueBase::setWindows(simtime_t SWS,simtime_t SWE)
{ SWS = 1; SWE=5;
sendWindowStart = SWS;
sendWindowEnd = SWE;
}
我正在尝试在子 class 的 PassiveQueueBase 中设置一个参数,并在另一个子 class PriorityScheduler 用于基础 Class IPassiveQueue.
PriorityScheduler 继承自 SchedulerBase,它有一个指针 (inputQueue) 指向 IpassiveQueue 类型的人,并将调用 PacketEnqueued() 函数给 PriorityScheduler。这显示在这段代码中
class INET_API SchedulerBase : public cSimpleModule, public IPassiveQueue, public IPassiveQueueListener
{
public:
virtual void packetEnqueued(IPassiveQueue *inputQueue) override;
};
注: IpassiveQueue.h没有.cc文件,它是许多其他classes的接口文件。
我尝试做的事情如下所示,
class INET_API IPassiveQueue
{
public:
simtime_t sendWindowStart;
simtime_t sendWindowEnd;
virtual void setWindows() {};
};
class INET_API PassiveQueueBase : public cSimpleModule, public IPassiveQueue
{ protected:
void setWindows(simtime_t SWS,simtime_t SWE);
};
void PassiveQueueBase :: setWindows(simtime_t SWS,simtime_t SWE)
{ SWS = 3; SWE = 4;
sendWindowStart = SWS;
sendWindowEnd = SWE;
};
bool PriorityScheduler::schedulePacket()
{
IPassiveQueue *pqueue;
pqueue->setWindows();
sendWindowStart = inputQueue->sendWindowStart;
sendWindowEnd = inputQueue->sendWindowEnd;
}
我在运行模拟时出错,如下图
Simulation terminated with exit code: 139 Working directory: /home/usrname/omnetpp-5.0/samples/inet/examples/mysimulation Command line: opp_run -r 0 -n ..:../../src:../../tutorials -l ../../src/INET --debug-on-errors=false omnetpp.ini
而且我在这一行上有感叹号
pqueue->setWindows();
附上这张便条
‘Pqueue’ may be used uninitialized in this function [-Wmaybe-uninitialized]
你还没有分配pqueue
,你正在使用它
IPassiveQueue *pqueue;
这个仍然指向内存中的未知位置。
要解决此问题,您可以使用 new
IPassiveQueue *pqueue = new IPassiveQueue;
并确保使用 delete
delete pqueue;
也可以使用智能指针分配,这样更安全
std::unique_ptr<IPassiveQueue> pqueue(new IPassiveQueue);
好吧,我考虑过使用 inputQueue 本身作为指针,而不是在与子 class 完全相同但为空的函数上创建新指针,但它起作用了。
class INET_API PriorityScheduler : public SchedulerBase
{
protected:
virtual bool schedulePacket() override;
simtime_t sendWindowStart;
simtime_t sendWindowEnd;
simtime_t SWS;
simtime_t SWE;
};
bool PriorityScheduler::schedulePacket()
{
inputQueue->setWindows( SWS, SWE);
sendWindowStart = inputQueue->sendWindowStart;
sendWindowEnd = inputQueue->sendWindowEnd;
}
class INET_API IPassiveQueue
{
public:
simtime_t sendWindowStart;
simtime_t sendWindowEnd;
virtual void setWindows(simtime_t SWS,simtime_t SWE) {};
}
class INET_API PassiveQueueBase : public cSimpleModule, public IPassiveQueue
{
protected:
virtual void setWindows(simtime_t SWS,simtime_t SWE) {};
}
void PassiveQueueBase::setWindows(simtime_t SWS,simtime_t SWE)
{ SWS = 1; SWE=5;
sendWindowStart = SWS;
sendWindowEnd = SWE;
}