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