OPNET 問題集錦1

來源:互聯網
上載者:User
OPNET問題集錦

l         記憶體無效訪問的情況:

 

這時編程時會遇到的一個很普遍的問題,通常是由於指標的記憶體開闢和回收造成的,注意檢查邏輯錯誤,利用VC聯調可以很快的排查出錯誤。

l        

 

l         包指標為空白的情況:

 

這個問題也比較常見,其實和記憶體訪問想類似。這種情況的產生是由於包沒有正確的擷取造成的。也有可能是資料包在某個地方已經被移除了。

l         綁定失敗的情況:

 

(1)進程模型用到一個無法定位的外部函數,這時在進程模型編輯器中選擇File->Declare External Files…,然後選中含有該外部函數的外部檔案。

(2)外部檔案用到一個無法定位的函數,這時查看是否漏掉include 需要用到的標頭檔。

l         模型沒有聲明的情況:

 

這個例子出錯的原因在於利用op_pro_create()函數建立進程的時候,沒有聲明子進程,需要在FileàDeclare child process models將ip_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()讀取出錯:一個資料包的資料域包括int,double,packet,structure和information五種類型,int和double類型的域在使用該函數訪問後不會發生改變,而packet和structure兩種類型一般是指標,在訪問後,這兩種類型的域會被置為unset的狀態,如果再次使用該函數,會發生錯誤。避免這種情況的做法是使用op_pk_nfd_access()。

l         模擬突然停止,沒有事件發生: 確定是否有迴圈的存在,如果有,很有可能是這種情況。需要對迴圈條件的邏輯進行仔細分析。

l         由於Process Interfaces的begsim intrpt屬性設定成了disable:預設新建立的進程模型該選項都被設定為disable了。由於init狀態初始時沒有開始執行的條件,因此不會自動執行初始化,直到外部中斷到來時,才會激勵進程完成初始化。在這樣的情況下,模擬不會出現任何warning或者error,但是會導致模擬結果錯誤。有時候,這種錯誤可能是隱性的,你可能根本不會發現錯誤的發生,而認為結果是正確的!!!

l         兩個檔案指標同時對一個檔案進行讀寫的時候的問題:當兩個檔案指標同時以“w”方式開啟檔案進行寫入時,會出現類似於“xxxxx記憶體禁止訪問”錯誤。這時,修改檔案開啟檔案,一個為“w”,一個為“r”方式,不會出現問題。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.