全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3219
推到 Plurk!
推到 Facebook!

請問有關三維動態陣列的宣告及初始化錯誤

答題得分者是:syntax
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-06 21:07:17 IP:61.230.xxx.xxx 訂閱
各位前輩好 小弟最近寫程式需要用到三維陣列, 為了節省記憶體空間打算使用動態配置記憶體方式來宣告
下面是我的程式碼(縮排有點亂抱歉 因為搞不定心情很慌亂)

[code cpp]
[前面xyz max...參數宣告我就省略了]
int ***vote = new int**[max_a];
for(x=0;x {
vote[x] = new int*[max_b];
for(y=0;y {
vote[x][y] = new int[max_r];
}
}
int debug=0;
for(x=0;x {
for(y=0;y {
for(z=0;z { debug ;
try{vote[x][y][z] = 0;}
catch(...)
{outfile< }
}
}

[/code]

每次跑到陣列的某個位置
在執行vote[x][y][z] = 0;
時就會當掉
錯誤訊息
Access violation at address 004064A5 Write of address 00000004 process stopped use step or run to continue

因此我用try ccatch去看了一下跑到哪裡掛掉
發現
當 x y z = (0,104,0) 的時候 就會出現錯誤了
且繼續GO下去就會繼續錯(0,104,1)錯一下 (0,104,2)錯一下 (0,104,3)錯一下 ........一直下去

看錯誤訊息是我去寫了不合法的記憶體 但是我宣告時已經成功宣告
而且 0,104,0 並沒有超出我的宣告範圍阿? 如果說是記憶體不足 應該當初宣告時就會出現錯誤了吧
啥stack overflow的......
小弟實在是想破頭了~ 拜託各位前輩幫幫忙吧 !!感恩
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-07 08:59:17 IP:118.231.xxx.xxx 訂閱

你要去配新眼鏡

  1. for(x=0;xb;x )
  2. {
  3. vote[x] = new int*[max_b];
  4. for(y=0;yr;y )
  5. {
  6. vote[x][y] = new int[max_r];
  7. }
  8. }

這樣 z 有 max_r 但 y 卻使用了配置 max_r 次而不是 max_b次
同樣 y 有 max_b 但 z 卻使用了配置 max_b 次而不是 max_a次


  1. for(x=0;xa;x ) X 有 a 個
  2. {
  3. vote[x] = new int*[max_b];
  4. for(y=0;yb;y ) Y 有 b 個
  5. {
  6. vote[x][y] = new int[max_r]; z 有 r 個
  7. }
  8. }

x < max_x
y < max_y
z< max_z

這樣命名,不知道對你來說,是否會有障礙?
當然你高興的話,還是可以用

x < max_a
y < max_b
z< max_r

但 你參數這樣命名,遲早會瘋調

===================引 用 chang1981 文 章===================
各位前輩好 小弟最近寫程式需要用到三維陣列, 為了節省記憶體空間打算使用動態配置記憶體方式來宣告
下面是我的程式碼(縮排有點亂抱歉 因為搞不定心情很慌亂)

[code cpp]
[前面xyz max...參數宣告我就省略了]
int ***vote = new int**[max_a];
for(x=0;x
[/code]

每次跑到陣列的某個位置
在執行vote[x][y][z] = 0;
時就會當掉
錯誤訊息
Access violation at address 004064A5 Write of address 00000004 process stopped use step or run to continue

因此我用try ccatch去看了一下跑到哪裡掛掉
發現
當 x y z = (0,104,0) 的時候 就會出現錯誤了
且繼續GO下去就會繼續錯(0,104,1)錯一下 (0,104,2)錯一下 (0,104,3)錯一下 ........一直下去

看錯誤訊息是我去寫了不合法的記憶體 但是我宣告時已經成功宣告
而且 0,104,0 並沒有超出我的宣告範圍阿? 如果說是記憶體不足 應該當初宣告時就會出現錯誤了吧
啥stack overflow的......
小弟實在是想破頭了~ 拜託各位前輩幫幫忙吧 !!感恩
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-07 09:52:24 IP:61.230.xxx.xxx 訂閱

感謝大大的回答 真的是我腦袋打結了 照大大的方式修改後已經可以正常宣告並初始化
修改後程式如下

[code cpp]
int ***vote = new int**[max_a];
//vote = new int**[max_a];
for(x=0;x {
vote[x] = new int*[max_b];
for(y=0;y {
vote[x][y] = new int[max_r];
}
}

int debug=0;
for(x=0;x {
for(y=0;y {
for(z=0;z { debug ;
try{vote[x][y][z] = 0;}
catch(...)
{outfile< }
}
}

[/code]


但是現在要釋放記憶體的時候發現了問題

以下是我是放記憶體使用的程式碼


[code cpp]
for(x=0;x {
for(y=0;y {
delete [] vote[x][y];//此處會出現問題 當vote[5][20]的時候
}
delete [] vote[x];
}
delete [] vote;

[/code]

這樣的程式會在 delete [] vote[x][y]; 時出現錯誤
錯誤訊息
Access violation at address 0119419C in module 'BORLNDMM.DLL'
write of address 0000001A'
不知道哪裡出了錯 想麻煩S大幫我看一下好嗎 感謝!!!
編輯記錄
chang1981 重新編輯於 2008-10-07 09:54:21, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-08 01:58:29 IP:59.115.xxx.xxx 訂閱
我試了一下,沒問題,釋放很正常!

你的max_a,max_b,max_r是多少? 我用150,150,150試都沒問題。但我是全部初始化後就立刻釋放。

你是否有做些什麼運算後才釋放?
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-04-28 12:16:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!