2015-07-25 2 views
2

Всякий раз, когда я программирую в Fortran, я использую модули, и мне не нужно беспокоиться о написании интерфейсов.Почему я должен использовать интерфейсы?

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

Может кто-нибудь объяснить мне, почему? Какая польза?

+1

Невозможно ли вызвать функцию фортрана в модуле непосредственно из R, связав bind («c», name = ...)? – roygvib

+0

Я начал изучать этот материал пару дней назад. Можете ли вы указать мне пример? В этом вопросе я попытался использовать модуль и не смог http://stackoverflow.com/questions/31395435/use-fortran-subroutine-in-r-undefined-symbol/31396583#31396583 Большое спасибо! – Ignacio

+0

У меня была некоторая удача, предлагающая C-совместимые процедуры (затем называемые R) в модуле Fortran, но это, вероятно, новый вопрос, если ваши эксперименты не работают. Но я в основном предполагал, что этот вопрос касается вызовов R-Fortran-Fortran и интерфейсов для этой последней части цепочки. – francescalus

ответ

2

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

Еще одна очень приятная вещь о интерфейсах заключается в том, что вы можете связывать функции. Рассмотрим, например, функцию sin, которая определена для real и complex аргументов разных типов. Используя интерфейсы, вы можете вызывать одну и ту же функцию для разных типов переменных.

Для некоторых функций современных Fortran, таких как указатели на функции, требуются (обычно) интерфейсы.

+0

Хотя интерфейсы Fortran, безусловно, полезны, я всегда думаю, что они также частично опасны, потому что нет механизма для обеспечения их правильности ... (если не используется какой-либо механизм автоматической генерации) – roygvib

+0

@roygvib И иногда это недостаток правильности, полезно ": http://stackoverflow.com/a/29683745. – francescalus

4

Как и в случае Alexander Vogt says, интерфейсные блоки могут быть полезны для предоставления общих идентификаторов и разрешения определенных проверок компилятора.

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

Однако есть моменты, когда требуется явный интерфейс, а не как тонкость: если ссылаться на процедуру с определенными функциями, то для вашего кода будет соответствовать явный интерфейс, соответствующий стандарту Fortran. Эти особенности могут быть найдены в F2008, 12.4.2.2

Процедура, кроме функции заявления должны иметь явный интерфейс, если он ссылается и

  1. появляется ссылка на процедуру
    (а) с аргументом ключевого слова (12.5.2), или
    (б) в контексте, который требует, чтобы это было чистым,
  2. процедура имеет фиктивный аргумент, что
    (а) имеет ALLOCATABLE, АСИНХРОННОМ, необязательный, УКАЗАТЕЛЬ , TARGET, ЗНАЧЕНИЕ, или летучий атрибут,
    (б) представляет собой массив предполагаемой формы,
    (с) представляет собой coarray,
    (г) параметризованного производного типа, или
    (е) является полиморфным ,
  3. процедура имеет результат, который
    (а) представляет собой массив,
    (б) представляет собой указатель или размещаемый или
    (с) имеет nonassumed значение параметра типа, который не является постоянным выражением,
  4. процедура элементная, или
  5. процедура имеет атрибут BIND.

Помимо тех, неявный интерфейс будет достаточно, и interface блок не требуется. Но все же может помочь.

В вашем случае это только для вызовов между различными компонентами Fortran, где эти интерфейсы имеют такое влияние. Таким образом, вам не всегда нужно писать интерфейсы, и некоторые вещи могут работать без них.

2

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

Вы объявляете все свои переменные, не так ли? Предположительно, вы делаете это, чтобы защитить себя от опечаток, случайного неправильного использования и использования переменной, а также избегать того, чтобы читатель имел знание иногда тайных правил, среди других причин. Итак, почему бы вам не сделать то же самое для всех ваших подпрограмм? Все вышеизложенное и более применяются.

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