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

其實我也不知算是什麼問題,跟動態陣列有點關係

尚未結案
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-21 20:13:36 IP:61.230.xxx.xxx 未訂閱
小弟初學,多多指教 我這有2個TXT檔內容都為 0 0 1 0 1 2 0 2 3 1 0 2 1 1 1 1 2 2 2 0 3 2 1 1 2 2 2 --------------------- 按第一個button和第二個button會分別將這兩個TXT檔的內容映到Memo1&Memo2 只是很奇怪...在輸入完第2個檔案.. 案"button2"輸出時竟然1 0 2會變成4103 14317800 1814(案"button2"輸出正確) 如圖: http://web.csie.chu.edu.tw/~b9202096/01.jpg

如果先按button1在案button2..會錯誤 如圖: http://web.csie.chu.edu.tw/~b9202096/02.jpg

-----------------本人原始碼-拙見---- #include TForm1 *Form1; int w1,w2;//判斷有幾行 int i=0,j=0,k=0; int a1=0,a2=0; int ar1[3][3];int ar2[3][3];int ar3[3][3];//假設知道 char ch,ch1,ch2; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //先判斷有幾行 ifstream fin0; fin0.open("D:\\1\\01.txt", ios::in); while(fin0.get(ch)) { if(ch=='\n') w1 ; } fin0.close(); //--讀取 int *m1; m1=new int[(w1 1)*3]; ifstream fin1; fin1.open("D:\\1\\01.txt",ios::in); while(fin1.get(ch1)) { if(ch1=='\n'||ch1==' ') { a1 ; } else m1[a1]=m1[a1] StrToInt(ch1); } fin1.close(); for(i=0;i<(w1 1);i ) { Memo1->Lines->Add(IntToStr(m1[3*i]) " " IntToStr(m1[3*i 1]) " " IntToStr(m1[3*i 2])); } for(i=0;i<(w1 1);i ) { ar1[m1[3*i]][m1[3*i 1]]=m1[3*i 2]; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { //先判斷有幾行 ifstream fin2; fin2.open("D:\\1\\02.txt", ios::in); while(fin2.get(ch)) { if(ch=='\n') w2 ; } fin2.close(); //--讀取 int *m2; m2=new int[w2 1]; ifstream fin3; fin3.open("D:\\1\\02.txt",ios::in); while(fin3.get(ch2)) { if(ch2=='\n'||ch2==' ') { a2 ; } else m2[a2]=m2[a2] StrToInt(ch2); } fin3.close(); for(i=0;i<(w2 1);i ) { Memo2->Lines->Add(IntToStr(m2[3*i]) " " IntToStr(m2[3*i 1]) " " IntToStr(m2[3*i 2])); } /* for(i=0;i<(w2 1);i ) { ar2[m2[3*i]][m2[3*i 1]]=m2[3*i 2]; } */ } //--------------------------------------------------------------------------- ----------------------------部份取檔 難道是記憶體出錯嘛....懇請高人指點 ------------- 累....
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-22 09:40:11 IP:202.145.xxx.xxx 未訂閱
您好,為維護本站文章優良品質,程式碼部份請縮排, 參考【公告】程式碼張貼規則與方法  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=57538 新進會員不清楚本站相關規定或是不會於文章中貼圖請參考「本站使用說明」 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=19264    
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-22 09:51:50 IP:61.230.xxx.xxx 未訂閱
真是抱歉..下次我會注意的 昨天改了一下...(其實只是把BUTTON1中的程式碼移到BUTTON2在修改) 結果能執行第一個就不能執行第2個..能執行第2個就不能執行第1個 就是會出現錯誤..但是晚執行的MEMO會出現數字錯誤且變的很大的問題.. 請問..這是什麼原因呢?
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-22 10:16:57 IP:61.63.xxx.xxx 未訂閱
引言: 真是抱歉..下次我會注意的 昨天改了一下...(其實只是把BUTTON1中的程式碼移到BUTTON2在修改) 結果能執行第一個就不能執行第2個..能執行第2個就不能執行第1個 就是會出現錯誤..但是晚執行的MEMO會出現數字錯誤且變的很大的問題.. 請問..這是什麼原因呢?
batela.tw你好: 看了一下你的程式,主要問是你 class="code"> delete m1; delete m2; 這樣就可以了! 還有你button2中有一段 : int *m2; m2=new int[(w2 1)]; 跟button1中不同你注意到了嗎?宣告的array size不足,導至你直接按button2時,結果會有問題! 最後建議你幾項: >> >!
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-22 18:26:38 IP:61.230.xxx.xxx 未訂閱
謝謝m8815010指導 你說的問題我會多多注意的~^^ 你提供的MEMO讀取TXT真的很好用...原來有這樣的方法ㄚ PS.那個TXT內容一樣只是方便比較答案而已啦~^^b --------------------- 不過我現在只要按1在案2會出錯...反之亦然.. EX:001..答案卻變成1235 45645 12354之類爆掉狀況 錯誤圖示(剛剛上傳當了..所以只好這樣貼) http://web.csie.chu.edu.tw/~b9202096/1.jpg //-----修改後的CODE
 int w1,w2;//判斷有幾行
  int i=0,j=0,k=0;
    int a1=0,a2=0;
    int ar1[3][3];int ar2[3][3];int ar3[3][3];
      char ch,ch1,ch2;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//先判斷有幾行
