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

C 检查矩阵是否对称,我得到的结果总是相同的,c,function,multidimensional-array,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(matri

我写了一个函数来检查矩阵是否对称。如果是,则返回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;
}
#包括
#包括
#定义最大值100
int对称性(int矩阵[][max]){
int i,j;

对于(i=0;i,应更改以下语句

x=对称性(方阵[4][4]);

x=对称性(方阵);

square\u matrix[4][4]
只是提供索引中的一个元素。请传递地址。

更改此项:

x= Symmetrie(square_matrix[4][4]);
为此:

x = Symmetrie(square_matrix);
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]) {
      |                ~~~~^~~~~~~~~~~~~
正如您在中所看到的。

修改您的呼叫

x=对称性(方阵[4][4]);


x=Symmetrie(&square_matrix[0][0]);

正如其他人所说,您应该更改:

x = Symmetrie(square_matrix[4][4]);
为此:

x = Symmetrie(square_matrix);
x = Symmetrie(square_matrix);
但是,我想补充一点,你只需添加一个小字体,就可以很容易地找到它

一个简单的
printf(“%d=?=%d”,矩阵[i][j],矩阵[j][i])
就在
的正上方,如果
的话,你会发现这些数字都是乱七八糟的


<强>或<>强>,如“丹尼尔建议”,有些编译器认为这是一个警告,而不应忽略这些。对于其他编译器,添加“代码> -Walth作为编译标志也会帮助您捕捉到这一点。

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

#包括
#包括
#包括
布尔是对称的(大小n,整数矩阵[n][n])
{
对于(尺寸i=0;i
您只传递一个数字平方矩阵[4][4]。将其作为x=Symmetry(平方矩阵)传递;这甚至不应该编译,至少在没有警告的情况下是这样。您传递的是
int
而不是数组,并且您访问的数组超出了范围。请参阅上的警告。另外,如果您硬编码4x4矩阵,为什么要使用
max
?关于:
x=Symmetrie(square\u matrix[4][4])
这是传递一个元素,其中一行和一个元素超过了实际矩阵的末尾。建议:
x=Symmetrie(square\u matrix);
还将
-Wall
添加到编译行中(您甚至不需要
-Wextra
-pedantic
,我也建议这样做)将捕获错误。@DanielH,tnx,added@DanielH,检查我的。不需要警告标志…虽然它不应该伤害ofc;)@gsamaras哦,你是对的。我编译时已经打开了
-Wall
,它确实暴露了另一个警告(数组访问超出范围),但我没有在没有任何警告的情况下尝试它。@gsamaras我应该仔细检查我所做的事情。使用,我从GCC得到一个警告,外部数组的元素4没有初始化;如果没有优化,GCC似乎看不到这一点。在Clang中,即使没有
-Wall
,我提到的关于4的错误超出了内部数组的界限.mmm为什么要用符号和?我不明白传递元素的地址如果不使用符号和@Amerov,那么传递类似于传递
square\u矩阵[4][4]
,正如您在代码中所做的那样,唯一的区别是传递不同的元素。该方法需要整个矩阵,而不仅仅是一个元素!@gsamaras因此,如果我以这种方式将对称性(square_matrix[4][4])作为参数,我只传递一个元素,对吗?