Расширение ответа @janneb ... Вот синтаксически правильная версия программы на Fortran 95:
module my_subs
contains
subroutine swap(ix,iy)
integer :: ix, iy
integer :: it
it = ix
ix = iy
iy = it
end subroutine swap
end module my_subs
program test_swap
use my_subs
integer :: ia, ib
ia = 3
ib = 8
call swap (ia, ib+5)
print *, ia, ib
end program test_swap
Поскольку это недопустимо, вывод не гарантируется.С опциями компилятора gfortran и lax я получаю «S4», то есть вывод 13 и 8.
Теперь измените объявление аргументов в подпрограмме на:
integer, intent (inout) :: ix, iy
, и gfortran отказываетсядля компиляции:
Ошибка: не переменное выражение в контексте определения переменной (фактический аргумент INTENT = OUT / INOUT) в (1)
Аналогично для Intel ifort:
test_swap.f90 (31): ошибка # 6638: фактическим аргументом является выражение или константа;это недопустимо, поскольку связанный фиктивный аргумент имеет явный атрибут INTENT (OUT) или INTENT (INOUT).обмен вызовами (ia, ib + 5) ----------------- ^ сборка прервана для test_swap.f90 (код 1)
То есть при правильно написанном коде современныеКомпиляторы Фортрана не позволяют этого.Вы можете сделать эту ошибку, если вы неаккуратны, и это было намного проще в FORTRAN 77 и более ранних версиях.