Передача аргументов путем передачи по ссылке в функцию подкачки - PullRequest
0 голосов
/ 03 ноября 2011

Я столкнулся с этой проблемой при решении практического теста

Рассмотрим следующий код, написанный на языке передачи по ссылке, например Фортран и эти заявления о коде

  subroutine swap(ix,iy)
    it = ix
    ix = iy    ! line L1
    iy = it    ! line L2
  end

  program main
    ia = 3
    ib = 8
    call swap (ia, ib+5)
    print *, ia, ib
  end program

Заявления:

  1. Компилятор сгенерирует код для выделения временной безымянной ячейки, инициализируйте его до 13 и передайте адрес перестановки ячеек
  2. При выполнении код выдаст ошибку времени выполнения в строке L1
  3. При выполнении код выдаст ошибку времени выполнения в строке L2
  4. Программа напечатает 13 и 8
  5. Программа напечатает 13 и -2

Какие из приведенных выше утверждений являются правильными.

Я думаю, S1 и S4. Может кто-нибудь, пожалуйста, подтвердите? ТИА

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Да, S1 и S4 верны.

Кроме того,

S0a: файл не компилируется как есть, потому что L1: и L2: являются синтаксическими ошибками. :)

S0b: Строго говоря, говорить о Фортране как о языке передачи по ссылке неверно:

2 голосов
/ 03 ноября 2011

Расширение ответа @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 и более ранних версиях.

...