【问题标题】:Automatic width integer descriptor in fortran 90fortran 90 中的自动宽度整数描述符
【发布时间】:2015-04-11 00:58:47
【问题描述】:

我想在 fortran 90 中使用自动整数宽度描述符。我提到了Output formatting: too much whitespace in gfortran 这个问题说我可以将I0F0,0 用于“自动”宽度。 这是我的示例代码(符合 GNU Fortran 编译器):

PROGRAM MAIN
IMPLICIT NONE

INTEGER :: i
REAL :: j

WRITE (*,*) 'Enter integer'
READ (*,100) i
100 FORMAT (I0)

WRITE (*,*) 'Enter real'
READ (*,110) j
110 FORMAT (F0.0)

WRITE (*,100) 'Integer = ',i
WRITE (*,110) 'Real = ',j

END PROGRAM

存在运行时错误(unit = 5, file = 'stdin') Fortran runtime error: Positive width required in format

我是否误解了自动宽度描述符?我应该使用什么选项?

【问题讨论】:

  • 只在读取上列出定向 i/o (read(*,*))
  • 我在建议stackoverflow.com/q/21170031 重复和回答之间纠结。最后,我认为对重点问题明确声明“没有I0”是明智的。
  • 请注意,I0 描述符是在 Fortran 95 修订版中添加到 Fortran 标准的 - Fortran 90(第 10.2.1 节)要求整数编辑描述符的宽度为正数。

标签: fortran gfortran fortran90 fortran95


【解决方案1】:

使用I0 指定允许输出的最小字段宽度。对于输入,I0 是不允许的。

来自 Fortran 2008, 10.7.2.1 (6)(我的重点):

在输出时,使用 I、B、O、Z、F 和 G 编辑,字段宽度 w 的指定值可能为零。在这种情况下,处理器选择不会导致字段被星号填充的最小正实际字段宽度。 w 的指定值在输入时不应为零。

对于输入没有明确的替代I0,但作为agentp cmets,列表导向输入(read(*,*))很简单,很可能适合您的需求。如果不是,那么您可以研究对作为字符变量读入的行进行更一般的解析。你可以find后者的例子。

【讨论】:

  • 我知道应该使用read(*,*)。但是当从一个文件中读取一个矩阵(比如 5x5)时呢?第一行将有 5 个不同宽度的实数。您对如何阅读此类文件有什么建议吗?
  • 如果你想通过列表导向输入读取五个实数,只需在输入列表中指定五个实数:read(*,*) a(1,1:5),比如说。无论是使用显式格式还是列表导向,都是一样的。不同之处在于列表导向处理不同的宽度。
【解决方案2】:

除了 @francescalus 和 @agentp 的答案之外,请注意格式标签,例如应该避免100 FORMAT (I0)

相反,只需将format 包含在read 中,例如如果你想读取一个最多 8 个字符宽的整数,READ(*,'(I8)') i

如果你有一个很长的格式或者你在几行代码中重复使用的格式,把它保存在一个字符串中:

character :: form*64
real      :: r1, r2

form = '(es13.6)'  ! e.g. 9.123456e+001

.
.
.

WRITE (*,*) 'Enter a number'
READ (*, form) r1
WRITE (*,*) 'Enter another number'
READ (*, form) r2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-14
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 2015-08-07
    相关资源
    最近更新 更多