Хорошая практика подсказывает, что аргументы подпрограммы в Fortran должны у каждого есть определенное намерение (т.е. intent(in)
, intent(out)
или intent(inout)
, как описано this question):Fortran намерения (INOUT) против опуская намерения
subroutine bar (a, b)
real, intent(in) :: a
real, intent(inout) :: b
b = b + a
...
Однако, не указав намерения действует Fortran:
subroutine bar (a, b)
real, intent(in) :: a
real :: b
b = b + a
...
есть ли реальные различия вне времени компиляции проверки для заданного аргумента, как intent(inout)
и аргумент без указания в палатка? Есть ли что-нибудь, о чем я должен беспокоиться, если я доработаю намерения до более старшего, без намерения, кода?
Я построил четыре тестовых примера, пытающихся изменить параметр в подпрограмме. Два теста с внешними подпрограммами - т. Е. В файле сами по себе - с и без намерения (inout). Компилятор не жалуется ни на один из них. Это не неожиданность (без интерфейса) и возникающие exe segfaults. Я запустил подпрограмму в модуле для последних двух тестов и посмотрел segfault для случая без намерения и ошибки компилятора («Фактический аргумент в (1) должен быть определен, поскольку фиктивный аргумент« b »- INTENT = OUT/INOUT ") с интерфейсом. Это с gfortran 4.4.4-2 от дебианской системы. –
Отлично, мы оба кое-чему научились. –
В эти дни параметры помещаются в отмеченную только для чтения часть памяти, но это не всегда было правдой. Известным примером в очень старых компиляторах было переопределение числовых констант http://coding.derkeiler.com/Archive/Fortran/comp.lang.fortran/2005-01/0485.html –