2014-02-12 2 views
2

Я использую Fortran для моих исследований, а иногда, для целей отладки, кто будет вставлять в код что-то вроде этого:Найти заявление записи в Fortran

write(*,*) 'Variable x:', varx 

Проблема заключается в том, что иногда случается, что мы забываем чтобы удалить это заявление из кода, и становится трудно найти, где он печатается. Обычно я могу получить хорошую идею, где это называется «Переменная x», но иногда бывает, что эта информация может отсутствовать, и я просто вижу случайные числа.

Можно представить, что выполнение grep для записи (*, *) в основном бесполезно, поэтому мне было интересно, есть ли эффективный способ найти моего виновника, например, заставляя каждый вызов write(*,*) печатать файл и номер строки, или отслеживание stdout.

спасибо.

+0

Не могли бы вы добавить строку комментариев перед каждой, у которой есть уникальная характеристика, с которой вы могли бы легко grep? В качестве альтернативы используйте 'write (*, *) 'DEBUG LOG:', 'Variable x:', varx' и grep для" DEBUG LOG: "? – lurker

+0

Это звучит как очень хорошая практика, но, к сожалению, именно потому, что они не в том, что у меня есть моя проблема. В принципе, я хочу найти вызов 'write (*, *)', не меняя его напрямую. – Miguel

ответ

3

Fortran препроцессор Intel определяет ряд макросов, такие как __file__ и __line__, которые будут заменены, соответственно, имя файла (в виде строки) и номер строки (как целое), когда препроцессор работают. Для получения более подробной информации consult the documentation.

GFortran предлагает аналогичные услуги, consult the documentation.

Возможно, ваш компилятор предлагает аналогичные возможности.

+1

Я часто использую эти макросы с 'gfortran' ... –

+0

@AlexanderVogt Это очень удобно. Они, похоже, недокументированы, но я просто попробовал их сам. Мне придется включить их в мои отладочные заявления. – Yossarian

+0

@Yossarian Они задокументированы [здесь] (http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html) ... –

0

Как ранее подразумевалось, нет фортрана - хотя может быть подход к компилятору --- способ изменить поведение оператора write, как вы хотите. Однако, поскольку ваша проблема больше связана с обработкой (непреднамеренно созданным) плохим кодом, есть варианты.

Если вы не можете легко найти ненужный write(*,*) в своем коде, который предполагает, что у вас много законных таких утверждений. Одним из решений является уменьшение количества:

  • использует явный формат, а не список-направленный выход (* в качестве формата);
  • вместо * в качестве выходного блока, используйте output_unit от встроенного модуля iso_fortran_env.

[Имея явный формат для «правильного» выхода является хорошей идеей, так или иначе.]

Если это не удается, использовать систему контроля версий, чтобы сравнить старый «хороший» вариант против нового «плохо ". Возможно, даже ваш флаг/блок управления версиями фиксируется с новыми write(*,*).

И если все это по-прежнему не помогает, то упомянутые ранее макросы предварительного процессора могут стать последним приложением.

+0

Спасибо за совет. Одна из проблем заключается в том, что этот код создается несколькими людьми, поэтому сложнее стандартизировать то, что мы делаем, и изменения могут оставаться незамеченными в течение длительного времени. Я подожду, чтобы узнать, знает ли кто-нибудь о компиляторе. – Miguel

+0

Некоторые говорили бы, что по мере увеличения числа людей, работающих над кодом, потребность в дисциплине/стандартизации возрастает. – francescalus

+0

Также обратите внимание, что если вы получите такой подход, которым вы довольны, вы, скорее всего, захотите также применить его к 'print *, ...'. – francescalus

Смежные вопросы