在Fortran中使用全局变量时出现错误的结果

mar*_*trz 0 fortran fortran90

我正在学习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
Run Code Online (Sandbox Code Playgroud)

然后输出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)
Run Code Online (Sandbox Code Playgroud)

为什么?该n参数由编译器正确识别,应该是全局参数.

我用gfortran 6.3.1编译了程序

Vla*_*r F 5

n 它不是一个全局变量,它是主程序的局部变量.

子程序是主程序中完全独立的编译单元,它们不共享任何信息.

子例程可以"查看"父模块的其他变量(如果它是模块过程),或父类(主机)过程或程序的变量(如果它是内部过程).

请务必阅读Fortran程序的结构并尽可能使用模块.优先于内部程序的模块.您将看到如何将子例程放入模块或如何将其置于链接中的主程序内部.

我没有提到常见的块,只是不使用它们,它们已经过时了.并implicit none在每个编译单元中使用.