我写了一个检查矩阵是否对称的函数。如果是,它将返回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,但返回零。我想念什么?
答案 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;
}