Как заставить компилятор интерпретировать пропущенное намерение как намерение (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 4

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