【问题标题】:Matrix Multiplication Issues in CC中的矩阵乘法问题
【发布时间】:2016-07-22 09:49:47
【问题描述】:

我正在用 C 语言制作一个矩阵乘法计算器。当我运行它时,会喷出许多数字,结果如下:

57736 segmentation fault

我哪里写错了?这是我写的代码:

int Mtx1row, Mtx1col, Mtx2row, Mtx2col, c, d, e;
int first[10][10], second[10][10], mult[10][10];

获取第一个矩阵行和列

  printf("First Matrix: # of row and col?\n");
  scanf("%d%d", &Mtx1row, &Mtx1col);

获取第二个矩阵行和列

  printf("Second Matrix: # of row and col?\n");
  scanf("%d%d", &Mtx2row, &Mtx2col);

比较第一个矩阵列与第二个矩阵行

  if (Mtx1col != Mtx2row){
    printf("Mtx1col != Mtx2row (x _ x)\n");
    return 1;
  }

获取第一个矩阵的元素

  printf("Enter elements of First Matrix: \n");
  for (c = 0; c < Mtx1row; c++)
  for (d = 0; d < Mtx1col; d++)
  {
    printf("\tEnter element %d%d: ", c+1, d+1);
    scanf("%d", &first[c][d]);
  }

获取第二个矩阵的元素

printf("Enter elements of Second Matrix: \n");
  for (c = 0; c < Mtx2row; c++)
  for (d = 0; d < Mtx2col; d++)
  {
    printf("\tEnter element %d%d: ", c+1, d+1);
    scanf("%d", &second[c][d]);
  }

将矩阵 1 和 2 相乘并存储到矩阵积中

  for (c=0; c < Mtx2row; c++){
    for (d=0; d < Mtx2col; d++){
      for (e=0; e < Mtx1col; e++){
        mult[c][d] += first[c][d] * second[d][e];
      }
    }
  }

【问题讨论】:

  • 您没有显示分配这些矩阵的代码的任何部分,也没有显示任何会“喷出”任何东西的代码。调试器在哪里说崩溃发生了?
  • 你写的代码比这还多。您正在假设您的错误在哪里。这些数组是从哪里来的?
  • 总是检查scanf的返回值
  • 我想你检查一下用户没有输入大于 10 的尺寸?
  • 您是否使用调试器逐步完成了此操作?如果你这样做了,你就会知道正在使用 Mtx1row、Mtx1col 等的哪些值。

标签: c matrix matrix-multiplication


【解决方案1】:

两个矩阵可以相乘,如果一个只有当

#columns of the first matrix = #rows of the second matrix.

因此,您需要在自己创建二维数组之前检查这一点。

if(Mtx1col == Mtx2row){
  //proceed creating the matrices
  int first[Mtx1row][Mtx1col], second[Mtx2row][Mtx2col];
  int mult[Mtx1row][Mtx2col]; // The resulting matrix is Mtx1row * Mtx2col
  // You have variable length arrays(VLAs) above.
}
else{
// put the f/b code here
}

注意

在 C11 下,VLA 是可选功能而非强制性功能, 因为它们在 C99 之下。
可变长度数组中的术语变量并不意味着您可以 创建后修改数组的长度。创建后,一个 VLA 保持相同的大小。变量这个词的意思是你 可以在第一次指定数组维度时使用变量 创建数组。


以上摘录自Stephen Prata 的C++ Primer Plus 6th edition

【讨论】:

  • 你的答案没有错,但它是如何回答问题的?
  • @4386427 我之所以这样说是因为问题中提到的方法本身是错误的。
  • 好吧,好吧......但它没有解决分段错误 - 无论如何它都没有关系,因为 OP 拒绝提供所需的信息。玩得开心:-)
【解决方案2】:

至少有一个数组变量multfirstsecond 没有为发生的访问提供足够的内存。

Mtx2rowMtx2colMtx1col 的值介于 0 和 10 之间时,内存访问应该没问题。所以请检查这些变量的值。作为第一步,您可以只printf 这些值,最好是通过程序检查来排除超出范围的值。另外,请检查矩阵是否具有矩阵乘法的兼容维度,即Mtx1col 必须等于Mtx2row

编辑:

现在显示的代码包含 scanf 语句,我可以给出以下建议。 总是检查 scanf 的返回码以确保所有参数都已被解析。您甚至可以添加一个额外的%c 以确保没有额外的输入。在您的情况下,您还必须检查读取的数组索引是否在允许范围内(此处为 0-9)。

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 2022-12-07
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多