如何在OMNeT++中通过AdhocHost的finish()函数打印信息?
问题根源与解决方法
核心问题
你编写的自定义host模块类从未被仿真调用——你的NED文件里使用的是INET自带的AdhocHost模块,和你写的C++类完全没有关联,所以finish()函数根本不会被执行。
分步解决方案
1. 修改NED文件,关联自定义模块
INET的AdhocHost是一个复合模块,不能直接替换成独立的cSimpleModule(会丢失所有无线网络功能),正确做法是扩展AdhocHost并关联你的C++类:
import inet.networklayer.configurator.ipv4.Ipv4NetworkConfigurator; import inet.node.inet.AdhocHost; import inet.physicallayer.wireless.ieee80211.packetlevel.Ieee80211ScalarRadioMedium; import inet.visualizer.canvas.integrated.IntegratedCanvasVisualizer; // 自定义模块,继承AdhocHost以保留原有功能 module MyHost extends AdhocHost { @class(host); // 将模块与你的C++类绑定 } network WirelessNetwork { parameters: submodules: visualizer: IntegratedCanvasVisualizer {@display("p=100,100");} configurator: Ipv4NetworkConfigurator {@display("p=100,200");} radioMedium: Ieee80211ScalarRadioMedium {@display("p=100,300");} host[3]: MyHost {@display("p=150,300;p=250,300;p=350,300");} // 使用自定义模块 }
2. 修正C++代码的输出与语法
调整EV输出的格式(避免字符串换行的潜在问题),确保模块注册与NED匹配:
#include <omnetpp.h> using namespace omnetpp; class host : public cSimpleModule { protected : void finish() override; }; Define_Module(host); void host::finish() { // 用endl确保输出换行并刷新缓冲区 EV << "hello world !" << endl; // 如果默认输出等级被屏蔽,可改用EV_INFO强制输出 // EV_INFO << "hello world !" << endl; }
3. 确保输出等级未被屏蔽
在omnetpp.ini中添加配置,确保模块的输出能被正常显示:
# 开启所有host模块的调试输出 *.host[*].debug = true *.host[*].EV = true
内容的提问来源于stack exchange,提问作者Caillou
相关产品推荐
相关产品推荐

