这是我的源代码:
for(j=0; j<n-1; j++) {
printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, idx(n, j+1, j), A[idx(n, j+1, j)], epsilon*norm);
if(A[idx(n,j+1,j)] < epsilon*norm) {
A[idx(n,j+1,j)] = 0;
}
}
这是我的idx宏:
#define idx(__n__, __i__, __j__) __j__ + __n__*(__i__)
在我看来,第2行,第3行代码必须产生相同的输出,但事实并非如此。相反,我得到这样的输出(n等于5):
(1 0)->(5) {5.393394651 < 0.000000000 }
(1 0)->(1) {6.171880741 < 0.000000000 }
(2 1)->(11) {2.966791392 < 0.000000000 }
(2 1)->(7) {2.850418342 < 0.000000000 }
(3 2)->(17) {3.370025863 < 0.000000000 }
(3 2)->(13) {4.128639694 < 0.000000000 }
(4 3)->(23) {0.290962836 < 0.000000000 }
(4 3)->(19) {0.147772573 < 0.000000000 }
我尝试使用标志E运行gcc以查看预处理器对代码执行的操作,但我看到了相同的代码行。
for(j=0; j<n-1; j++) {
printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
printf("(%d %d)->(%d) {%1.9lf < %1.9lf }\n", j+1, j, j + n*(j+1), A[j + n*(j+1)], epsilon*norm);
if(A[j + n*(j+1)] < epsilon*norm) {
A[j + n*(j+1)] = 0;
}
}
它出了什么问题?
答案 0 :(得分:1)
您的宏没有正确地将扩展中的参数括起来:
#define idx(__n__, __i__, __j__) __j__ + __n__*(__i__)
应该是:
#define idx(n, i, j) ((j) + (n) * (i))
除非你真的意味着疯狂。
这是一个错误,但不会导致您的问题。尝试将printf
的{{1}}格式修改为double
而不是%f
。另外,请验证%lf
和j
,n
,A
和epsilon
的类型是否与norm
格式一致。