【发布时间】:2013-02-15 11:10:18
【问题描述】:
我正在编写一个对矩阵求逆的子程序。 输入是矩阵 A(n x n),输出是矩阵 invA。在子例程中,我想声明一个临时矩阵“temp”维度(n x 2n),但声明引起了奇怪的问题。在这一行之后(我在下面强调),我还声明整数 i 和 j 并将它们初始化 i = 0,j = 0。 但是调试这些 i 和 j 的值,它显示 i = 1572472 !奇怪的!!!!!如果我删除代码行“real, dimension (m, m * 2) :: temp”,那么一切都很好。谁能给我解释一下为什么?
提前致谢。 (我是 .Net 中的一名优秀程序员,现在正在学习 Fortran - 但它让我发疯!)
program weird
implicit none
Real, Dimension (2,2)::B
Real, Dimension (2,2) ::B_inversed
B(1,1) = 0.6
B(1,2) = 0.8
B(2,1) = -0.8
B(2,2) = 0.6
Call InverseMatrix(B,B_inversed)
contains
subroutine InverseMatrix(A, invA)
implicit none
real, intent(in), dimension (:,:) :: A
real, intent(out), dimension (size(a,1),size(a,2)) :: invA
real, dimension (size(a,1),2*size(a,2)) :: temp <------THIS LINE CAUSES PROBLEMS
integer:: i,j
i = 0 !<-------
j = 0 !<-------DEBUG line stops here, showing i = 3734648 !VERY WEIRD!!!!!
invA(1,1) =0.0
invA(1,2) =0.0
invA(2,1) =0.0
invA(2,2) =0.0
end subroutine
end program
这是一个非常直接的 FORTRAN 代码,但为什么我没有得到正确的 'i' 值?
【问题讨论】:
-
m 有多大?您使用什么编译器选项?这可能是由堆栈溢出引起的。
-
嗨弗拉基米尔,我只用 4 x 4 矩阵进行了测试,问题已经发生。我正在使用英特尔 Fortran 编译器
-
在您的子例程中,
i和j实际上从未用于任何事情。你确定编译器没有优化它们——为了调试器只留下未初始化的符号(因为你用-g编译)? -
@mgilson :我在后面的语句中使用它们..但是当我发现它们没有正确分配时,在我消除了问题的其他原因之后,我发现导致问题的行是我在上面展示了......所以不,不是编译器优化了这些变量。
-
如果使用 write 语句而不是使用调试器输出 i 和 j 的值会发生什么?我在 Mac 上使用 gfortran 完成此操作,程序运行良好。
标签: fortran