作者VictorTom (鬼翼&娃娃鱼)
看板C_and_CPP
标题Re: 矩阵运算
时间Wed Oct 14 22:50:22 2009
※ 引述《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
1F:→ VictorTom:第一小段应该是return"阵列", matrix != array....Orz 10/14 22:54
※ 编辑: VictorTom 来自: 220.132.174.98 (10/14 22:58)
2F:→ VictorTom:刚发现, 好像搭配上下篇的typedef, 就不用写struct了XD 10/14 23:30