Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fortran 90中的自动宽度整数描述符_Fortran_Gfortran_Fortran90_Fortran95 - Fatal编程技术网

fortran 90中的自动宽度整数描述符

fortran 90中的自动宽度整数描述符,fortran,gfortran,fortran90,fortran95,Fortran,Gfortran,Fortran90,Fortran95,我想在fortran 90中使用自动整数宽度描述符。我提到 这个问题说我可以使用I0和F0,0来表示“自动”宽度。 以下是我的示例代码(遵循GNU Fortran编译器): 出现运行时错误(单位=5,文件='stdin') Fortran运行时错误:格式中需要正宽度 我是否误解了自动宽度描述符?我应该使用什么选项?使用I0指定允许输出的最小字段宽度。对于输入,不允许使用I0 从Fortran 2008,10.7.2.1(6)(我的重点): 在输出时,通过I、B、O、Z、F和G编辑,字段宽度w的指

我想在fortran 90中使用自动整数宽度描述符。我提到 这个问题说我可以使用
I0
F0,0
来表示“自动”宽度。 以下是我的示例代码(遵循GNU Fortran编译器):

出现运行时错误
(单位=5,文件='stdin')
Fortran运行时错误:格式中需要正宽度


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

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

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

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


对于输入,
I0
没有明确的替代方案,但作为agentp注释,列表定向输入(
read(*,*)
)非常简单,可能适合您的需要。如果不是,那么您可以研究作为字符变量读入的行的更一般的解析。您可以使用后者的示例。

除了@francescalus和@agentp的答案外,还应注意避免使用格式标签,例如
100格式(I0)

相反,只需将
格式
包含在
读取
中,例如,如果您想读取最多8个字符宽的整数,
读取(*,'(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

只需在读取时执行列表定向i/o(
read(*,*)
)我就在重复建议和回答之间左右为难了。最后,我认为对一个重点问题明确声明“输入时无
I0
”是明智的。请注意,
I0
描述符在Fortran 95修订版Fortran 90(第10.2.1节)中添加到Fortran标准中,要求整数编辑描述符的宽度为正。我得到了
read(*,*)应使用
。但是当从文件中读取矩阵(比如5x5)时会发生什么?第一行将有5个不同宽度的实数。你对如何读取这样的文件有什么建议吗?如果你想用列表定向输入读取五个实数,只需在输入列表中指定五个实数:
read(*,*)a(1,1:5)
,比如说。无论是使用显式格式还是直接列表,这都是一样的。不同之处在于,列表定向处理不同的宽度。
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