Намерение Фортрана (inout) по сравнению с исключением намерения

Хорошая практика диктует ту подпрограмму, аргументы в Фортране должны каждый иметь указанное намерение (т.е. intent(in), intent(out) или intent(inout) как описано этот вопрос):

subroutine bar (a, b)
    real, intent(in) :: a
    real, intent(inout) :: b
    b = b + a
    ...

Однако не определением намерения является допустимый Фортран:

subroutine bar (a, b)
    real, intent(in) :: a
    real :: b
    b = b + a
    ...

Есть ли любые реальные различия вне времени компиляции, проверяя на аргумент, указанный как intent(inout) и аргумент без указанного намерения? Есть ли что-нибудь, что я должен взволновать по поводу того, если я модифицирую намерения к более старому, свободному поглощенному, код?

33
задан Community 23 May 2017 в 11:54
поделиться

2 ответа

Согласно The Fortran 2003 Handbook Адамса и др., существует одно различие между аргументом intent(inout) и аргументом без определенного намерения. Фактический аргумент (т.е. в вызывающей программе) в случае intent(inout) всегда должен быть определяемым. Если намерение не указано, аргумент должен быть определяемым если выполнение подпрограммы пытается определить фиктивный аргумент. определяемый означает установку значения: dummy_arg = 2.0. Очевидно, что фактический аргумент должен быть переменной, если это делается. Для intent(inout) фактический аргумент должен быть определяемым независимо от того, делает это подпрограмма или нет. Если намерение не указано, то все зависит от того, что происходит при конкретном вызове подпрограммы - если подпрограмма не определяет переменную, то все в порядке; если определяет, то возникает проблема - такие случаи, как запись в фактический аргумент, который является константой, очевидно, вызовут проблемы.

Это не означает, что компилятор будет диагностировать все эти случаи - то, что стандарт требует от компилятора диагностировать, это другой вопрос. Было бы почти невозможно обнаружить все ошибки требования намерения-не-определенного случая во время компиляции, поскольку нарушения зависят от потока кода во время выполнения. Компилятору гораздо проще диагностировать случай intent(inout) и предупредить вас о проблемах в коде.

22
ответ дан 27 November 2019 в 19:28
поделиться

Ваш вопрос побудил меня задуматься (сейчас много дел), не столкнетесь ли вы с разницей в поведении, если ваш код передает PARAMETER в качестве фактического аргумента, который затем пытается записать ваша подпрограмма. Без объявления INTENT компилятор может это пропустить, что приведет к странному поведению. С объявлением я бы ожидал ошибки во время компиляции.

Мы с вами можем подумать, что нет никакой разницы между INOUT и отсутствием объявления INTENT, но не забывайте, что существует множество старых программ на Фортране, и что совместимость со старыми версиями языка является важной особенностью новых стандартов. Если это был правильный (но сомнительный) FORTRAN77, то многие люди ожидают, что их код останется правильным (все еще сомнительным) с компилятором Fortran 90+.

Беглое чтение стандарта 2003 года действительно показывает, что есть разница между INOUT и отсутствием INTENT, но требуется более внимательное чтение. Если вы проверите это, сообщите нам о своих выводах; если у меня будет время позже, я проверю это сам и сообщу вам.

7
ответ дан 27 November 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: