Fortran读取语句的读取顺序

3
假设我有一个文件,每一行都包含一个数组索引,后跟数组的值。
i  array(i)

我只用一个简单的read(unit=10, *) i, array(i)就可以读取数据吗?Fortran是否总是先读取i,然后使用这个i值为array(i)赋值?特定的read规范或编译器标记会影响行为吗?

1个回答

3
数据传输语句
read(unit=10,*) i, array(i)

这是一个合法的操作,其行为符合预期:首先读取i的值,然后使用该值来确定要读取的数组元素array(i)的第二个值。

这是Fortran规范的要求,例如(Fortran 2018,12.6.4.5.1):

在处理输入/输出列表项之前,需要确定确定哪些实体由该项指定的所有值。

当然,尽管此数据传输语句可能有效,但这并不意味着在除了最简单的情况下都是理想的,在这种情况下您可以信任输入数据。特别是,在此读取语句期间无法检查边界。如果读取的i值对应于无效的数组元素规范,则程序将出现错误。您可能希望仅使用数组元素的中间值来处理输入文件可能出现的问题。


1
我甚至会说这样的代码暴露了一个很大的漏洞,但如果它只是作者使用的单次使用代码,那就无所谓了。编译器标志用于边界检查是非常强烈推荐的。 - Vladimir F Героям слава
在这个读取语句期间,无法进行任何边界检查。这是一个实现质量问题而不是完全不可能的问题吗?或者您指的是程序员的“手动”检查?如果是这样,那么这是有道理的。 - Ian Bush
是的,@IanBush,程序员进行输入验证。编译器运行时通常提供边界检查,但通常意味着“我注意到你的程序已经出了问题,但我不会让你继续认为一切都很好”。 - francescalus
为了检查边界,我会使用一个临时变量来存储数组元素:read(unit=10,*) i, temp。然后检查边界错误,然后将数组元素分配给temp:array(i) = temp - Dan Sp.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接