文章目录
- Packet pointer references unowned packet(<pk_id>) 错误
- Standard function stack imbalance 错误
- Invalid Memory Access 错误
在使用 OPNET Modeler 软件时,会遇到很多奇奇怪怪的报错,这篇文章收集的是自己在使用该软件时遇到的一些错误。
Packet pointer references unowned packet(<pk_id>) 错误
该错误导致程序中断的原因截图如下图所示。
由上图可以看到,引发错误的 OPNET 核心函数是 op_pk_send(),也就是发送包的函数。
打开 OPNET Modeler 软件的产品文档,打开方式是点击任何编辑窗口 Help——>Product Decumentation,打不开可以参见文章:修改OPNET帮助文档的默认打开浏览器 & 给Edge浏览器配置IE Tab插件。
打开产品文档后,在Programmers Reference——>Discrete Event Simulation——>Packet Package下找到 op_pk_send() 函数,其描述如下图所示。
op_pk_send() 函数通过输出数据包流转发指定的数据包,在当前模拟时间内安排数据包到达目的模块,并通过调用进程释放数据包的所有权。该函数携带两个参数,第一个参数是一个 Packet* 类型的指针,第二个参数是输出包流,它是整形的。
该函数的下方还列出了使用该核心函数可能遇到的错误,如下图所示。
其中有一项就是关于本文要介绍的 Packet pointer references unowned packet(<pk_id>).。
那么该错误到底怎么解决呢,先来看看我是因为什么报错的,报错的代码部分如下。
for(i=0;i<10;i++)
{
op_pk_send(ptr,i);
}
我写这段代码是想在好几条包流上都发送一个包,但是呢,每个包都有一个独属于自己的 ID,尽管可以有多个包指针同时指向这个包,但是该包一经发送,便不可再次发送。对于不再拥有的包,不可以执行 send 和 destroy 操作,但是仍然可以执行 access 和 remove 操作。
所以该报错的解决办法就是:要么把该包发送一次,要么在每次发送之前都新创建一个包,然后发送该包。
下面的代码就是在每次发送之前创建一个格式包,然后发送该包,这样就不会报错了。
for(i=0;i<10;i++)
{
ptr = op_pk_create_fmt("aaa");
op_pk_send(ptr,i);
}
Standard function stack imbalance 错误
该错误导致程序中断的原因截图如下图所示。
出现这个错误的原因很简单,去检查一下你的函数块,每个函数体都有一个 FIN 和一个 FOUT,或者一个 FIN 和一个 FRET。如果函数没有返回值,则函数开始要有一个 FIN,函数结束时要有一个 FOUT;如果函数有返回值,则函数开始要有一个 FIN,函数体中至少有一个 FRET(当然可以有多个FRET,但是真正执行返回的只有一个)。
Invalid Memory Access 错误
该错误导致程序中断的原因截图如下图所示。
出现这个错误的原因就比较多了,一般是由于指针的不合理使用引起的,仔细检查你的程序中指针有没有越界访问等问题,比较难解决时要结合 ODB 调试慢慢找到出错的原因。调试可以参考文章:OPNET Modeler 调试简介。
以上就是OPNET出现错误的解决办法汇总,后续还会更新,希望本文提供的思路能够帮到你!