引用 returns structure/derived 类型的函数

Referencing a function that returns a structure/derived type

我正在努力寻找一个简洁的标题,但它并没有那么复杂。我有一个 return 结构(派生类型)的函数,我正在寻找一种简单的方法来在调用函数时仅引用结构的一部分(没有 copying/pointing 到另一个结构)。

program main

   real :: xx = 1.
   real :: yy = 2.

   ! works fine but what I want is to be 
   ! able to return %tx and %ts separately

   print *, " tax ", tax(xx,yy)

   ! just guessing at possible syntax here, but neither works

   print *, " tax ", tax%tx(xx,yy)
   print *, " tax ", tax(xx,yy)%tx

contains

function tax(x,y)

   real :: x, y

   type tTax
      real :: tx, ty
   end type tTax

   type(tTax) :: tax

   tax%tx = x * 100.
   tax%ty = y * 100.

end function tax

end program main

我仅限于 f90/f95 功能集,但也可以随意包含 f2003 答案。

我真的在这里寻找简单的东西,如果它存在的话。否则,最好将其作为子例程来执行(如果替代方案是将其保留为函数但添加指针、接口等)。

我也试过使用函数 return 一个二维数组而不是一个结构,并且遇到了同样的基本问题——它有效,但我只能打印整个数组,而不是任何数组部分通过他们自己。

我什至无法猜测那里的语法,因为 () 用于 fortran 中的函数和数组部分(与 python 这样使用 [] 进行索引的语言相反,所以混合函数和索引是相当自然的,例如 tax(xx,yy)[1,:]).

您可以通过使用函数 return 重载派生数据类型的名称来创建用户定义的构造函数。

自由使用 Fortran 2003 标准的 associate 构造允许访问特定类型组件,而无需复制或求助于内存泄漏倾向的指针。

您将自己限制在 Fortran 2003 上有什么特别的原因吗?大多数流行的编译器都支持大量 Fortran 2008。

下面的代码

module mymod

  ! Explicit typing only
  implicit none

  ! Declare derived data type
  type tTax
     real :: tx, ty
  end type tTax

  ! User-defined constructor
  interface tTax
     module procedure tax
  end interface tTax

contains

  function tax(x, y) result (return_value)
    real, intent (in) :: x, y
    type (tTax)       :: return_value

    return_value%tx = x * 100.0
    return_value%ty = y * 100.0

  end function tax

end module mymod

program main

  use mymod

  ! Explicit typing only
  implicit none

  real       :: xx = 1.0, yy = 2.0
  type(tTax) :: foo

  print *, " tax ", tax(xx,yy)
  print *, " tax ", tTax(xx, yy)

  ! Invoke the user-defined constructor
  foo = tTax(xx, yy)

  ! Fortran 2003's associate construct
  associate( &
       tx => foo%tx, &
       ty => foo%ty &
       )
       print *, " tax ", tx, ty
  end associate

end program main

产量

gfortran -Wall -o main.exe mymod.f90 main.f90
./main.exe
  tax    100.000000       200.000000    
  tax    100.000000       200.000000    
  tax    100.000000       200.000000 

问题不在于括号符号,而在于是否允许引用表达式的组件或元素。

而在 Fortran 中,这是不允许的。您只能在变量或常量名称或关联名称上使用 % 语法或数组索引 ()。