OMNeT++5.6.2自定义NED函数报错缺失Define_NED_Function咨询
OMNeT++自定义NED字符串重复函数报错排查与修正
代码存在的具体问题
- 宏绑定的函数名不匹配
实现的C函数名为nedf_repeatstr,但调用Define_NED_Function宏时,第一个参数传入的是ned_repeatstr,两个名称完全不一致,导致宏展开后注册的NED函数符号和实际实现的函数无法关联,链接阶段找不到对应入口,直接触发“define_ned_function() missing from c”的报错。 - 操作方式不符合开发规范
直接编辑OMNeT安装目录下src/sim/nedfunctions.cc属于修改模拟器核心代码,必须重新编译整个OMNeT核心才能生效,操作失误会导致核心功能异常,后续框架升级、环境重置时所有修改都会丢失,不适合自定义功能开发。 - 函数实现存在逻辑瑕疵
- 重复初始化两个变量为同一个入参值,属于冗余代码;
- 未处理重复次数小于等于0的异常场景,返回值不符合预期;
- 缺少基础入参校验,遇到非法入参时无明确错误提示。
修正方案
修改核心源码场景的修正代码
在你改动的nedfunctions.cc文件中,将原有代码替换为如下可正常编译的版本:
cNedValue nedf_repeatstr(cComponent *contextComponent, cNedValue argv[], int argc) { // 入参合法性校验 if (argc != 2 || argv[0].getType() != cNedValue::STRING || argv[1].getType() != cNedValue::INT) { throw cRuntimeError("repeatstr: 需要两个入参:字符串s、重复次数n"); } std::string baseStr = argv[0].stdstringValue(); int repeatTimes = argv[1].intValue(); // 处理重复次数非正的场景 if (repeatTimes <= 0) { return std::string(""); } std::string result; result.reserve(baseStr.size() * repeatTimes); for (int i = 0; i < repeatTimes; i++) { result += baseStr; } return result; } // 宏第一个参数必须和上述实现的C++函数名完全一致 Define_NED_Function(nedf_repeatstr, "string repeatstr(string s, int n)");
代码修改完成后,必须重新编译OMNeT++核心源码,替换原有动态库,否则运行的仍是旧版本核心,无法识别新增的函数。
非侵入式推荐实现方式
无需改动OMNeT安装目录下的任何核心文件,仅需在自身INET工程内新增独立的C源文件,写入上述修正后的函数与宏定义,将该文件加入工程编译列表即可。工程启动时会自动注册自定义NED函数,不受OMNeT++版本升级、环境重置影响,也不会破坏核心运行环境。
内容的提问来源于stack exchange,提问作者Michelangelo Libertella
相关产品推荐
相关产品推荐

