二維矩陣傳入函數的問題 |
答題得分者是:aftcast
|
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
請教一下:
我想傳入二維陣列,到函數後想做反矩陣跟轉置矩陣, 我知道有CAM等函數可以使用,但是我還是想了解基本的矩陣傳入傳出, 目前做到這邊都沒問題, 問題點在 int (*p)[4] = (int(*)[4])m; 因此想問這裡可以改由 leng_col 變數來取代4嗎? 想請問有方法可以讓這裡變成動態指定大小嗎? 或者有建議的方法也請提供給我,謝謝 [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { // int (m[3])[4] = {{1,1,1,5},{2,2,2,5},{3,3,3,5}}; int leng_col = sizeof(m[0])/sizeof(m[0][0]); //算出陣列大小 int leng_rol = sizeof(m)/sizeof(m[0]); //算出陣列大小 SG1->Cells[1][1] = IntToStr(leng_col); SG1->Cells[1][2] = IntToStr(leng_rol); //matrix_5((int **)m,leng_col,leng_rol); matrix_5((int**)m,leng_col,leng_rol); } //--------------------------------------------------------------------------- void __fastcall TForm1::matrix_5(int** m,int leng_col, int leng_rol) { //傳入N維陣列後 變更內容 int (*p)[4] = (int(*)[4])m; //int leng_col = sizeof(p); //算出陣列大小 //int leng_rol = sizeof(p[0])/sizeof(p[0][0]); //算出陣列大小 Memo1->Lines->Add("col " IntToStr(leng_col)); Memo1->Lines->Add("rol " IntToStr(leng_rol)); for(int i=0;i Memo1->Lines->Add("rol:" IntToStr(i) " col:" IntToStr(j) " cal:" IntToStr(p[i][j])); //SG2->Cells[j][i] = IntToStr(p[i][j]); } } //--------------------------------------------------------------------------- [/code] 編輯記錄
juneo 重新編輯於 2008-11-25 15:08:52, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你好,
關於第二維的值是不能為變數的,一定要是常數,這與compiler編譯有關,若等到runtime才知道多大,那pointer的值加1的結果也會跟著變動,那整個程式就亂了! 細節不談了! 不過山不轉路轉,且你用的是c 的語言,就是有許多彈性可以變。依我的看法,我會如下來完成這個任務,請參考! [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { // int (m[3])[4] = {{1,1,1,5},{2,2,2,5},{3,3,3,5}}; int leng_col = sizeof(m[0])/sizeof(m[0][0]); //算出陣列大小 int leng_rol = sizeof(m)/sizeof(m[0]); //算出陣列大小 SG1->Cells[1][1] = IntToStr(leng_col); SG1->Cells[1][2] = IntToStr(leng_rol); //matrix_5((int **)m,leng_col,leng_rol); matrix_5(m,leng_col,leng_rol); //蕭沖改 } //--------------------------------------------------------------------------- [/code] void __fastcall TForm1::matrix_5(int* m,int leng_col, int leng_rol) //參數1被我改了 { //傳入N維陣列後 變更內容 //int (*p)[4] = (int(*)[4])m; //免了 //int leng_col = sizeof(p); //算出陣列大小 //int leng_rol = sizeof(p[0])/sizeof(p[0][0]); //算出陣列大小 Memo1->Lines->Add("col " IntToStr(leng_col)); Memo1->Lines->Add("rol " IntToStr(leng_rol)); for (int i=0;i Memo1->Lines->Add("rol:" IntToStr(i) " col:" IntToStr(j) " cal:" IntToStr(p[i][j])); //SG2->Cells[j][i] = IntToStr(p[i][j]); SG2->Cells[j][i] = IntToStr(*(m i*leng_col j)); //蕭沖改 } } 其實你的陣列算是「2維排列的1維陣列」,所以用1個array pointer就可以。因為開始的時候有說2維不能是變數,這使得我們無法用下標法[ ]來方便取值。但改用pointer也是相通的。 PS 你用了好多括號,有些是不需要的,原本是可以增加可讀性,但我卻看昏了…不習慣@@ ps2 code區好難改,二個for一直顯示有問題,只好貼到code區的外面了
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
juneo
高階會員 發表:103 回覆:190 積分:118 註冊:2004-05-13 發送簡訊給我 |
感謝,有點知道了,其他陣列的用法我在查一下資料
另外最後po上改好的程式碼. 重點地方就用粗體標起, 好像不能用顏色>"< [code cpp] void __fastcall TForm1::Button6Click(TObject *Sender) { // int (m[3])[5] = {{1,1,1,5,6},{2,2,2,5,6},{3,3,3,5,6}}; int leng_col = sizeof(m[0])/sizeof(m[0][0]); //算出陣列大小 int leng_rol = sizeof(m)/sizeof(m[0]); //算出陣列大小 matrix_5(*m,leng_col,leng_rol); //<----傳入陣列指標 } //--------------------------------------------------------------------------- void __fastcall TForm1::matrix_5(int* m,int leng_col, int leng_rol) { //傳入N維陣列後 變更內容 for(int i=0;i } //---------------------------------------------------------------------------[/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |