Применять намерение (в) объявленных переменных в Фортране как константу также в вызываемых подпрограммах / функциях

В подпрограмме или функции входная переменная может быть определена с намерением (in), и компилятор гарантирует, что внутри подпрограммы переменная не может быть изменена. Как только переменная передается (по ссылке) в другую подпрограмму, эта подпрограмма может изменять переменную без предупреждения компилятора.

Это было протестировано с помощью gfortran с кодом:

program Test
    integer i
    i = 21 ! half the truth
    call test(i)
    write (*,*) "21 expected, but is 42: ", i
end program

subroutine test(i)
    integer, intent(in) :: i
    call doSomethingNasty(i)
end subroutine

subroutine doSomethingNasty(i)
    integer :: i
    i = 42 ! set the full truth ;-)
end subroutine

Мои вопросы:

  1. Это нормальное поведение для все компиляторы?
  2. Есть ли способ заставить компиляторы гарантировать, что переменная действительно постоянна и что изменения будут представлены как ошибки компилятора? Я имею в виду что-то вроде ключевого слова const в C / C ++, которое также проверяется на вызываемое функции, которые также должны гарантировать, что константа обрабатывается соответствующим образом и что никакая ссылка не экранируется.
  3. Я обнаружил возможность передать переменную в подпрограмму по "значению", передав ее через выражение вроде test (( i)) . ​​Для числовых переменных t это понятно и нормально, но похоже, что это работает и с gfortran для массивов, производных типов и указателей. Это работает и с другими компиляторами? Это безопасный способ защитить мои локальные переменные?
6
задан Rick-Rainer Ludwig 28 August 2011 в 19:22
поделиться