線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1702
推到 Plurk!
推到 Facebook!

陣列的使用超出了宣告的範圍

尚未結案
wena
一般會員


發表:26
回覆:37
積分:12
註冊:2005-07-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-28 11:44:23 IP:218.162.xxx.xxx 未訂閱
引言: ThrowIfOutOfRange(idx); // Should Range-checking be optional to avoid overhead ?? Source: INCLUDE\VCL\dstring.h milkbear 你好: 應該是你 array 的 index 超出你所宣告的範圍了 例如: int a[5]; // 總共有 0, 1, 2, 3, 4 共 5 個 index 假如你在程式碼中寫 a[6] 就超過了
這是我在某討論串裡找到的一段話,因為我也遇到相同的錯誤訊息 我的程式碼:
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  int i;
  AnsiString temp = RichEdit1->Text;
  for(i=1 ; iText.Length() ; i++)
  {
    if(temp[i] =' ' && temp[i+1]==' ' )
     temp.Delete(i,1);   //從第i個字元開始刪除1個字元
  }
  RichEdit2->Text = temp;
} 
當我RUN的時候出現了一個warning: [C++ Warning] Unit1.cpp(24): W8060 Possibly incorrect assignment 當我執行程式時出現出現了一個警告視窗如下: 隨後就出現了一個dstring.h的檔案並且將某一行反白如同引言出現的一樣: 我猜想我也是程式超出了宣告的範圍 但我看不出來 謝謝幫忙!
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-28 12:26:53 IP:210.68.xxx.xxx 未訂閱
if(temp[i] =' ' && temp[i 1]==' ' )     1.判斷是用==而非=
wena
一般會員


發表:26
回覆:37
積分:12
註冊:2005-07-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-28 14:08:49 IP:218.162.xxx.xxx 未訂閱
謝謝指正! 但是我改過之後還是會有一樣的情形… 請問是不是跟 for(i=1 ; iText.Length() ; i ) 這一行的RichEdit1->Text.Length()有關?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-28 15:04:54 IP:210.68.xxx.xxx 未訂閱
改成下面這樣試試< class="code"> AnsiString temp = RichEdit1->Text; for(int i=RichEdit1->Text.Length(); i>1; i--) { if(temp[i] ==' ') temp.Delete(i,1); } RichEdit2->Text = temp;
wena
一般會員


發表:26
回覆:37
積分:12
註冊:2005-07-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-28 15:27:40 IP:218.162.xxx.xxx 未訂閱
謝謝! 程式竟然順利執行了! 可是還是很納悶…
for(int i=RichEdit1->Text.Length(); i>1; i--)
  {
     if(temp[i] ==' ' && temp[i-1] == ' ')
        temp.Delete(i,1);   
  }
 
for(i=1 ; iText.Length() ; i  )
  {
    if(temp[i] =' ' && temp[i 1]==' ' )
     temp.Delete(i,1); 
  }
 
有什麼不同嗎?是否Length()在搞怪?
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-28 15:43:12 IP:210.68.xxx.xxx 未訂閱
您好: 去看看Delete(); 的說明吧
wena
一般會員


發表:26
回覆:37
積分:12
註冊:2005-07-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-29 09:14:44 IP:218.162.xxx.xxx 未訂閱
您好 我把Delete()的說明讀了 它的大意是不是說 刪除的操作只能在宣告過的記憶體內 You should use the delete operator to remove all memory that has been allocated by the new operator. 否則就會照成記憶體斷裂 Failure to free memory can result in memory leaks 如果是這樣的話,我原先的程式有造成這樣的問題嗎? 謝謝指教!
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-30 01:54:17 IP:221.169.xxx.xxx 未訂閱
Sorry....... 發表人 - andychang1690 於 2005/07/30 01:58:58
------
Andy Chang
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-30 12:13:58 IP:211.20.xxx.xxx 未訂閱
這是觀念問題, 當 Delete 刪除後字串長度會變短. 所以一開始假設 temp 內的字串長度為 10 所以你的 for ㄧ定會跑十次 而你的方式是由字串的開頭處理, 如果沒有可刪除的項目就不會出錯. ㄧ但有刪除, 那字串就會小於 10 , 所以當存取 temp[10] 時一定就是超出範圍. 而由字串尾端開始處理就不會有這樣的問題. 因為當你刪除 temp[10] 後 下ㄧ個檢查的會是 temp[9] , 這樣瞭解嗎. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
wena
一般會員


發表:26
回覆:37
積分:12
註冊:2005-07-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-30 13:52:31 IP:218.162.xxx.xxx 未訂閱
了解! 是不是說 一開始RichEdit1->裡面有十個字串: 1 2 3 4 5 6 7 8 9 10 如果6被刪了,它會變成 1 2 3 4 5 7 8 9 10  九個陣列 而不是變成 1 2 3 4 5 7 8 9 10 十個陣列 所以for迴圈跑十次就會發生問題!
bestlong
站務副站長


發表:126
回覆:734
積分:512
註冊:2002-10-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-30 16:25:36 IP:219.80.xxx.xxx 未訂閱
重點是 for 迴圈開始就確定會讓 i 由 1 to 10 所以一定會存取 temp[1] ~ temp[10] 但是在迴圈範圍中的程式會去改變 temp 的大小. 所以由開頭處理會產生問題. 雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/
http://www.bestlong.idv.tw/
http://delphi-ktop.bestlong.idv.tw/
wena
一般會員


發表:26
回覆:37
積分:12
註冊:2005-07-20

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-30 18:06:57 IP:218.162.xxx.xxx 未訂閱
了解! 謝謝!
系統時間:2024-06-27 2:47:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!