我在C
编写了一个简单函数,它应返回所需大小的单位矩阵
float **ident(int n) {
float **b= allocate_mtx(n,n);
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
if(i=j) {
b[i][j]=1;
}
else {
b[i][j]=0;
}
}
}
//print generated matrix to check if is correct
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
printf("%.3f ",b[i][j]);
}
printf("\n");
}
return b;
}
预期结果应为
1.000 0.000 0.000
0.000 1.000 0.000
0.000 0.000 1.000
不幸的是它不起作用,方法的打印部分打印此
0.000 0.000 208.000
0.000 1.000 130.000
0.000 0.000 1.000
为什么这种奇怪的行为?有什么建议可以解决这个问题吗?
答案 0 :(得分:3)
小心if(i=j)
。这绝不等于if(i==j)
。
答案 1 :(得分:2)
正如Banthar在评论中写道,i=j
应为i==j
。
除了缩进函数体中缺少int i, j;
之外,其他代码对我来说都很合适。
要在下次发现此错误,并发现其他错误而不必请求帮助,请在编译器中启用警告。例如,gcc -W -Wall
会为我显示以下警告:
t.c:7: warning: suggest parentheses around assignment used as truth value
clang -W -Wall
也会显示警告:
t.c:7:21: warning: using the result of an assignment as a condition without parentheses [-Wparentheses]
这会立即指出代码中的错误。
如果您的代码出现0编译器错误,0编译器警告,但仍然会产生奇怪的结果,您可能希望使用valgrind
运行已编译的程序,这将为您查明一些内存访问错误。如果没有从valgrind获取任何消息,请在调试器中逐步(或使用断点)运行程序或添加一些printf
并查看它何时开始失败。