2016-03-29 121 views
0

我想開發一個代碼(視覺工作室2012年)來控制一個移動機器人首先讀取聲納傳感器。
我創建了以下功能:調試斷言失敗在c + +

void layer1(ArRobot *robot,ArSonarDevice *sonar)// this is the avoid front collision layer 
{ 
    double range=sonar->currentReadingPolar(-50.0,50.0)-300; 
    cout<<range<<"\n"; 
    //read sonar in front (subtract robot diagonal) and if <200 act 
    if(range<200) 
    { 
     robot->setVel(-50);robot->setRotVel(50);//move backwards and rotate 
     ArUtil::sleep(200);//sleep to give time to robt to react 
    } 
} 

當我運行它(調試模式),我得到的錯誤:

Debug assertion failed program C:\Windows\system32\MSVCP110D.dll

它說表達:列表迭代器不dereferencable

我搜索網站和碰到這個: What exactly is the "Multi-threaded Debug DLL" Runtime Library option doing in VS 2008?

我確定我使用調試DLL運行時庫,但沒有區別。我檢查這個問題也和它幫助我理解爲什麼顯示此錯誤消息: Visual C++ find line causing "Debug Assertion failed"

我試圖找到確切位置在代碼中出現這種情況,發現在該行發生:

double range=sonar->currentReadingPolar(-50.0,50.0)-300; 

錯誤發生了,我想,只要我運行程序,但我添加了cout行到函數來輸出範圍,我把它放在一個連續的while循環中。我很驚訝地發現,該程序實際上讀取的是聲納範圍,沒有任何問題。它在崩潰之前多次讀取它,並且在崩潰之前數值由cout正確打印幾次。所以它沒有像我想的那樣立即崩潰。

那麼會有什麼問題呢?

+1

所以你發現錯誤是在'sonar-> currentReadingPolar'內,並決定不顯示它的代碼。你期望我們做什麼? – nwp

+0

@nwp請耐心等待我說我是新手。我沒有決定隱藏你的代碼該代碼是ARIA SDK中ArRangeDevice類的一部分。我搜索了這個類的描述,並在這裏找到它:http://www.eecs.yorku.ca/course_archive/2008-09/W/4421/docs/classArRangeDevice.html 和函數定義在這裏: http ://www.eecs.yorku.ca/course_archive/2008-09/W/4421/docs/classArRangeDevice.html#a10 和源代碼在這裏: http://www.eecs.yorku.ca/course_archive/2008-09/W/4421 /文檔/ ArRangeDevice_8cpp源。html 對不起,如果信息丟失它不是目的 –

回答

2

我會假設錯誤消息意味着它說什麼。你正試圖用迭代器來做一些非法的事情。最有可能的解除引用,一旦它被無效,或從來沒有初始化。

下面是微軟在談論這些斷言https://msdn.microsoft.com/en-us/library/aa985965.aspx

在調試器下運行程序,它會在斷言突破,你應該能夠清楚地看到你的代碼行失敗

代碼你顯示沒有任何迭代器,所以我們需要看到更多的代碼

編輯 - 似乎失敗是在提供的庫。我們假設圖書館工作。因此,您沒有正確使用它會導致失敗。因此我的猜測是您的sonar值無效。你不會顯示任何其他代碼很難說它有什麼問題

+0

@pm 100謝謝你回答好了我現在做了它我說看了調用堆棧它說沒有符號加載AriaDebugVC11.dll它說迭代器不可增量在文件c:\ program文件(x86)\ microsoft visual studio 11.0 \ vc \ include \ list但我沒有在代碼 –

+0

@pm 100中使用任何迭代器感謝回覆代碼是正確的我在32位機器上用visual studio 2008測試過它,它工作正常確切的代碼。現在,當我將它移動到vs2012時,它返回了這個錯誤,我注意到設置Vs2012的人使用AriadebugVC11,並且運行時庫設置爲多線程DLL,我將包含的文件更改爲AriaVc11,並且它的工作原因是這個錯誤沒有顯示,但是有一個不同的錯誤發生我不明白什麼是問題 –