调用函数两次覆盖第一个值C ++

时间:2015-03-04 12:13:05

标签: c++ arrays function

我正在尝试将数组相乘,

函数 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值。

我该如何解决这个问题?

由于

2 个答案:

答案 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包含a1a2的乘法结果。

答案 1 :(得分:-1)

您正在返回指向全局arr的指针,因此第二个调用将覆盖您在第一个调用中设置的值。试试这个:

void mul(const array2d ar1, const array2d ar2, array2d retArr) 
{
    // perform calc
}