• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小星星的天空

            O(∩_∩)O 小月亮的fans ^_^

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              16 隨筆 :: 0 文章 :: 61 評(píng)論 :: 0 Trackbacks

            今天加載一個(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  。

            posted on 2009-05-03 10:46 Little Star 閱讀(6521) 評(píng)論(7)  編輯 收藏 引用 所屬分類(lèi): Computer Graphics

            評(píng)論

            # re: 關(guān)于3ds讀取文件中一處錯(cuò)誤的改正——Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted 2009-05-03 11:38 OwnWaterloo
            Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted。
            這個(gè)錯(cuò)誤信息描述不太準(zhǔn)確。
            其意思是,msvc在debug下為棧上自動(dòng)變量周?chē)峙淞艘恍┍Wo(hù)空間。
            如果發(fā)生棧溢出, 就會(huì)寫(xiě)到保護(hù)空間上去。
            這樣, 棧溢出就能被檢查出來(lái), 并且告訴程序員, 某個(gè)變量附近的??臻g被破壞(腐壞?)了。


            所以要重現(xiàn)這個(gè)錯(cuò)誤只要這樣:
            int a[1212];
            a[1986] = 0;

            或者, 樓主的代碼與下面更類(lèi)似:
            int i;
            (&i)[ 1 ] = 0; // 取i的地址, 將其作為數(shù)組傳遞給fread。
            // 但其實(shí)這個(gè)“數(shù)組”, 只有一個(gè)元素。 也會(huì)發(fā)生溢出

            要修改, 要么一次只讀取一個(gè)version。
            要么將version改到合適大小(10就能保證一定不溢出嗎?)


              回復(fù)  更多評(píng)論
              

            # re: 關(guān)于3ds讀取文件中一處錯(cuò)誤的改正——Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted 2009-05-03 15:02 shongbee2
            弱弱問(wèn)問(wèn),您讀3DS文件是不是自己寫(xiě)的?可以給我一個(gè)嗎?我現(xiàn)在正在學(xué)?我對(duì)里面的文件格式不是很了解,我寫(xiě)的那個(gè)不能讀入包含拷貝鏡像變換的元素。也不能讀入a通道的材質(zhì)。反正問(wèn)題很多。如果您那個(gè)能正常讀取的話(huà),可以把代碼發(fā)到我的郵箱里面去嗎?我的郵箱是shongbee2@126.com
            如果成功的話(huà),一定重謝,因?yàn)樗麑?duì)我太重要了。謝謝。。。  回復(fù)  更多評(píng)論
              

            # re: 關(guān)于3ds讀取文件中一處錯(cuò)誤的改正——Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted 2009-05-03 22:22 Little Star
            @OwnWaterloo
            謝謝你的提醒。
            這個(gè)錯(cuò)誤的道理我當(dāng)然明白,我起那樣的標(biāo)題只是為了讓同樣遇見(jiàn)這個(gè)問(wèn)題的人更容易的搜索到這。

            這個(gè)辦法也是權(quán)益之計(jì),我想如果10不夠大,可能就得再曾加一些,因?yàn)閷?shí)在是搞不懂3ds這個(gè)鬼格式。目前這個(gè)改動(dòng)至少能讓我把我的所有3ds文件都加載進(jìn)來(lái)。  回復(fù)  更多評(píng)論
              

            # re: 關(guān)于3ds讀取文件中一處錯(cuò)誤的改正——Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted 2009-05-03 22:26 Little Star
            @shongbee2
            這個(gè)不是我自己寫(xiě)的,也是從網(wǎng)上找的代碼,不過(guò)我把它整合到我的程序中了。
            我也不大了解3ds的格式,材質(zhì)的讀取我也是從別的地方找的例子,照著上面做的。如果只能給你發(fā)一個(gè)可以讀取3ds文件格式的代碼O(∩_∩)O~  回復(fù)  更多評(píng)論
              

            # re: 關(guān)于3ds讀取文件中一處錯(cuò)誤的改正——Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted 2009-05-04 18:35 shongbee2
            @Little Star
            哦,謝謝。。啦。。博主加油。。。  回復(fù)  更多評(píng)論
              

            # re: 關(guān)于3ds讀取文件中一處錯(cuò)誤的改正——Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted 2011-05-30 14:44 hy
            感謝啊,正好遇到這個(gè)問(wèn)題  回復(fù)  更多評(píng)論
              

            # re: 關(guān)于3ds讀取文件中一處錯(cuò)誤的改正——Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted 2011-06-26 22:37 pandawuwyj
            謝謝!正好碰到這個(gè)問(wèn)題!  回復(fù)  更多評(píng)論
              

            婷婷伊人久久大香线蕉AV| 精品免费久久久久久久| 亚洲国产精品人久久| 91精品国产综合久久精品| 精品久久亚洲中文无码| 久久青青色综合| 国产色综合久久无码有码| 一级女性全黄久久生活片免费| 久久免费精品一区二区| 亚洲午夜久久久精品影院| 国产99久久久国产精免费| 久久黄色视频| 超级97碰碰碰碰久久久久最新| 伊人久久精品无码av一区 | 国产精品无码久久综合 | 久久婷婷五月综合成人D啪| 99久久无码一区人妻| 精品久久久久久国产| 九九热久久免费视频| 欧美与黑人午夜性猛交久久久| 亚洲国产高清精品线久久| 无码人妻久久一区二区三区免费丨| 一本一道久久综合狠狠老| 久久se精品一区精品二区| 国内精品久久久久久麻豆| 怡红院日本一道日本久久| 人妻无码精品久久亚瑟影视| 亚洲AV无一区二区三区久久| 久久夜色tv网站| 久久无码中文字幕东京热| 99999久久久久久亚洲| 人妻少妇精品久久| 91精品国产9l久久久久| 亚洲精品无码久久久| 久久国产亚洲精品麻豆| 久久精品国产99国产精品亚洲| 国产精品狼人久久久久影院| 国产精品99久久久精品无码| 亚洲欧美日韩精品久久| 亚洲国产精品久久电影欧美 | 国产成人精品久久亚洲高清不卡|