Разница между намерением (inout) и пустым аргументом указателя - PullRequest
3 голосов
/ 02 февраля 2011

Какова практическая разница в

subroutine fillName(person)
   type(PersonType), intent(inout) :: person

   person%name = "Name"
end subroutine

или следующие

subroutine fillName(person)
   type(PersonType), pointer :: person

   person%name = "Name"
end subroutine

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

pointer имеет особые требования к аргументам, которых нет в голом описании. По сути, фиктивный аргумент person должен быть связан с указателем цели. Это может быть путем выделения или простого назначения указателя (=>). Важно отметить, что любые изменения в ассоциации указателей фиктивного аргумента person во время выполнения подпрограммы будут отражены в фактическом передаваемом аргументе. Пустое описание передаст фактический аргумент по ссылке, но не по указателю.

1 голос
/ 15 февраля 2011

Если я предположу, что ключевое слово практическое , то практическое различие в приведенном вами примере будет удобочитаемость , так как оба они работают, но intent(inout) является более явным.

Техническое различие заключается в том, что указатель может быть нулевым или неопределенным, тогда как при intent(inout) переменная должна быть выделена.Указатель также может быть связан или аннулирован в подпрограмме, но фиктивный аргумент с intent(inout) не может.

Если вы не укажете ни pointer, ни intent(inout) и передадите указатель в аргументе, тогда ондолжны быть связаны.

...