奇怪的宏行为
Strange macro behaviour
这是我的一段源代码:
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;
}
}
有什么问题吗?
您的宏没有正确地括起扩展中的参数:
#define idx(__n__, __i__, __j__) __j__ + __n__*(__i__)
应该是:
#define idx(n, i, j) ((j) + (n) * (i))
除非你真的有什么疯狂的意思。
这是一个错误,但不会导致您的问题。尝试将 double
的 printf
格式修复为 %f
而不是 %lf
。还要验证j
和n
、A
、epsilon
和norm
的类型是否与printf
格式一致。
这是我的一段源代码:
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;
}
}
有什么问题吗?
您的宏没有正确地括起扩展中的参数:
#define idx(__n__, __i__, __j__) __j__ + __n__*(__i__)
应该是:
#define idx(n, i, j) ((j) + (n) * (i))
除非你真的有什么疯狂的意思。
这是一个错误,但不会导致您的问题。尝试将 double
的 printf
格式修复为 %f
而不是 %lf
。还要验证j
和n
、A
、epsilon
和norm
的类型是否与printf
格式一致。