1

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

2 回答 2

1

正如@MSB 所观察到的,Fortran 标准并没有规定如何实现参数传递。不过,我认为很明显,它们确实要求参数传递的语义使程序员看起来好像参数是通过引用传递的。所以我理解 OP 的不安,INTENT(OUT)因为MPI_DIMS_CREATE.

如果你的编译器支持这样的声明语法:

!DEC$ ATTRIBUTE

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

在这种情况下,我会顺其自然,自己编写代码。

于 2010-03-19T09:22:19.627 回答
1

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

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

于 2010-03-19T02:53:38.077 回答