3

如标题所述,我想直接修改通过从函数中检索的指针访问的数据。在 C++ 中,出现在赋值(=)的 lhs 上的函数返回的引用是没有问题的,但以下 fortran 错误中的最小示例:

module test_mod
  implicit none

  integer, target :: a=1, b=2, c=3 ! some member variables

contains

  function get(i)
    integer, pointer :: get
    integer, intent(in) :: i

    select case (i)
      case (1)
        get => a
      case (2)
        get => b
      case (3)
        get => c
    end select 
  end function get

end module test_mod

program test
  use test_mod
  implicit none
  integer, pointer :: i_p

  !> prints out 1 2 3
  print*, get(1), get(2), get(3)

  !> this is what I want but I get the error
  !> Error: 'get' at (1) is not a variable
  get(2) = 5

  !> this works but is not what I want
  i_p => get(2)
  i_p = 5

end program test

有没有办法完成这种行为;也许我缺少一些属性?我想绕过编写任何设置器例程,例如

set(i,value)

因为它应该模仿数组的外观。在我的应用程序中,成员变量a,b,c实际上是不同大小的数组

a = [a1, a2, a3]
b = [b1, b2]
c = [c1]

我希望吸气剂get(i,j)模仿一个指针矩阵

        j = 1   2   3

i = 1:   [[a1, a2, a3],
i = 2:    [b1, b2, XX],
i = 3:    [c1, XX, XX]]

我们XX将引用null().

更新: 我正在使用 gfortran(版本 5.2.0),部署机器只有从 4.6.x 及更高版本开始的版本。因此,很遗憾我无法使用建议的 fortran 2008 标准功能。是否可以在没有开箱即用的编译器支持的情况下模仿上述行为?

更新2: 所以我最终实现了一个结构如下

type Vec_t
  integer, allocatable, dimension(:) :: vec
end type Vec_t
type(Vec_t), allocatable, dimension(:), target :: data

我这样初始化(我在最后提到的三角矩阵应用程序)

allocate(data(max))
do i=1,max
  allocate(data(i)%vec(i))
end do

我通过它访问并写入它

print*, data(2)%vec(1)
data(2)%vec(1) = 5

这不正是我所追求的,但对于我的申请来说已经足够了。

4

1 回答 1

4

让我们看看你想要做什么:

get(2)=5

和错误信息

错误:(1) 处的“get”不是变量

这看起来很全面:你不能做你想做的事。也许...

get(2)实际上,根据 Fortran 2003 的规则,它不是一个变量。在 Fortran 2003 中,变量由规则 R601 和 R603 给出,这是一个指示符列表。

赋值的左边必须是一个变量。

但是看看 Fortran 2008 及其对变量的定义。现在一个变量要么是那些相同的指示符之一(或与coarrays或复杂部分相关的指示符),但它也可以(C602到R602)是一个函数引用,它

应有一个数据指针结果。

这在 Fortran 2008 的介绍中进行了总结,详细介绍了 Fortran 2003 的扩展,如

指针函数引用可以表示任何变量定义上下文中的变量。

get(2)是对具有数据指针结果的函数的引用。 get(2)根据 Fortran 2008 的规则,then 可能出现在赋值语句的左侧。

唉,目前的编译器并没有广泛支持Fortran 的这种解释:在回答 Cray 编译器时。

这意味着这个答案实际上是在说您有两个选择:切换编译器或等到此功能更广泛使用。由于这两种方法都可能不切实际,因此您可能需要另一个答案,该答案提供了一些更便携的解决方法。

我更喜欢我的链接到innoSPG给出的链接,因为虽然后者是基于前者,但对适当字段“指针函数 - 指针函数 ref 是一个变量”的描述稍微更清楚一些。但是,这是一个更易于访问的文档和一个可行的替代方案。

于 2015-07-22T19:20:48.710 回答