ifstream fin0;
  fin0.open("D:\\1\\01.txt", ios::in);
   while(fin0.get(ch))
    {
     if(ch=='\n')
     w1  ;
     }
fin0.close();    //--讀取    int *m1;
m1=new int[(w1 1)*3];
ifstream fin1;
  fin1.open("D:\\1\\01.txt",ios::in);
 while(fin1.get(ch1))
  {
    if(ch1=='\n'||ch1==' ')
     {
       a1  ;
     }
    else
   m1[a1]=m1[a1] StrToInt(ch1);
   }
fin1.close();    Memo1->Lines->LoadFromFile("D:\\1\\01.txt");     for(i=0;i<(w1 1);i  )
   {
    ar1[m1[3*i]][m1[3*i 1]]=m1[3*i 2];
   }    Memo1->Lines->Add("ar1[0][0]=" IntToStr(ar1[0][0]));    delete m1;    }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//先判斷有幾行
ifstream fin3;
fin3.open("D:\\1\\02.txt", ios::in);
 while(fin3.get(ch))
   {
    if(ch=='\n')
     w2  ;
   }
fin3.close();    //--讀取
int *m2;
m2=new int[(w2 1)*3];    ifstream fin4;
fin4.open("D:\\1\\02.txt",ios::in);
  while(fin4.get(ch2))
   {
    if(ch2=='\n'||ch2==' ')
     {
      a2  ;
     }
   else
   m2[a2]=m2[a2] StrToInt(ch2);
   }
fin4.close();    Memo2->Lines->LoadFromFile("D:\\1\\02.txt");     for(i=0;i<(w1 1);i  )
  {
   ar1[m2[3*i]][m2[3*i 1]]=m2[3*i 2];
  }    Memo2->Lines->Add("ar2[0][0]=" IntToStr(ar2[0][0]));
delete m2;
}
種感覺這樣寫很不穩...可是我已經擠不出來想法了 //------------------ 學習..代價.. 發表人 - batela.tw 於 2004/10/22 18:30:35 發表人 - batela.tw 於 2004/10/22 18:31:42
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-23 10:44:14 IP:61.230.xxx.xxx 未訂閱
拜托知道問題所在的前輩能幫忙... 我現在在BUTTON2產生動態陣列後面印出陣列0 -------------
    int *m2;
