Фортран 90 определяемый пользователем тип, передаваемый по значению?

У меня проблема с Фортран 90.

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

Чтобы было ясно, фрагмент с комментариями показывает, как совершаются звонки. В первом вызове 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

person Community    schedule 18.03.2010    source источник


Ответы (2)


Стандарт языка Fortran не говорит, как передаются аргументы. Разные компиляторы могут реализовывать передачу аргументов по-разному, в зависимости от типа аргумента и «назначения» аргумента (вход/выход/вход).

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

person M. S. B.    schedule 19.03.2010

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

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

!DEC$ ATTRIBUTE

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

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

person High Performance Mark    schedule 19.03.2010