Re: 矩陣運算
※ 引述《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
10/14 22:54, 1F
※ 編輯: VictorTom 來自: 220.132.174.98 (10/14 22:58)
→
10/14 23:30, , 2F
10/14 23:30, 2F
討論串 (同標題文章)