fortran 90用户定义的类型,按值传递?

时间:2010-03-18 20:27:47

标签: fortran pass-by-reference mpi fortran90

我在Fortran 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

2 个答案:

答案 0 :(得分:1)

Fortran语言标准没有说明如何传递参数。不同的编译器可以以各种方式实现参数传递,具体取决于参数的类型和参数的“意图”(in / out / inout)。

如何声明nsubs与C%NSubDomains?你有一个接口声明(可能是从Fortran 90绑定到MPI)告诉编译器它应该如何调用MPI_Dims_create?

答案 1 :(得分:1)

正如@MSB观察到的Fortran标准并没有强制要求如何实现参数传递。我认为很明显,他们确实要求参数传递的语义使它看起来像程序员通过引用传递参数。因此,我理解OP的不满,INTENT(OUT)的{​​{1}}参数似乎并非如此。

如果您的编译器支持如下声明的语法:

MPI_DIMS_CREATE

或者如果您正在使用具有Fortran 2003的C-互操作性功能的编译器,您可能能够强制编译器传递组件,就像通过引用一样。但是,如果这样做,很可能在幕后编译器生成代码来执行您在未注释的代码中执行的操作 - 创建一个可以通过引用传递并将其传递给子例程的变量。

在这种情况下,我会使用流程并自己编写代码。