Проверить, была ли объявлена ​​переменная с использованием Fortran 77? - PullRequest
2 голосов
/ 24 мая 2011

Я работаю над кодом, в котором большая часть переменных названа abc1, abc2, abc3 и т. Д.группа из них легко, например,

  do lbl1 i = 1,100
    IF (.NOT. NULL(abc&i)) THEN
      print*, abc&i
    END IF
  lbl1..continue

Любая информация была бы отличной, большое спасибо.

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

Нет способа сделать это из Фортрана: нет встроенной функции проверки того, что переменная была определена (кроме NULL(), и это работает только для указателей). У вас есть три реальных варианта здесь:

  1. Заставить компилятор жаловаться на использование неопределенных переменных во время компиляции. Я не могу думать о компиляторе, который не делает этого, если вы включаете его стандартные предупреждения. Например, g95 скажет «Предупреждение (113): переменная« a »в (1) используется, но не установлена» при использовании с -Wall, но просто выдаст код, который выдает случайный мусор, если нет). Проблема этого подхода заключается в том, что не все такие случаи могут быть обнаружены во время компиляции - подумайте о передаче неопределенной переменной в подпрограмму, когда вы компилируете две процедуры по отдельности перед связыванием.

  2. Сделать все переменные "недействительными" и проверить это в программе. Одним из способов было бы сделать это вручную (в коде), но второй подход Пита с использованием флага компилятора лучше. Это легче с реалами, чем с целыми числами, потому что вы можете установить недопустимое значение неопределенной переменной равным NaN, что должно привести к тому, что исполняемый файл прекратит работу (и даст полезную обратную трассировку), если он используется без определения. Для g95 -freal=NaN и -fpointer=invalid полезны, -finteger=-9999 может помочь, но, вероятно, не даст столь же полезной информации отладки.

  3. Выполнять проверки во время выполнения, отслеживая, как исполняемый файл обращается к памяти. У меня был успех с Вальгриндом memcheck. Все, что вам нужно сделать, это скомпилировать код с флагами отладки (-g или чем-то еще) и запустить вашу программу через valgrind с --undef-value-errors=yes --track-origins=yes, и вы должны получить полезный отчет о том, какие переменные использовались неопределенными с обратными трассировками для каждого случая. Это будет довольно медленно (весь доступ к памяти отслеживается и обновляется битовая карта статуса), но это работает, даже для Fortran.

На практике 1 и 2 можно объединить, чтобы отловить большинство случаев - и вы действительно хотите, чтобы большинство случаев было отсортировано, прежде чем пытаться получить массивный вывод valgrind в поисках сложных случаев.

3 голосов
/ 24 мая 2011

Я могу вспомнить две связанные опции:

  1. Когда программа запускается, установите для всех этих переменных недопустимое значение (-9999).Проверьте значение во время выполнения.
  2. У некоторых компиляторов есть флаги, чтобы сделать это.Например, компилятор IBM позволяет инициализировать определенное шестнадцатеричное значение:
   -qinitauto=<hex_value> | -qnoinitauto
        Initializes each byte or word of storage for
        automatic variables to the specified hexadecimal
        value <hex_value>. This generates extra code and
        should only be used for error determination.

        Default: -qnoinitauto

Однако, как говорится на странице руководства: «Это генерирует дополнительный код и должно быть толькоиспользуется для определения ошибки. "

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