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

建構動態二維陣列的問題

尚未結案
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-14 07:59:56 IP:140.118.xxx.xxx 未訂閱
本程式建構動態二維陣列時, 編輯時會在float *ptr[i]=new float[m];此行, 產生錯誤的訊息, 為何會有如此現象呢?    請教各位先進.    原始程式: void __fastcall TForm1::Button1Click(TObject *Sender) {  int n,m;  n=StrToInt(Edit1->Text);  float **ptr=new float *[n];  for(int i=0;iText); float *ptr[i]=new float[m]; } for(int i=0;i
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-14 09:06:29 IP:211.23.xxx.xxx 未訂閱
不必再重複宣告, float *ptr[i]=new float[m]; 用 ptr[i]=new float[m]; 就可以了 請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28485 int i,a,b; int **ary; a=StrToInt(Edit1->Text); b=StrToInt(Edit2->Text); ary=new int*[a]; for(i=0; i<a; i ) ary[i]=new int[b]; //就可以配置 ary[a][b] 的二維陣列了 //殺掉的話 for (i=0; i<a; i ) delete[] ary[i]; delete[] ary;
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-14 10:49:47 IP:140.118.xxx.xxx 未訂閱
引言: 不必再重複宣告, float *ptr[i]=new float[m]; 用 ptr[i]=new float[m]; 就可以了 請參考 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=28485 int i,a,b; int **ary; a=StrToInt(Edit1->Text); b=StrToInt(Edit2->Text); ary=new int*[a]; for(i=0; i<a; i ) ary[i]=new int[b]; //就可以配置 ary[a][b] 的二維陣列了 //殺掉的話 for (i=0; i<a; i ) delete[] ary[i]; delete[] ary; *************************** 謝謝您的回應, 不過針對二維陣列有更簡易的宣告方式嗎? 一定要使用迴圈宣告嗎? 如果二維的大小在宣告前已知,可否作一次宣告呢? 您覺得呢? ***************************
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-14 14:07:35 IP:211.23.xxx.xxx 未訂閱
已知大小就更簡單了,    float ptr[n][m];    要給初值的話, float ptr[2][3]={1.0, 2.0, 3.0, 4.0, 5.0, 6.0}        軟還要更軟,我的Artwork http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27674
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-15 13:00:46 IP:140.118.xxx.xxx 未訂閱
dan59314,你好: 您可能誤會我的意思了, 我是希望由輸入給定二維陣列之大小, 而非真得知道維度,可以直接作宣告, 若像你所言,float ptr[n][m]; 這樣是不行的. 我的目的是希望作一次宣告,而非需要用到迴圈作宣告, 還是這種想法是不可能的呢?
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-15 14:25:29 IP:203.73.xxx.xxx 未訂閱
引言: 我是希望由輸入給定二維陣列之大小, 而非真得知道維度,可以直接作宣告, 若像你所言,float ptr[n][m]; 這樣是不行的. 我的目的是希望作一次宣告,而非需要用到迴圈作宣告, 還是這種想法是不可能的呢?
TsannTay 你好: 只是提供另外一種想法,參考看看 < class="code"> int m=2; int n=3; int l=0; int i=0; int j=0; int *ptr=new int[m*n]; // 給值 for(i=0; i -- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
integrand
一般會員


發表:8
回覆:27
積分:17
註冊:2002-10-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-15 14:51:14 IP:218.163.xxx.xxx 未訂閱
引言: dan59314,你好: 您可能誤會我的意思了, 我是希望由輸入給定二維陣列之大小, 而非真得知道維度,可以直接作宣告, 若像你所言,float ptr[n][m]; 這樣是不行的. 我的目的是希望作一次宣告,而非需要用到迴圈作宣告, 還是這種想法是不可能的呢?
抱歉亂入 我覺得dan59314的方法沒有什麼好簡化的說 如果你只是想讓程式碼看起來簡單一點 不如考慮嘗試將它寫成巨集 因為我沒寫過巨集 所以僅供參考
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-15 18:16:40 IP:211.23.xxx.xxx 未訂閱
引言:我是希望由輸入給定二維陣列之大小, 而非真得知道維度,可以直接作宣告, 若像你所言,float ptr[n][m]; 這樣是不行的. 我的目的是希望作一次宣告,而非需要用到迴圈作宣告, 還是這種想法是不可能的呢?
傷腦筋勒,我不知道要怎麼在簡化了。 用 Template 來作的話可以嗎? template <class T〉newAry(T*** ary, int n, int m) { *ary=new T *[n]; for(int i=0; i<n; i ) (*ary)[i]=new T [m]; } void __fastcall TForm1::Button1Click(TObject *Sender) { int n=StrToInt(Edit1->Text), m=StrToInt(Edit2->Text); float **fary=NULL; newAry(&fary, n, m); int **iary=NULL; newAry(&iary, n, m); } 軟還要更軟,我的Artwork http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27674 發表人 - dan59314 於 2003/04/15 18:22:46
brook
資深會員


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-15 20:15:14 IP:218.160.xxx.xxx 未訂閱
#include  int m=5,n=4; vector aStack(n); //一維 vector > Array(m, vector(n)); //二維 aStack[2] = 8.5; Array[2][2] = 6.8;
brook
資深會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-15 20:27:56 IP:218.160.xxx.xxx 未訂閱
 
#include <vector.h>    int m=5,n=4;
vector <float> aStack(n);  //一維
vector <vector<float>> Array(m, vector<float>(n)); //二維    aStack[2] = 8.5;
Array[2][2] = 6.8;    
ps.大於小於因顯示會有問題,所以必須重打.
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-16 01:35:32 IP:140.118.xxx.xxx 未訂閱
引言:
 
#include <vector.h>    int m=5,n=4;
vector <float> aStack(n);  //一維
vector <vector<float>> Array(m, vector<float>(n)); //二維    aStack[2] = 8.5;
Array[2][2] = 6.8;    
ps.大於小於因顯示會有問題,所以必須重打. ************************ 一維宣告的陣列可以使用,但二維不行, 您可以解釋二維宣告那段程式的意思嗎? 請你再幫幫忙.... ************************
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-16 01:42:43 IP:140.118.xxx.xxx 未訂閱
引言: 傷腦筋勒,我不知道要怎麼在簡化了。 用 Template 來作的話可以嗎? template <class T〉newAry(T*** ary, int n, int m) { *ary=new T *[n]; for(int i=0; i<n; i ) (*ary)[i]=new T [m]; } void __fastcall TForm1::Button1Click(TObject *Sender) { int n=StrToInt(Edit1->Text), m=StrToInt(Edit2->Text); float **fary=NULL; newAry(&fary, n, m); int **iary=NULL; newAry(&iary, n, m); } 軟還要更軟,我的Artwork http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27674 發表人 - dan59314 於 2003/04/15 18:22:46
引言: ********************* 對於整數陣列這個方法可行, 但浮點數陣列似乎會有問題. 附上程式碼 template newAry(T*** ary, int n, int m) { *ary=new T *[n]; for(int i=0; iText), m=StrToInt(Edit2->Text); float **fary; newAry(&fary, n, m); Memo1->Lines->Clear(); for(int i=0;iLines->Text=Memo1->Lines->Text fary[i][j] " "; } Memo1->Lines->Text=Memo1->Lines->Text "\n"; } Memo2->Lines->Clear(); int **iary; newAry(&iary, n, m); for(int i=0;iLines->Text=Memo2->Lines->Text iary[i][j] " "; } Memo2->Lines->Text=Memo2->Lines->Text "\n"; } } *********************
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-04-16 09:06:58 IP:211.23.xxx.xxx 未訂閱
引言: Memo1->Lines->Text=Memo1->Lines->Text fary[i][j] " ";
字串+數字???? 你再研究一下。
dan59314
中階會員


發表:121
回覆:107
積分:86
註冊:2002-08-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-04-16 09:12:51 IP:211.23.xxx.xxx 未訂閱
引言: #include <vector.h>int m=5,n=4;vector <float> aStack(n); //一維vector <vector<float>> Array(m, vector<float>(n)); //二維aStack[2] = 8.5;Array[2][2] = 6.8;
Thanks to brook, Good to learn.
brook
資深會員


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-04-16 13:36:27 IP:218.160.xxx.xxx 未訂閱
#include <vector.h> int m=5,n=4; vector <float> aStack(n); //一維 vector <vector<float>> Array(m, vector<float>(n)); //二維 兩個大於間要加一個空隔,如下面︿的位置. vector <vector<float>︿> Array(m, vector<float>(n)); //二維
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-04-16 16:07:27 IP:140.118.xxx.xxx 未訂閱
我根據brook所提之方式, 將此法測試後,其結果非常滿意.    附上程式,以供參考.(加入兩個Edit,一個Memo及一個Button)    void __fastcall TForm1::Button1Click(TObject *Sender) { int m,n; String temp;    m=StrToInt(Edit1->Text); n=StrToInt(Edit2->Text);    vector  aStack(n); //一維 vector > Array(m, vector(n)); //二維 Memo1->Lines->Clear(); for(int i=0;iLines->Text=Memo1->Lines->Text temp " "; } Memo1->Lines->Text=Memo1->Lines->Text "\n"; } }
jesson
一般會員


發表:11
回覆:16
積分:5
註冊:2002-04-21

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-04-19 02:07:38 IP:61.231.xxx.xxx 未訂閱
引言:
引言: #include <vector.h> int m=5,n=4; vector <float> aStack(n); //一維 vector <vector<float>> Array(m, vector<float>(n)); //二維 兩個大於間要加一個空隔,如下面︿的位置. vector <vector<float>︿> Array(m, vector<float>(n)); //二維
小弟也Try了brook兄的方法,的確不錯! 但小弟有幾個疑問,想請教一下,這宣告出的陣列示動態配置嗎? 若是動態配置,須delete陣列節省資源時,該如何delete! 直接用delete[] Array(以二維為例),不知何位前輩可否解答
brook
資深會員


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-04-25 20:28:48 IP:218.160.xxx.xxx 未訂閱
引言: 但小弟有幾個疑問,想請教一下,這宣告出的陣列示動態配置嗎? 若是動態配置,須delete陣列節省資源時,該如何delete! 直接用delete[] Array(以二維為例),不知何位前輩可否解答
它應會自動處理,不用去管記憶體的釋放。
800
一般會員


發表:2
回覆:7
積分:1
註冊:2003-04-03

發送簡訊給我
#19 引用回覆 回覆 發表時間:2003-05-12 00:37:53 IP:61.59.xxx.xxx 未訂閱
C 有這麼聰明嗎? 印象中 garbage collection 並沒有明定在 C 的規格裡面.
brant
一般會員


發表:1
回覆:64
積分:23
註冊:2003-04-07

發送簡訊給我
#20 引用回覆 回覆 發表時間:2003-05-12 09:56:19 IP:61.219.xxx.xxx 未訂閱
引言: C 有這麼聰明嗎? 印象中 garbage collection 並沒有明定在 C 的規格裡面.
不是 C 做的,是 vector 做的。
系統時間:2024-11-25 19:40:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!