You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:52:13