我有以下Fortran代码。请解释一下..
OPEN(UNIT=4,STATUS='SCRATCH',ACCESS='DIRECT',RECL=2048,IOSTAT=IOCHK)
这里IOCHK没有初始化为0,它给出了一些垃圾值,这样我的代码就不起作用了。
IF(IOCHK.NE.0)THEN
// failed code
我可以单独初始化吗?
答案 0 :(得分:3)
kgiannakakis是正确的 - 您应该将IOCHK
声明为整数。
但是,我还应该指出一些其他的事情:
OPEN
语句之后,IOCHK
将保持I / O操作的状态,无论可能是什么。您不需要事先设置IOCHK
的值,因为它将被丢弃。IMPLICIT NONE
- 这会将未声明的变量标记为编译时错误,并且可以更轻松地查找这类问题。答案 1 :(得分:1)
在您的代码中既未声明也未初始化IOCHK。在OPEN语句之前你应该有这样的东西:
INTEGER IOCHK
IOCHK = 0
以上声明了一个整数变量并为其赋值。
答案 2 :(得分:0)
如果您不想打扰声明变量,可以在子程序的开头使用以下行
implicit integer (i-n)
这将使所有以范围(i-n)中的字母开头的变量声明为整数。
您当然可以在感兴趣的子例程的开头单独声明您的变量,或者您可以将它放在一个模块中,以便通过use
语句使代码的其他部分可以看到它。
INTEGER :: IOCHK
您还应确保仅在文件IOCHK
语句之后检查OPEN
的状态,否则整个练习没有意义,因为IOCHK尚未初始化。默认情况下,变量初始化的值取决于编译器。例如
program main
write(*,'(A8,I5)') 'M = ' ,M
stop
end program
将同时M = 0
和ifort
打印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
,这意味着临时文件已成功打开。
希望这有帮助
干杯