m2=new int[(w2 1)*3];
Memo2->Lines->Add(IntToStr(m2[0]));    
------------- 理論上新產生的東西什麼都沒有 但是只要我先按BUTTON1在案BUTTON2 它所印出來的答案卻是14291304 我真的不知道問題出在哪...
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-10-23 13:00:12 IP:61.230.xxx.xxx 未訂閱
int size1=(w1 1)*3;
int *m1=new int[size1];
ZeroMemory(m1,sizeof(int)*size1);
//--- 剛剛翻了文章 發現初始化的問題 所以多加了ZeroMemory(m1,sizeof(int)*size1); 結果就對了耶... 不過..初始化的定義到底是...?
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-10-23 13:21:04 IP:218.167.xxx.xxx 未訂閱
引言: 拜托知道問題所在的前輩能幫忙... 我現在在BUTTON2產生動態陣列後面印出陣列0 -------------
int *m2;
m2=new int[(w2 1)*3];
Memo2->Lines->Add(IntToStr(m2[0]));
------------- 理論上新產生的東西什麼都沒有 但是只要我先按BUTTON1在案BUTTON2 它所印出來的答案卻是14291304 我真的不知道問題出在哪...
1. int *m2; m2=new int[(w2 1)*3]; Memo2->Lines->Add(IntToStr(m2[0])); ans:印出來的值,任何值都可能,因為new並下會幫你清空記憶體內容為零. 2.只是很奇怪...在輸入完第2個檔案.. 案"button2"輸出時竟然1 0 2會變成4103 14317800 1814(案"button2"輸出正確) ans:因為你設值時以ar1為基準,show時卻以ar2為基準. ar1[m2[3*i]][m2[3*i 1]]=m2[3*i 2]; Memo2->Lines->Add("ar2[0][0]=" IntToStr(ar2[0][0])); 是不是一個ar1,一個ar2 3. ar1[m1[3*i]][m1[3*i 1]]=m1[3*i 2]; 可能要改成 ar1[i/3]][i%3]]=m1[i]; 4.多用f4,f7,f8三個鍵去追蹤程式,還有run->add watch可輸入變數名稱,可以看它的值或用滑鼠指在變數上也可以看它的值. 5.應該還有其它問題,再討論.
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-10-23 19:08:57 IP:61.230.xxx.xxx 未訂閱
謝謝您的執導~^^ 很多東西原來都是要經過錯誤才知道 --- 最後我想問一個小問題 我在爬文的時候好像沒看見 就是一維的初始化是這樣寫的 ZeroMemory(m1,sizeof(int)*size1); 那二維的寫法是...? 我想如果經過初始化,new一個陣列內容應該會回0吧
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-10-24 16:17:12 IP:140.124.xxx.xxx 未訂閱
引言: 謝謝您的執導~^^ 很多東西原來都是要經過錯誤才知道 --- 最後我想問一個小問題 我在爬文的時候好像沒看見 就是一維的初始化是這樣寫的 ZeroMemory(m1,sizeof(int)*size1); 那二維的寫法是...? 我想如果經過初始化,new一個陣列內容應該會回0吧
1.假如你是宣告 int ar1[3][3]; 你一樣可用 ZeroMemory(ar1,sizeof(ar1)); 2.假如你是動態宣告時,也可,不過需要一點技巧.
 
  int **arg;
  arg = (int **) new int[3];
  for (int i=0;i<3;i  )
  {
    arg[i] = new int[5];
    ZeroMemory(arg[i],sizeof(int)*5);  //分別處理,執行3次
  }
  for (int i=0;i<3;i  ) delete arg[i];
  delete arg;
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-10-24 17:11:11 IP:61.230.xxx.xxx 未訂閱
引言: int **arg; arg = (int **) new int[3]; for (int i=0;i<3;i ) { arg[i] = new int[5]; ZeroMemory(arg[i],sizeof(int)*5); //分別處理,執行3次 } for (int i=0;i<3;i ) delete arg[i]; delete arg;
謝謝先進~不過... 既然是做3次...
arg[i] = new int[5];
                 ^
ZeroMemory(arg[i],sizeof(int)*5);
                              ^
那個..5是什麼意思ㄚ~^^b -------------------- 真是遇到好人了... 發表人 - batela.tw 於 2004/10/24 17:13:17
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-10-24 22:52:27 IP:203.67.xxx.xxx 未訂閱
引言:
引言: int **arg; arg = (int **) new int[3]; for (int i=0;i<3;i ) { arg[i] = new int[5]; ZeroMemory(arg[i],sizeof(int)*5); //分別處理,執行3次 } for (int i=0;i<3;i ) delete arg[i]; delete arg;
謝謝先進~不過... 既然是做3次...
arg[i] = new int[5];
                 ^
ZeroMemory(arg[i],sizeof(int)*5);
                              ^
那個..5是什麼意思ㄚ~^^b -------------------- 真是遇到好人了... 發表人 - batela.tw 於 2004/10/24 17:13:17
batela.tw你好: 一個 >! 另外當時有幫你試了一下你原來的>> 動作即可,應該是不用 >!
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-10-25 11:23:02 IP:61.230.xxx.xxx 未訂閱
謝謝m8815010~ 我當初會想說用zero memory的動作是因為我在做乘法時,如果說資料裡面有一個陣列值為0或是說有一行陣列值為0固沒有列在TXT檔上面,如果不先zero memory的動作在相乘時我怕會發生錯誤... ------ 那個恕我資質愚昧... 一個int data type的大小就是sizeof(int),*5的話就是5個int的大小了 那麼做完是不是就變成3*5的矩陣阿...因為我不是很懂..書上也沒寫 ----------------- 考慮換本書了..
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-10-25 15:02:41 IP:203.67.xxx.xxx 未訂閱
引言: 謝謝m8815010~ 我當初會想說用zero memory的動作是因為我在做乘法時,如果說資料裡面有一個陣列值為0或是說有一行陣列值為0固沒有列在TXT檔上面,如果不先zero memory的動作在相乘時我怕會發生錯誤... ------ 那個恕我資質愚昧... 一個int data type的大小就是sizeof(int),*5的話就是5個int的大小了 那麼做完是不是就變成3*5的矩陣阿...因為我不是很懂..書上也沒寫 ----------------- 考慮換本書了..
batela.tw你: 嗯,我的結論就是記得你> > 所以雖然沒有 >! 另外 class="code"> int a=3; //demension 1 int b=5; //demension 2 int y=0; int *x=new int[a*b]; ZeroMemory((void*)x,sizeof(int)*15); //zero memory for (int i=0;i<15;i ) //assign value we needed x[i]=y ; ShowMessage(*(x 2*5 4)); // for example : representation of value x[3][5] 把想宣告的二維array轉成一維的,因為一個二維array儲存在memory中也是一維的觀念,並沒有什麼維度的觀念的!這樣比較土,但就不用怕以後遇到3維、4維、5維…等等的問題! 另外基本的 >! 發表人 -
batela.tw
一般會員


發表:6
回覆:14
積分:4
註冊:2004-10-17

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-10-26 11:51:27 IP:61.230.xxx.xxx 未訂閱
謝謝m8815010和brook兩位先進...你們真的幫了我太大的忙 我的問題目前都解決剎不多了 真是沒想到網上竟然有人願意幫助我...好感動 真的是非常非常謝謝你們兩位.. --------- 泣...
系統時間:2024-06-18 18:59:33
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!