[問題] struct和vector的問題

看板C_and_CPP (C/C++)作者 (怪龍-卡西歐魯)時間14年前 (2011/10/02 12:22), 編輯推噓1(1011)
留言12則, 3人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenGL 問題(Question): http://codepad.org/z81QroL4 在這份程式碼裡面,我定義了Mesh這個structure 用create_box()這個函式製造一個Mesh物件 然後用draw_model()將Mesh顯示出來 用法大概是這樣 在宣告全域變數的地方: Mesh* modelbox1; 在init函式: create_box(modelbox1, 1, 0.5, 2, 0.5); 然後在display函式: draw_model(modelbox1); 但是現在發生了奇怪的問題 就是在執行到draw_model的for迴圈的時候 會發生memory violation http://imageshack.us/photo/my-images/11/programerror1.jpg/ 即使我把for迴圈裡面的內容都註解掉了還是會發生一樣的問題 個人猜測是vi.size()的調用出了問題 可能是在全部push_back完後少加了一個什麼東西,讓size無法運作 (像字串最後要加'\0'之類的) 但是查了網路上很多資料,size()都只有說是裡面元素的數量而已 沒有找到和我一樣的狀況 想請問一下我在vector或struct的使用上到底是出了什麼問題 導致這樣的錯誤呢? 在此先感謝各位的回答 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 68.99.86.102

10/02 12:24, , 1F
把 void create_box(Mesh* boxmodel, ...) 改成
10/02 12:24, 1F

10/02 12:24, , 2F
void create_box(Mesh& boxmodel, ...) 試試
10/02 12:24, 2F

10/02 12:25, , 3F
改成 void create_box(Mesh** boxmodel 也行,但較麻煩
10/02 12:25, 3F
感謝回答 但是想請問一下如果要改成create_box(Mesh& boxmodel, ...)的話 create_box(modelbox1, ...)這行要怎麼改才行呢? 我試著將new的那行拿出來 然後把這行改成create_box(&modelbox1, ...)或是create_box(*modelbox1, ...) 結果都有其他error出現 ※ 編輯: hcl012 來自: 68.99.86.102 (10/02 12:33)

10/02 12:42, , 4F
void create_box(Mesh *&boxmodel, ...)
10/02 12:42, 4F

10/02 12:42, , 5F
其他不用改
10/02 12:42, 5F

10/02 12:46, , 6F
我個人比較喜歡 Mesh *create_box(...) 這種形式, 不過這
10/02 12:46, 6F

10/02 12:47, , 7F
是個人偏好而已, 沒什麼差別...
10/02 12:47, 7F

10/02 12:51, , 8F
話說回來, 何不建一個 class 然後用建構子就好了...
10/02 12:51, 8F
剛才試著用void create_box(Mesh *&boxmodel, ...) 結果也出現了memory violation 不一樣的是這次有顯示錯誤發生的位置是在vector的第783行 _SCL_SECURE_VALIDATE_RANGE(_Pos < size());這裡 剛才我試著用Printf印出vi.size()的值 結果有成功印出來,代表size的提取沒有問題 但是不知道為什麼還是沒辦法把內容畫出來 要用這個結構的主要原因是,這是某個model loader裡面的架構 如果要改成class的話那要連整個model loader都重寫(汗 ※ 編輯: hcl012 來自: 68.99.86.102 (10/02 13:01)

10/02 13:35, , 9F
52行改成 v.at( vi[i] ), vi 有 12 個元素你用size()
10/02 13:35, 9F

10/02 13:37, , 10F
確保不會存取違規, 但是 v 只有 8 個元素, 和你 vi 元
10/02 13:37, 10F

10/02 13:38, , 11F
素值域 [1, 8] 明顯不能當做索引來用, 應該是[0, 8)
10/02 13:38, 11F

10/02 13:39, , 12F
偵錯時呼叫 at() 確定演算法無誤再改呼叫 operator[]
10/02 13:39, 12F
剛才檢查了一下model loader 在vertex index讀取的地方都有減一過 因為obj檔的index是從1開始算的,我疏忽了這點就直接將index放到mesh裡面 結果vector index是從0開始算的,結果就讀超過範圍了 經修正後程式已經可以正常運作 很感謝兩位板友的幫助m(_ _)m ※ 編輯: hcl012 來自: 68.99.86.102 (10/02 13:52)
文章代碼(AID): #1EX-RyQl (C_and_CPP)
文章代碼(AID): #1EX-RyQl (C_and_CPP)