Fortran 90 пользовательский тип, передавая по значению? - PullRequest
1 голос
/ 18 марта 2010

У меня проблема с Фортраном 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

Ответы [ 2 ]

1 голос
/ 19 марта 2010

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

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

!DEC$ ATTRIBUTE

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

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

1 голос
/ 19 марта 2010

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

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

...