0

我正在通过 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,导致编译错误。但是,由于我只是开始了解数组,所以我不知道还能尝试什么。有任何想法吗?

4

0 回答 0