Ненулевой статус IOSTAT при создании чистого файла - PullRequest
0 голосов
/ 21 июля 2009

У меня есть следующий код на Фортране. Пожалуйста, объясните мне ..

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

Здесь IOCHK не инициализируется в 0, он дает некоторое значение мусора, так что мой код не работает ..

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

Могу ли я инициализировать его отдельно?

Ответы [ 3 ]

3 голосов
/ 21 июля 2009

kgiannakakis правильно - вы должны объявить IOCHK как целое число.

Однако есть несколько других вещей, на которые я должен обратить внимание:

  1. После оператора OPEN, IOCHK будет сохранять состояние операции ввода-вывода, какой бы она ни была. Вам не нужно заранее устанавливать значение IOCHK, так как оно будет просто отброшено.
  2. Вы должны использовать IMPLICIT NONE в своем коде - это помечает необъявленные переменные, подобные этой, как ошибки времени компиляции, и делает поиск таких проблем намного проще.
  3. Прочитав этот и другие ваши вопросы, вы пишете этот код или просто поддерживаете его? Если вы пишете это, вам, вероятно, не следует писать в версии стиля / языка, которая старше меня.
1 голос
/ 21 июля 2009

IOCHK не объявлен и не инициализирован в вашем коде. Перед оператором OPEN должно быть что-то вроде этого:

INTEGER IOCHK
IOCHK = 0

Выше объявляется целочисленная переменная и присваивается ей значение.

0 голосов
/ 23 июня 2015

Если вы не хотите объявлять переменные, вы можете использовать следующую строку в начале ваших подпрограмм

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, что означает, что рабочий файл был успешно открыт.

Надеюсь, это поможет

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...