OPNET问题集锦

l         内存无效访问的情况

 

这时编程时会遇到的一个很普遍的问题,通常是由于指针的内存开辟和回收造成的,注意检查逻辑错误,利用VC联调可以很快的排查出错误。

l        

 

l         包指针为空的情况

 

这个问题也比较常见,其实和内存访问想类似。这种情况的产生是由于包没有正确的获取造成的。也有可能是数据包在某个地方已经被移除了。

l         绑定失败的情况

 

1)进程模型用到一个无法定位的外部函数,这时在进程模型编辑器中选择File->Declare External Files…,然后选中含有该外部函数的外部文件。

2)外部文件用到一个无法定位的函数,这时查看是否漏掉include 需要用到的头文件。

l         模型没有声明的情况:

 

这个例子出错的原因在于利用op_pro_create()函数创建进程的时候,没有声明子进程,需要在FileàDeclare child process modelsip_rte_central_cpu模型勾上。

 

l         函数栈不平衡的情况:

 

这种情况的发生是由于定义函数时在变量后面定义了FIN(),但是在程序结束时又没有FOUT或者FRET解决的办法两个:

(1)       补上FRET或者FOUT

(2)       也可以去掉FIN

l         字符数组过短导致文件指针出错:

 

例如对于如下的代码:


matrixName明显长度不够,但是在fopen函数调用的时候并不会出现任何的问题,使用fprintf的时候也不会 ,但是当使用fclose时,缓冲中的的内容写到文件中去时就会引发上述错误,而这个错误的出现比较隐晦,和提示并不相符,需要注意。

l         Objid无效的问题:

 

在程序中通常id的获取都是从名字获取来的,如果存储名字的字符数组没有被正确的赋值,则会出现这类错误。通常只需要检查给名字数组赋值的语句即可以很快的定位出出错的地方。

l         子进程销毁失败:

 

在子进程通过通告父进程子进程可以销毁后,通过op_pro_invoke(op_pro_parent(

op_pro_self()),OPC_NIL);通告父进程,在父进程中使用op_pro_destroy()销毁子进程时出现该错误,主要是由于此时,子进程还在被悬挂的状态而不能被销毁,只有当op_pro_invoke()函数返回之后才能执行子进程销毁。为了避免这种情况,可以在子进程的op_pro_invoke()函数执行后进行自动销毁         

 

l         状态程序执行完毕找不到出口的情况:

 

有限状态机要能够正常运行要求在任意条件下,每个状态执行完毕之后都必须发生转移,出错的情况有以下两种:

1)根本没有转移条件及相应的状态,如下图所示,这时需要增加一个红色的状态。

 

2如下图所示,当进程处于idle 状态并被调用时,条件1 和条件2 都不满足,这时需要增加一个默认的转移条件default

 

l         List的问题op_prg_list_insert (list_ptr, element_ptr, pos_index)函数要求的第二个参数是指针类型,

也就是说List中存储的值为指针!即使需要插入到list的是int类型,也需要给该元素赋值,注意,这个时候由于不同变量的内存回收方式不同,可能会导致值发生变化!!!当出现这类问题时,可能并不会直接导致error的发生,但是程序仿真结果肯定不在正确。

比如在局部函数中,将某个int型的数据以指针的方式插入到list中:

 

这种情况下肯定出错,因为一旦退出该函数后,a内存将被回收,其内存地址存储的值将不可确定!那么怎么样更改?采用如下形式:

 

注意在删除该元素的时候需要用free()函数将该内存释放掉,否则会发生内存泄漏的情况。

l         op_pk_nfd_get()读取出错:一个数据包的数据域包括intdoublepacketstructureinformation五种类型,intdouble类型的域在使用该函数访问后不会发生改变,而packetstructure两种类型一般是指针,在访问后,这两种类型的域会被置为unset的状态,如果再次使用该函数,会发生错误。避免这种情况的做法是使用op_pk_nfd_access()。

l         仿真突然停止,没有事件发生 确定是否有循环的存在,如果有,很有可能是这种情况。需要对循环条件的逻辑进行仔细分析。

l         由于Process Interfacesbegsim intrpt属性设置成了disable默认新创建的进程模型该选项都被设置为disable了。由于init状态初始时没有开始执行的条件,因此不会自动执行初始化,直到外部中断到来时,才会激励进程完成初始化。在这样的情况下,仿真不会出现任何warning或者error,但是会导致仿真结果错误。有时候,这种错误可能是隐性的,你可能根本不会发现错误的发生,而认为结果是正确的!!!

l         两个文件指针同时对一个文件进行读写的时候的问题:当两个文件指针同时以“w”方式打开文件进行写入时,会出现类似于“xxxxx内存禁止访问”错误。这时,修改文件打开方式,一个为“w”,一个为“r”方式,不会出现问题。

 

 

posted on 2010-06-11 10:21  kangwang1988  阅读(2243)  评论(0编辑  收藏  举报