0

我不明白为什么这段应该执行矩阵乘法的代码出错了。

输入: 2x2 矩阵,两个矩阵中都有元素 1,2,3,4

预期产量: 7 10 15 22

此代码给出的输出: 15 22 12 16

int a[10][10], b[10][10], c[10][10], i, j, k, r1, c1, r2, c2;

int (*pa)[10][10] = &a, (*pb)[10][10] = &b, (*pc)[10][10] = &c;

for ( i = 0; i < r1; i++) {
    for(j = 0; j < c2; j++) {
         *pc[i][j] = 0;
        for(k = 0; k < c1; k++) {
            *pc[i][j] += *pa[i][k] * *pb[k][j];
        }
    }
}

我尝试使用这样的打印语句进行调试,结果如下:

当给定以 1,2,3,4 作为元素的 2x2 矩阵时,会产生以下错误:

at 00 of a is 3
at 00 of b is 1
Elements you're multiplying: 3  1

但预期的输出是这样的:

at 00 of a is 1
at 00 of b is 1

(其他元素似乎也是如此) 此处未粘贴的其余代码没有错误。使用打印语句彻底检查它。

4

1 回答 1

0

首先参考这些答案:

C多维数组中的指针地址

创建指向二维数组的指针

两者一起回答你的问题。这是您的代码的工作版本(简单版本):

#include<stdio.h>

void main()
{
    int a[2][2]={{1,2},{3,4}};
    int b[2][2]={{1,2},{3,4}};
    int c[2][2], i, j, k, r1=2, c1=2, r2=2, c2=2;

    int (*pa)[2] = a, (*pb)[2] = b, (*pc)[2] = c;

    for ( i = 0; i < r1; i++) 
    {
        for(j = 0; j < c2; j++) 
        {
            pc[i][j] = 0;
            for(k = 0; k < c1; k++) 
            {
                pc[i][j] += pa[i][k] * pb[k][j];
            }
        }
    }
    for(i=0;i<2;i++)
    {
        printf("\n");
        for(j=0;j<2;j++)
        {
            printf("%d\t",c[i][j]);
        }
    }

}
于 2019-02-13T05:45:31.093 回答