为什么直接访问I / O与英特尔Visual Fortran错误配合使用

时间:2016-06-12 05:04:57

标签: compilation fortran intel-fortran watcom

这个程序

  program test

  real a(10)

  open(1, file='f1',access='direct', recl=20)
  do i=1, 10
      a(i) = i-1
  end do
  write(1, rec=1)(a(i),i=1,5)
  write(1, rec=2)(a(i),i=6,10)
  close(1)
  open(1, file='f1',access='direct',recl=8)
  read(1, rec=4)(a(i),i =5,9,4)
  print*,a
  end

在visual Fortran中工作不正确(不正确):

  0.0000000E+00   1.000000       2.000000       3.000000       9.000000
   5.000000       6.000000       7.000000      0.0000000E+00   9.000000

WATCOM的结果(正确):

  0.0000000   1.0000000       2.0000000       3.0000000       6.0000000
  5.0000000   6.0000000       7.0000000       7.0000000       9.0000000

为什么?

2 个答案:

答案 0 :(得分:2)

在编写代码时,你不应该知道在任何单位中记录的确切长度。设置recl=20recl=5并根据编译器的确切行为和确切的real大小来确定未来的问题。

您应该以编码器使用的单位询问编译器的大小:

integer :: recl5, recl2

inquire(iolength=recl5) (a(i),i=1,5)

open(1, file='f1',access='direct', recl=recl5)


...


inquire(iolength=recl2) (a(i),i =5,9,4)
open(1, file='f1',access='direct',recl=recl2)

注意:在Fortran 90中,使用子阵列表示法可以缩短它。

注意2:对于某些编译器,您的程序将永远不会工作,因为允许编译器在文件中使用记录结束标记,并且您必须始终使用相同的recl打开它。但这并不常见。

答案 1 :(得分:1)

Visual Fortran中RECL的默认单位长度是一个单词(4字节)。如果使用选项'使用字节作为RECL = unit来编译未格式化文件' (/假设:byterecl),你会得到你期望的。