我有以下 Fortran 代码。请解释我..
OPEN(UNIT=4,STATUS='SCRATCH',ACCESS='DIRECT',RECL=2048,IOSTAT=IOCHK)
这里 IOCHK 未初始化为 0,它给出了一些垃圾值,因此我的代码无法正常工作..
IF(IOCHK.NE.0)THEN
// failed code
我可以单独初始化它吗?
我有以下 Fortran 代码。请解释我..
OPEN(UNIT=4,STATUS='SCRATCH',ACCESS='DIRECT',RECL=2048,IOSTAT=IOCHK)
这里 IOCHK 未初始化为 0,它给出了一些垃圾值,因此我的代码无法正常工作..
IF(IOCHK.NE.0)THEN
// failed code
我可以单独初始化它吗?
kgiannakakis 是正确的 - 您应该声明IOCHK
为整数。
但是,还有一些其他的事情我应该指出:
OPEN
语句之后,IOCHK
将保持 I/O 操作的状态,无论它可能是什么。您不需要IOCHK
预先设置值,因为它会被丢弃。IMPLICIT NONE
在您的代码中使用 - 这会将此类未声明的变量标记为编译时错误,并使查找此类问题变得更加容易。您的代码中既没有声明也没有初始化 IOCHK。在 OPEN 语句之前你应该有这样的东西:
INTEGER IOCHK
IOCHK = 0
上面声明了一个整数变量并为其赋值。
如果您不想打扰声明变量,可以在子例程的开头使用以下行
implicit integer (i-n)
这将使所有以 (in) 范围内的字母开头的变量都声明为整数。
use
您当然可以在感兴趣的子例程的开头单独声明您的变量,或者您可以将它放在一个模块中,以通过语句使其对代码的其他部分可见。
INTEGER :: IOCHK
您还应该确保IOCHK
仅在 fileOPEN
语句之后检查状态,否则整个练习没有意义,因为 IOCHK 尚未初始化。默认情况下初始化变量的值取决于编译器。例如
program main
write(*,'(A8,I5)') 'M = ' ,M
stop
end program
M = 0
将同时使用ifort
and打印gfortran
,但是
program main
write(*,'(A8,ES20.5)') 'M = ' ,M
stop
end program
将失败gfortran
。
一般来说,我认为如果IOCHK
没有明确声明你不应该有问题。例如,考虑以下代码
PROGRAM MAIN
OPEN(UNIT=4,STATUS='SCRATCH',ACCESS='DIRECT',RECL=2048,IOSTAT=IOCHK)
IF(IOCHK==0) write(*,'(A8,I5)') 'IOCHK = ' ,IOCHK
STOP
END PROGRAM
当两者都编译时ifort
,gfortran
这会打印IOCHK = 0
在屏幕上,这意味着暂存文件已成功打开。
希望这可以帮助
干杯