2010-03-18 4 views
1

У меня проблема в Fortran 90.fortran 90 пользовательский тип, проходящий по значению?

У меня есть пользовательский тип, и когда я вызываю одну из подпрограмм MPI, данные выглядят переданными по значению (а не адресу, как я думал, он должен). Выходные аргументы не изменяются. Это, по-видимому, характерно для вызовов MPI. Я пробовал одно и то же в простом тесте, и я могу изменить переданные значения в области вызова. Я не знаю, почему это так, потому что я думал, что Фортран всегда проходит по адресу. Любая идея, что может продолжаться?

Чтобы быть чистым, прокомментированный фрагмент показывает, как выполняются вызовы. В первом вызове c%NSubDomains является выходным аргументом и должен быть изменен в области вызова, но это не так. Когда я вызываю с массивом, а не с членом пользовательского типа, он работает в раскомментированном фрагменте.

! ! This doesn't work output values aren't modified ?? 
! call MPI_Dims_create(c%NProcs,c%NDims,c%NSubDomains,iErr) 

nsubs(:)=0 
call MPI_Dims_create(c%NProcs,c%NDims,nsubs,iErr) 
c%NSubDomains=nsubs 

ответ

1

Языковой стандарт Fortran не говорит, как передаются аргументы. Различные компиляторы могут реализовать передачу аргументов различными способами, в зависимости от типа аргумента и «намерения» аргумента (in/out/inout).

Как заявляются nsubs и C% NSubDomains? У вас есть объявление интерфейса (возможно, из привязки Fortran 90 к MPI), чтобы сообщить компилятору, как он должен вызывать MPI_Dims_create?

1

Как отмечает @MSB, стандарты Fortran не определяют, как должна выполняться передача аргументов. Я думаю, что ясно, что они выполняют мандат, что семантика передачи аргументов заставляет его смотреть программисту, как будто аргументы передаются по ссылке. Поэтому я понимаю, что ОП расстроен тем, что это не относится к аргументу INTENT(OUT)MPI_DIMS_CREATE.

Если ваш компилятор поддерживает синтаксис объявлений, как это:

!DEC$ ATTRIBUTE 

или если вы используете компилятор с функциями C-совместимости с Fortran 2003 реализованы, вы можете быть в состоянии заставить компилятор в Попутно компонент как бы по ссылке. Однако, если вы это сделаете, весьма вероятно, что за кулисами компилятор генерирует код, чтобы делать то, что вы сами делаете в своем раскомментированном коде, - делая переменную, которая может быть передана как по ссылке и передана ее подпрограмме.

В этой ситуации я бы пошел с потоком и сам написал код.