Identity Matrix生成器使用错误值填充矩阵

时间:2014-05-25 20:47:26

标签: c matrix

我在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   

为什么这种奇怪的行为?有什么建议可以解决这个问题吗?

2 个答案:

答案 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并查看它何时开始失败。