Как заставить компилятор интерпретировать пропущенное намерение как намерение (inout)
Этот вопрос связан с проблемой: как обнаружить нарушение intent(in)
внутри подпрограмм. Но я не нашел ответа на соответствующий вопрос принудительно применять intent(in) объявленные переменные в Fortran как константы также в вызываемых подпрограммах/функциях.
intent(in)
, может быть изменена другой подпрограммой / функцией с пропущенным объявлением намерения.
Например:
module test
implicit none
contains
subroutine fun1(x)
real(8), intent(in)::x
call fun2(x)
end subroutine
subroutine fun2(x)
real(8) :: x
x = 10
end subroutine
end module
Этот код может быть скомпилирован без каких-либо ошибок/предупреждений гфортран и ифорт. Итак, мои вопросы таковы:
-
Можно ли запретить пропуск заявления о намерениях?
Можно ли заставить компилятор Fortran интерпретировать пропущенное намерение как
intent(inout)
?
2 ответа:
Оба ответа-нет. Неопределенное намерение принципиально отличается от всех других намерений. Он отличается от intent(inout), поскольку вы можете передать неопределимое выражение подпрограмме с неопределенным намерением.
Также во многих контекстах вообще не разрешается указывать intent (аргументы процедуры, указатели в Fortran 95,...)
Если вы хотите потребовать указания намерения, вы можете определить свою подпрограмму как
pure
, но она делает гораздо больше. Но это может быть и так. это правильно для тебя. Он запрещает любые побочные эффекты.
Я думаю, что вы должны получить ошибку компиляции из-за автоматически определенного интерфейса. Я ожидал бы того же с неправильным измерением, например (я переключил фиктивный аргумент fun2 x на z, который, как мне кажется, более ясно демонстрирует мою точку зрения).
module test implicit none contains subroutine fun1(x) real(8), intent(in)::x call fun2(x) end subroutine subroutine fun2(z) real(3) :: z z = 10 end subroutine end module