检查矩阵是否对称并且我总是得到相同的结果

时间:2019-01-16 08:51:43

标签: c function multidimensional-array

我写了一个检查矩阵是否对称的函数。如果是,它将返回1,否则返回0。 它总是返回零。我试图找出错误的出处,但对我来说一切似乎都是正确的。

我的代码是:

#include <stdio.h>
#include <stdlib.h>
#define max 100

int Symmetrie (int matrix[][max]) {
  int i,j;
  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      if(matrix[i][j] != matrix[j][i]) {
        return 0;
      }
    }
  }
  return 1;
}

int main() {
  int x;
  int  square_matrix[][max]={{1,2,3,4}
    ,{2,2,5,6}
    ,{3,5,3,7}
    ,{4,6,7,4}
  };
  x= Symmetrie(square_matrix[4][4]);
  if(x==1) {
    printf("1");
  } else {
    printf("0");
  }
  return 0;
}

该函数应返回1,但返回零。我想念什么?

5 个答案:

答案 0 :(得分:6)

更改此:

x= Symmetrie(square_matrix[4][4]);

对此:

x = Symmetrie(square_matrix);

因为您的方法希望将整个矩阵作为其参数,而不仅仅是元素。

square_matrix[4][4]是矩阵的单个元素,即第5行和第5列中的元素。当然,这会调用未定义行为(UB),因为您的矩阵有4行。

更重要的是,不要忽略生成的警告。例如,在GCC中,您将获得以下内容:

prog.c: In function 'main':
prog.c:24:32: warning: passing argument 1 of 'Symmetrie' makes pointer from integer without a cast [-Wint-conversion]
   24 |   x= Symmetrie(square_matrix[4][4]);
      |                ~~~~~~~~~~~~~~~~^~~
      |                                |
      |                                int
prog.c:5:20: note: expected 'int (*)[100]' but argument is of type 'int'
    5 | int Symmetrie (int matrix[][max]) {
      |                ~~~~^~~~~~~~~~~~~

如您在 Live Demo 中看到的。

答案 1 :(得分:3)

就像其他人一样,您应该更改:

x = Symmetrie(square_matrix[4][4]);

对此:

x = Symmetrie(square_matrix);

但是,我想补充一点,就是说您只需添加一个小字就可以很容易地自己找到它。

printf("%d =?= %d", matrix[i][j], matrix[j][i])上方的一个简单if会告诉您数字都是乱码。

,如@DanielH所建议的那样,某些编译器将此视为警告,您不应忽略它们。对于其他编译器,将-Wall添加为编译标志也可以帮助您了解这一点。

答案 2 :(得分:2)

修改通话

call devenv

x= Symmetrie(square_matrix[4][4]);

答案 3 :(得分:1)

以下声明应更改

x= Symmetrie(square_matrix[4][4]);

x= Symmetrie(square_matrix);

square_matrix[4][4]只是提供的索引中的单个元素。通过地址代替。

答案 4 :(得分:1)

其他答案已经显示了这个问题,但是我想指出的是,使用VLA语法,可以将数组的实际大小传递给函数。 还值得注意的是,循环只能限制为“矩阵”的一半:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool is_symmetric(size_t n, int matrix[n][n])
{
  for(size_t i = 0; i < n; ++i) {
    for(size_t j = 0; j < i; ++j) {
      //              ^^^^^
      if (matrix[i][j] != matrix[j][i]) {
        return false;
      }
    }
  }
  return true;
}

int main(void) {
  int  square_matrix[][4] = {
     {1,2,3,4}
    ,{2,2,5,6}
    ,{3,5,3,7}
    ,{4,6,7,4}
  };

  if( is_symmetric(4, square_matrix) ) {
    puts("The matrix is symmetric");
  } else {
    puts("The matrix is not symmetric");
  }
  return 0;
}