Почему прямой доступ ввода-вывода работает неправильно с Intel Visual Fortran

Эта программа

  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 ответа

Решение

Длина по умолчанию для RECL в Visual Fortran - это слово (4 байта). Если вы скомпилируете с опцией "Использовать байты как RECL= единицу измерения для неформатированного файла" (/accept:byterecl), вы получите то, что ожидаете.

Вам не нужно знать при написании кода, какова длина записи в любых единицах. настройка recl=20 или же recl=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, Но это не часто.

Другие вопросы по тегам