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

fortran 90用户定义类型,按值传递?,fortran,pass-by-reference,mpi,fortran90,Fortran,Pass By Reference,Mpi,Fortran90,我在Fortran 90中遇到了一个问题 我有一个用户定义的类型,当我调用其中一个MPI子例程时,数据看起来是通过值传递的(而不是我认为应该通过的地址)。输出参数未被修改。它似乎是特定于MPI调用的。我在一个简单的测试中尝试了同样的方法,我可以在调用范围中更改传入的值。我不确定这是为什么,因为我认为Fortran总是通过地址传递。知道会发生什么吗 为了清楚起见,注释后的代码段显示了调用是如何进行的。在第一个调用中,c%NSubDomains是一个输出参数,应该在调用范围内修改,但不是。当我使用数

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

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


如何声明NSUB与C%NSUB域?您是否有接口声明(可能来自与MPI的Fortran 90绑定)来告诉编译器应该如何调用MPI_Dims_create?

正如@MSB所观察到的那样,Fortran标准并不要求如何实现参数传递。不过,我认为很明显,它们确实要求参数传递的语义使程序员觉得参数是通过引用传递的。因此,我理解OP的不满,即
MPI\u DIMS\u CREATE
INTENT(OUT)
参数似乎并非如此

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

!DEC$ ATTRIBUTE
或者,如果您使用的编译器实现了Fortran 2003的C互操作性功能,则可以强制编译器像通过引用一样传递组件。但是,如果您这样做了,编译器很可能会在幕后生成代码来完成您自己在未注释代码中所做的工作——生成一个变量,该变量可以像通过引用一样传递,并将其传递给子例程

在这种情况下,我会按照流程自己编写代码