【问题标题】:fortran 90 user defined type, passing by value?fortran 90 用户定义类型,按值传递?
【发布时间】:2011-01-29 05:04:02
【问题描述】:

我在 Fortran 90 中遇到问题。

我有一个用户定义的类型,当我调用其中一个 MPI 子例程时,数据看起来是按值传递的(不是地址,我认为它应该如此)。输出参数未修改。它似乎特定于 MPI 调用。我在一个简单的测试中尝试了同样的事情,我可以在调用范围内更改传入的值。我不确定为什么会这样,因为我认为 Fortran 总是通过地址传递。知道会发生什么吗?

为了清楚起见,注释的 sn-p 显示了调用是如何进行的。在第一次调用中,c%NSubDomains 是一个输出参数,应该在调用范围内修改,但不是。当我使用数组而不是用户定义类型的成员调用时,它在未注释的 sn-p 中起作用。

! ! 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 pass-by-reference mpi fortran90


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      !DEC$ ATTRIBUTE
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-21
        • 1970-01-01
        • 2016-12-15
        • 1970-01-01
        • 2012-06-10
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多