我正在尝试将数组相乘,
函数 mul 是矩阵乘法:
typedef int array2d [3][3];
array2d arr,A,B,C,D,r,s,k;
array2d* mul(array2d r,array2d s)
{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
arr[i][j]=0;
for(int k=0;k<3;k++){
arr[i][j]+=(r[i][k] * s[k][j])%31;
}
}
}
return &arr;
}
在 main 函数中输入A,B C和D值,然后我调用 mul :
array2d *a1;
a1 = mul(A,B);
array2d *a2;
a2 = mul(C,D);
调用第一个函数将返回正确的a1值。
但是一旦调用了第二个函数 ,a1将具有相同的a2值。
我该如何解决这个问题?
由于
答案 0 :(得分:1)
(编辑:这不起作用 - 下面是这样做的) 这是更好的解决方案;对局部变量(不是全局变量)执行计算,然后将副本 - 而不是指针 - 返回给它:
array2d mul(array2d r,array2d s) {
array2d arr;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
arr[i][j]=0;
for(int k=0;k<3;k++)
arr[i][j]+=(r[i][k] * s[k][j])%31;
}
}
return arr;
}
编辑:
在C中,不可能从函数返回数组。因此,一种可能性是传递mul
函数显式存储其结果的位置,如下所示:
void mul(array2d* arr, array2d r,array2d s)
{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
(*arr)[i][j]=0;
for(int k=0;k<3;k++)
(*arr)[i][j]+=(r[i][k] * s[k][j])%31;
}
}
}
并像这样调用它:
array2d a1, a2, r;
mul(&r, a1, a2);
现在r
包含a1
和a2
的乘法结果。
答案 1 :(得分:-1)
您正在返回指向全局arr
的指针,因此第二个调用将覆盖您在第一个调用中设置的值。试试这个:
void mul(const array2d ar1, const array2d ar2, array2d retArr)
{
// perform calc
}