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

二維矩陣傳入函數的問題

答題得分者是:aftcast
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-25 15:06:49 IP:140.114.xxx.xxx 訂閱
請教一下:
我想傳入二維陣列,到函數後想做反矩陣跟轉置矩陣,
我知道有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 for(int j=0;j {
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-25 23:04:45 IP:122.120.xxx.xxx 訂閱
------


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

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-11-25 23:12:13, 註解 無‧
aftcast 重新編輯於 2008-11-25 23:13:24, 註解 無‧
aftcast
站務副站長


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-25 23:15:54 IP:122.120.xxx.xxx 訂閱
你好,

關於第二維的值是不能為變數的,一定要是常數,這與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 for (int j=0;j {
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
編輯記錄
aftcast 重新編輯於 2008-11-25 23:18:29, 註解 無‧
aftcast 重新編輯於 2008-11-25 23:21:01, 註解 無‧
aftcast 重新編輯於 2008-11-25 23:22:11, 註解 無‧
aftcast 重新編輯於 2008-11-25 23:26:22, 註解 無‧
aftcast 重新編輯於 2008-11-25 23:27:53, 註解 無‧
aftcast 重新編輯於 2008-11-25 23:30:14, 註解 無‧
juneo
高階會員


發表:103
回覆:190
積分:118
註冊:2004-05-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-26 11:53:04 IP:140.114.xxx.xxx 訂閱
感謝,有點知道了,其他陣列的用法我在查一下資料
另外最後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 for(int j=0;j SG2->Cells[j][i] = IntToStr(*(m i*leng_col j)); //<----取出陣列數值
}
//---------------------------------------------------------------------------[/code]
編輯記錄
juneo 重新編輯於 2008-11-26 11:55:02, 註解 無‧
juneo 重新編輯於 2008-11-26 11:55:57, 註解 無‧
系統時間:2024-05-07 12:52:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!