今天加載一個3ds模型,運行時提示說
Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted.
明明以前都好用了的,納悶得很。
仔細查看了下代碼,發現了一處錯誤.
請看代碼:
// 下面的函數讀出3ds文件的主要部分
void C3ds::ProcessNextChunk(t3DModel *pModel, tChunk *pPreviousChunk)
{
t3DObject newObject = {0}; // 用來添加到對象鏈表
tMaterialInfo newTexture = {0}; // 用來添加到材質鏈表
unsigned int version[10] = {0}; // 保存文件版本 注意:此處以前為unsigned int version10 = 0; 之所以發生那個錯誤,原因是
這里只聲明了一個變量,下面卻那他的地址當讀取文件的目的地址
當讀取字節數超過4時,就會引起上面那個錯誤。
int buffer[50000] = {0}; // 用來跳過不需要的數據
m_CurrentChunk = new tChunk; // 為新的塊分配空間
// 下面每讀一個新塊,都要判斷一下塊的ID,如果該塊是需要的讀入的,則繼續進行
// 如果是不需要讀入的塊,則略過
// 繼續讀入子塊,直到達到預定的長度
while (pPreviousChunk->bytesRead < pPreviousChunk->length)
{
// 讀入下一個塊
ReadChunk(m_CurrentChunk);
// 判斷塊的ID號
switch (m_CurrentChunk->ID)
{
case VERSION: // 文件版本號
// 在該塊中有一個無符號短整型數保存了文件的版本
// 讀入文件的版本號,并將字節數添加到bytesRead變量中
m_CurrentChunk->bytesRead += fread(&version, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
// 如果文件版本號大于3,給出一個警告信息
if (version[0] > 0x03) // 注意:此處原為version0 > 0x03
MessageBox(NULL, "This 3DS file is over version 3 so it may load incorrectly", "Warning", MB_OK);
break;
case OBJECTINFO: // 網格版本信息
// 讀入下一個塊
ReadChunk(m_TempChunk);
// 獲得網格的版本號
m_TempChunk->bytesRead += fread(&version, 1, m_TempChunk->length - m_TempChunk->bytesRead, m_FilePointer);
// 增加讀入的字節數
m_CurrentChunk->bytesRead += m_TempChunk->bytesRead;
// 進入下一個塊
ProcessNextChunk(pModel, m_CurrentChunk);
break;
case MATERIAL: // 材質信息
// 材質的數目遞增
pModel->numOfMaterials++;
// 在紋理鏈表中添加一個空白紋理結構
pModel->pMaterials.push_back(newTexture);
// 進入材質裝入函數
ProcessNextMaterialChunk(pModel, m_CurrentChunk);
break;
case OBJECT: // 對象的名稱
// 該塊是對象信息塊的頭部,保存了對象了名稱
// 對象數遞增
pModel->numOfObjects++;
// 添加一個新的tObject節點到對象鏈表中
pModel->pObject.push_back(newObject);
// 初始化對象和它的所有數據成員
memset(&(pModel->pObject[pModel->numOfObjects - 1]), 0, sizeof(t3DObject));
// 獲得并保存對象的名稱,然后增加讀入的字節數
m_CurrentChunk->bytesRead += GetString(pModel->pObject[pModel->numOfObjects - 1].strName);
// 進入其余的對象信息的讀入
ProcessNextObjectChunk(pModel, &(pModel->pObject[pModel->numOfObjects - 1]), m_CurrentChunk);
break;
case EDITKEYFRAME:
// 跳過關鍵幀塊的讀入,增加需要讀入的字節數
m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
break;
default:
// 跳過所有忽略的塊的內容的讀入,增加需要讀入的字節數
m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
break;
}
// 增加從最后塊讀入的字節數
pPreviousChunk->bytesRead += m_CurrentChunk->bytesRead;
}
// 釋放當前塊的內存空間
delete m_CurrentChunk;
m_CurrentChunk = pPreviousChunk;
}
我想大家對這段代碼都很熟悉,不知大家是否也遇見過跟我類似的問題,也不知道我說明白了問題沒有,只希望對大家有所幫助O(∩_∩)O 。