创建临时文件时非零IOSTAT状态

时间:2009-07-21 07:04:57

标签: fortran

我有以下Fortran代码。请解释一下..

OPEN(UNIT=4,STATUS='SCRATCH',ACCESS='DIRECT',RECL=2048,IOSTAT=IOCHK)

这里IOCHK没有初始化为0,它给出了一些垃圾值,这样我的代码就不起作用了。

IF(IOCHK.NE.0)THEN
// failed code

我可以单独初始化吗?

3 个答案:

答案 0 :(得分:3)

kgiannakakis是正确的 - 您应该将IOCHK声明为整数。

但是,我还应该指出一些其他的事情:

  1. OPEN语句之后,IOCHK将保持I / O操作的状态,无论可能是什么。您不需要事先设置IOCHK的值,因为它将被丢弃。
  2. 您应该在代码中使用IMPLICIT NONE - 这会将未声明的变量标记为编译时错误,并且可以更轻松地查找这类问题。
  3. 在阅读了这个以及您的其他问题之后,您是在编写此代码还是只是维护它?如果您正在编写它,那么您可能不应该使用比我年长的样式/语言版本。

答案 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 = 0ifort打印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

使用ifortgfortran进行编译时,会在屏幕上打印IOCHK = 0,这意味着临时文件已成功打开。

希望这有帮助

干杯