【问题标题】:Why does this matrix multiplication code not work [closed]为什么这个矩阵乘法代码不起作用[关闭]
【发布时间】:2016-03-21 18:25:59
【问题描述】:
#include<stdio.h>
#include<conio.h>
int main()
{
int ar1[3][3] = {{1,0,0},{0,1,0},{0,0,1}};
int ar2[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int ar3[3][3];
int i,j,k;
for(i=0;i<3;i++)
{
    ar3[i][j] = 0;
    for(j=0;j<3;j++)
    {
        for(k=0;k<3;k++)
        {
            ar3[i][j] = ar3[i][j]+(ar1[i][k]*ar2[k][j]);
        }
    }
}
for(i=0;i<3;i++)
{
    for(j=0;j<3;j++);
    printf("%d\t",ar3[i][j]);
}
getch();
return 0;
}

当我在 Dev C++ 中编译代码时,它没有给出任何错误但无法运行并且应用程序停止工作。有什么问题?

【问题讨论】:

  • C 和 C++ 是不同的语言!这看起来像 C!
  • @Olaf:他正在使用 C++ 编译器。代码是(除了错误)有效的 C++。请do not retag based on (lack of) API usage
  • 停止重新标记并阅读meta.stackoverflow.com/a/287495/103167
  • @BenVoigt:我不是千里眼。我在哪里错过这不是编译为C? AFAIK Dev C++ 是一个可用于 C 和 C++ 代码开发的 IDE,所以提到 IDE 并没有暗示所使用的语言。它只使用 C 结构。
  • @Olaf 如果您不是千里眼 - 为什么您“知道” OP 将代码编译为 C 而不是 C++?正如所指出的,代码对于 C 和 C++ 都是有效的。唯一反对它的是使用未初始化的变量作为索引,并包含stdio.h,但是作为C程序的有效性也会失效,并且包含非标准头(conio.h)表明另一个非标准标题可能没问题。

标签: c++ c arrays multidimensional-array matrix-multiplication


【解决方案1】:

上线

ar3[i][j] = 0;

j 仍然是垃圾,所以您会得到未定义的行为,这可能会导致不同类型的错误 - 错误结果、段错误,在极少数情况下它甚至可能按预期工作。

将那条线移到第二个循环内。

【讨论】:

    【解决方案2】:

    您应该将arr3[i][j] 初始化为0int arr3[i][j]={0};。同样在显示乘法矩阵时,您使用j 关闭了第二个循环。不要关闭它,否则您将无法获得所需的输出。我纠正了它。希望这篇能解决你的问题。

    #include<stdio.h>
    #include<conio.h>
    int main()
    {
    int ar1[3][3] = {{1,0,0},{0,1,0},{0,0,1}};
    int ar2[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    int ar3[3][3] = {0}; // here goes initialization
    int i,j,k;
    for(i=0;i<3;i++)
    {
      for(j=0;j<3;j++)
      {
        for(k=0;k<3;k++)
        {
            ar3[i][j] = ar3[i][j]+(ar1[i][k]*ar2[k][j]);
        }
      }
    }
    for(i=0;i<3;i++)
    {
      for(j=0;j<3;j++)
        {
        printf("%d\t",ar3[i][j]);
        }
      printf("\n");
    }
    getch();
    return 0;
    }
    

    【讨论】:

    • 您的版本仍然有我在回答中提到的狂写。
    • 哦,是的,实际上我没有看过。顺便说一句,这不会改变答案,因为 j=3 和 a[i][3] 不会退出。还是谢谢指正
    • j 将等于 3 仅在内部循环通过后,如果程序以某种方式在写入 a[i][-100500] 之类的地方幸存下来,这是不太可能的。
    • 第一次。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    相关资源
    最近更新 更多