我正在通过 Brian Hahn为科学家和工程师编写的 Fortran 90一书学习 Fortran。在第 9 章关于数组的第 131/132 页中,他给出了以下代码作为动态数组的示例
Program Chap_9_Allocatable_Array
Implicit none
! Variables
Real, dimension(:), Allocatable :: X, OldX
Real A
Integer IO, N, i
! Body of Chap_9_Allocatable_Array
Allocate( X(0) ) !Size zero to sart with?
N = 0
Open(1, File = 'Data.txt')
Do
Read(1, *, IOStat = IO) A
If (IO < 0) Exit
N = N + 1
Allocate( OldX( Size(X) ) )
OldX = X !Entire array can be assigned
Deallocate( X )
Allocate( X(N) )
X = OldX
X(N) = A
Deallocate( OldX )
End do
Print *, (X(i), i = 1, N)
End program Chap_9_Allocatable_Array
我已经使用英特尔 Visual Fortran 编译器在 Visual Studio Community 2019 中实现了这个程序。正如他解释的那样,这个程序的目的是
以下程序摘录展示了如何使用可分配数组(这些野兽被称为)来读取未知数量的数据,不幸的是,由于 READ 的工作方式,必须每行提供一个项目。
我发现了一个有趣的错误。文件 data.txt 包含 100 个随机数,每行 1 个。当我尝试运行它时,它似乎只是停顿了几秒钟,然后控制台简单地打印了
按任意键继续。
提示,没有错误信息。我已经插入了一些调试打印,并确定程序在停止之前运行了 3 到 8 次 do 循环。我无法确定原因。如果我随后将 data.txt 文件更改为只有 3 个数字,程序将按预期运行。通过调试打印,我将错误固定为
Deallocate( X )
线。如果我在 Visual Studio 中调试程序,我只会收到以下消息:
Chap_9_Allocatable_Array.exe 已触发断点。
书中有一些小错误。就在这个例子中,作者似乎忘记声明i,导致编译错误。但是,由于我只是开始了解数组,所以我不知道还能尝试什么。有任何想法吗?