2012-01-01 60 views
2

罰款,我不知道爲什麼,但在64位編譯時下面這段代碼給出了這樣的錯誤在調試模式:在OpenGL.exe未處理的異常在調試模式,但工作在發佈

未處理的異常在0x000000013f488f55 :0xC0000005: 訪問衝突讀取位置0x000000053f4d9778。

但是它在發佈模式下工作得非常好,在32位編譯時調試和發佈都很好!非常感謝幫助。

我使用Visual Studio 2010中

float g_History[20] = { 0.0f }; 
const float g_WeightModifier = 0.25f; 

void CInput::SmoothMouseMovement() 
{ 
    if(!m_SmoothMouse) return; 

    for(UINT i = 0; i < 10; i++) 
    { 
     g_History[i * 2] = g_History[(i - 1) * 2]; // This line gives the error 
     g_History[i * 2 + 1] = g_History[(i - 1) * 2 + 1]; 
    } 

    g_History[0] = m_MouseState.X; 
    g_History[1] = m_MouseState.Y; 

    float AverageX = 0.0f; 
    float AverageY = 0.0f; 
    float AverageTotal = 0.0f; 
    float WeightModifier = 1.0f; 

    for(UINT i = 0; i < 10; i++) 
    { 
     AverageX += g_History[i * 2] * WeightModifier; 
     AverageY += g_History[i * 2 + 1] * WeightModifier; 
     AverageTotal += 1.0f * WeightModifier; 
     WeightModifier *= g_WeightModifier; 
    } 

    m_MouseState.X = AverageX/AverageTotal; 
    m_MouseState.Y = AverageY/AverageTotal; 
} 
+0

任何體面的調試工具都會指出確切的線條。我建議開始使用一個。 – 2012-01-01 02:29:39

+0

@ChristianJonassen你能推薦我嗎?到目前爲止,我只使用Visual Studio中的一個。 – Traxmate 2012-01-01 03:53:03

+0

在Visual Studio中運行調試(至少版本10.0)會暫停執行,並詢問是否需要中斷或繼續。如果你不能使用它,另一個通用技巧是使用斷言來檢查它是否在一個範圍內。 – 2012-01-01 07:33:02

回答

6

第一次進入你的循環,g_History[(i - 1) * 2]將是g_History [-2]相當於,這顯然是一個壞的訪問。這只是關於如何使用32v64和debug v版本安排內存的巧合。無論您的應用程序是否崩潰,該行都是錯誤的。

+2

事實上,調試模式可能需要一定的時間才能使這些錯誤更加明顯。在發佈模式中,您只是閱讀垃圾數據。 – bdonlan 2012-01-01 02:22:09

+0

哦,哇,謝謝,我不能相信我沒有注意到......在我開始編譯之前,沒有真正關注代碼,直到我開始編譯64位代碼。 – Traxmate 2012-01-01 03:47:11