Re: 矩陣運算

看板C_and_CPP作者 (鬼翼&娃娃魚)時間16年前 (2009/10/14 22:50), 編輯推噓0(002)
留言2則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《cheekyboy (唷)》之銘言: : 經過i大指導之後改成為: : #define ROW 1024 : #define COL 1024 : long int output[ROW]; : long int matrix(long int arr[] [COL]); : long int matrix(long int arr[] [COL]) : { : int i,j; : for(i=0;i<ROW;i++) : { : output[i]=0; : for(j=0;j<COL;j++) : { : output[i]=output[i]+ arr[i][j]; : } : output[i]=output[i]/COL; : } : return output[i]; : } : 可是似乎對矩陣使用return不是個聰明的寫法,又參考了v大的解說和書本,又改寫為 你這樣做不是return矩陣, 只是return output矩陣的第[i]的元素.... 而且return時i值為ROW, 實際上你還會存取到超過output[]的位址.... 因為output[]是全域變數, 其實你這邊根本可以不用做return的說@_@" : #define ROW 1024 : #define COL 1024 : long int *average[ROW]; : long int *matrix(long int *); : //其中arr位址已知; : long int *matrix(long int *arr) : { : int i,j; : for(i=0;i<ROW;i++) : { : for(j=0;j<COL;j++) : { : average[i] = *(*(arr+i)+j)/COL; : } : } : return average[i]; : } : 又好像怪怪的,還請各位多多指教,話說caller是C語言裡的函數嗎?? Caller是呼叫某個function的地方, Callee是被呼叫的function.... 它們並不是什麼function, 而是簡稱使用function的主客體而已.... == 我舉幾個簡單的例子吧, 你的目的是傳入某個陣列.... 計算結果之後, 把結果放入一個陣列讓Caller能用.... 因為我沒看到你的結果可不可以放在傳入的陣列去.... 所以這會產生幾種不同作法, 我只隨便舉個幾種來.... 另外, 嚴格來說傳入陣列這件事, 只是傳了陣列的頭的address進去.... 而不是copy一整份陣列; 相對的回傳也只是一個address, 不是copy.... 所以下面的例子, 在function被呼叫前, 都要先準備好陣列空間.... 要把整個陣列傳一份copy不是不能做, 只是通常沒必要也不建議.... == 1. 用全域變數; int result[ROW]; int input[ROW][COL]; void func1(void); // 因為輸出入的資料都是全域變數 // 所以根本不需要傳入參數或回傳 main() { /* 準備input[][]的data */ func1(); } void func1(void) { /* 運算, 並把值assign進result[] */ } == 2. 傳入陣列的address以寫回結果. void func2(int *output, int (*data)[COL]); // 結果寫入第一個參數的address main() { int result[ROW]; int input[ROW][COL]; /* 準備input[][]的data */ func2(result, input); } void func2(int *output, int (*data)[COL]) { /* 運算, 並把值assign進output[] */ } 如果input[][]裡的data是可以overwrite的.... 可以直接把原本寫進output[]裡的結果.... 改寫進data[][]裡的某一個ROW去.... == 3. function裡算完結果並產生一個array.... 然後將產生的array的頭的address回傳回去.... int* func3(int (*data)[COL]); main() { int *result = NULL; int input[ROW][COL]; /* 準備input[][]的data */ result = func3(input); if(result != NULL) free(result); } int* func3(int (*data)[COL]) { int *output = NULL; output = (int*) malloc(sizeof(int) * ROW); if(output != NULL) { /* 運算, 並把值assign進output[] */ } else { /* 看要不要做錯誤處理 */ } return output; } 是C++的話, 也可以用new/delete來取代掉malloc/free的pair.... 不過我個人不是很喜歡這種malloc與free出現在不同層的寫法.... 4. 真的要傳array的話我想到是這樣做.... typedef struct _INPUT // input/output的實體在main宣告也行.... { // 但是我懶得再打太多字了說.... int data[ROW][COL]; } INPUT; typedef struct _OUTPUT { int data[ROW]; } OUTPUT; OUTPUT func4(INPUT data); main { INPUT input; OUTPUT result; /* 準備input.data[][]的data */ result = func4(input); } OUTPUT func4(INPUT data) { OUTPUT output; /* 運算, 並把值assign進output.data[] */ return output; } 但是我絕對不建議這麼做....@_@" == 當然應該還有其他方法, 或者上面四種方法也可以混搭組合.... 比如input放在全域等; 不過你的問題重點應該在result/output.... 如果我input的ROW/COL搞反了你就自己換一換吧, 我很容易搞混XD -- 以上, 如果有錯漏的, 還請板上大大指正....<(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.174.98

10/14 22:54, , 1F
第一小段應該是return"陣列", matrix != array....Orz
10/14 22:54, 1F
※ 編輯: VictorTom 來自: 220.132.174.98 (10/14 22:58)

10/14 23:30, , 2F
剛發現, 好像搭配上下篇的typedef, 就不用寫struct了XD
10/14 23:30, 2F
文章代碼(AID): #1ArUKlpg (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1ArUKlpg (C_and_CPP)