1. 程式人生 > >omnet++ Simulation terminated with exit code: -1073741819 的一個解決方案

omnet++ Simulation terminated with exit code: -1073741819 的一個解決方案

omnet++   Simulation terminated with exit code: -1073741819

Simulation terminated with exit code: -1073741819
Working directory: E:/omnet46dev/DTOMRD
Command line: DTOMRD.exe -r 0 omnetpp.ini


Environment variables:
PATH=;E:\omnetpp-4.6\bin;E:\omnetpp-4.6\tools\win32\usr\bin;E:\omnetpp-4.6\tools\win32\mingw32\bin;E:/omnetpp-4.6/ide/jre/bin/client;E:/omnetpp-4.6/ide/jre/bin;E:/omnetpp-4.6/ide/jre/lib/i386;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\Program Files (x86)\Java\jdk1.8.0_101\bin;D:\Program Files (x86)\Java\jdk1.8.0_101\jre\bin;E:\omnetpp-4.6\tools\win32\mingw32\bin;E:\omnetpp-4.6\bin;E:\Program Files (x86)\Microsoft Visual Studio\Common\Tools\WinNT;E:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin;E:\Program Files (x86)\Microsoft Visual Studio\Common\Tools;E:\Program Files (x86)\Microsoft Visual Studio\VC98\bin;E:\omnetpp-4.6\ide;
OMNETPP_IMAGE_PATH=E:\omnetpp-4.6\images


一個原因,引用了錯誤地址的指標

包括下標越界了,定義的向量沒有指定大小就是用了,使用了一個刪除的指標(我這裡犯的一個錯誤是,將message刪除了,後面可能又用到了)。

網上還有其他的原因,什麼DLL檔案問題。但是不適用於我這裡的情況。

本來程式是能夠正常執行的,後面加了幾個向量(最開始是加的指標,懷疑是沒delete好,或者越界了,覺得找原因好麻煩,就改成向量了),改成向量後,也出現了這個問題。

在除錯的時候,發現自己設計的通道編號為幾百萬的值了,(原因是忘記從omnetpp.ini檔案中讀取通道編號)而在程式中的向量使用了這個通道編號作為下標,導致了越界訪問了。

目前還沒完全解決這個問題,先記錄下來,因為程式本來是在迴圈第9次的時候出現了這個錯誤程式碼,現在是迴圈完了(200次),出現了這個錯誤程式碼。下一段程式碼還沒怎麼執行。  但是應該能至少說明程式出錯是因為這樣的原因。

2017.2.20晚上補充的:

還是下標越界的問題

原因是在上一段程式碼中定義了 int nowNum,在這一塊程式碼中直接使用了nowNum,沒有獲得nowNum,就在向量下標中使用了,導致了這個錯誤程式碼。

但是不知道為什麼,這一段程式碼除錯的時候,無法插入斷點,或者是插入斷點沒有用,每次都是卡死了,按任何除錯快捷鍵都沒有用。先記錄在這裡。最終自己是在程式裡面加入cout輸出語句來判斷程式哪裡出問題的。

還有一個問題,雖然直接run是沒有問題了,但是在模擬結束後,在模擬介面重新run的時候,模擬也會終止,懷疑是向量沒有清空之類的原因,造成使用記憶體過大。先記錄下來。

2017.9.9補充的,關於使用了空指標報這個錯的程式碼如下:,這個程式碼是隻要收到訊息,就將向其鄰居傳送訊息:

 for(int i = 0 ; i < neighborSize1R ; i++ ){
                     Node* neighbor = this->neighbors1R[i];
                     if(usersRelayvv[num][neighbor->num] == -1)
                     {
                        //delete msg;   這裡加了這一句就報錯了,刪了這個指標,後面可能用到了這個msg
                         continue;
                     }
                     else{
                          cGate* outGate = this->gate("out");
                          cGate* inGate = neighbor->gate("in",num + 1 ); //根據id獲取門
                          if(outGate->isConnected())
                              outGate->disconnect();
                          outGate->connectTo(inGate);
                          cMessage* msgtemp= new cMessage("data");
                          msgtemp->setKind(Test_Msg);
                          send(msgtemp->dup(),"out");
                          cout<<num<<"成功給鄰居傳送訊息,鄰居編號  "<<neighbor->num<<endl;

                     }
                     delete msg;
               }