【发布时间】:2017-06-20 20:14:19
【问题描述】:
我正在学习 Fortran 的基础知识。我创建了一个初始化矩阵的简单子程序:
program test
integer, parameter :: n = 1024
real :: a(n, n)
call init(a)
write (*, *) a(1, 1)
end program
subroutine init(a)
real :: a(n, n)
a(:, :) = 3.0
end subroutine
那么输出是0.0,而不是预期的3.0。除此之外,valgrind 表示:
==7006== Conditional jump or move depends on uninitialised value(s)
==7006== at 0x400754: init_ (in /home/marcin/proj/mimuw/fortran/test)
==7006== by 0x4007A4: MAIN__ (in /home/marcin/proj/mimuw/fortran/test)
==7006== by 0x40083B: main (in /home/marcin/proj/mimuw/fortran/test)
为什么? n 参数被编译器正确识别,应该是全局的。
我用 gfortran 6.3.1 编译了程序
【问题讨论】:
-
也许您正在考虑一个内部程序。
-
n不是全局对象。如果你在子程序中添加implicit none,你会看到一个错误。 -
哦,所以我在子程序中也需要
implicit none!不知道。在测试时,我尝试在program中使用它,但在subroutine中没有。是否可以全局使用implicit none? -
由于各种程序单元的独立编译性质(正如 Vladimir F 所提到的),没有真正意义上的“全局”范围界定。您可以在this question 中找到有关隐式类型规则的详细信息。