0

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

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

这里 IOCHK 未初始化为 0,它给出了一些垃圾值,因此我的代码无法正常工作..

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

我可以单独初始化它吗?

4

3 回答 3

3

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

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

  1. OPEN语句之后,IOCHK将保持 I/O 操作的状态,无论它可能是什么。您不需要IOCHK预先设置值,因为它会被丢弃。
  2. 您应该IMPLICIT NONE在您的代码中使用 - 这会将此类未声明的变量标记为编译时错误,并使查找此类问题变得更加容易。
  3. 在阅读了这个和你的其他问题之后,你是在编写这段代码还是只是在维护它?如果你正在写它,你可能不应该用比我更老的风格/语言版本来写。
于 2009-07-21T15:47:00.590 回答
1

您的代码中既没有声明也没有初始化 IOCHK。在 OPEN 语句之前你应该有这样的东西:

INTEGER IOCHK
IOCHK = 0

上面声明了一个整数变量并为其赋值。

于 2009-07-21T07:30:36.690 回答
0

如果您不想打扰声明变量,可以在子例程的开头使用以下行

implicit integer (i-n)

这将使所有以 (in) 范围内的字母开头的变量都声明为整数。

use您当然可以在感兴趣的子例程的开头单独声明您的变量,或者您可以将它放在一个模块中,以通过语句使其对代码的其他部分可见。

   INTEGER :: IOCHK

您还应该确保IOCHK仅在 fileOPEN语句之后检查状态,否则整个练习没有意义,因为 IOCHK 尚未初始化。默认情况下初始化变量的值取决于编译器。例如

  program main
  write(*,'(A8,I5)')  'M = ' ,M
  stop
  end program

M = 0将同时使用ifortand打印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在屏幕上,这意味着暂存文件已成功打开。

希望这可以帮助

干杯

于 2015-06-23T09:03:46.570 回答