引用返回结构/派生类型的函数

时间:2016-10-01 17:47:33

标签: fortran fortran90

我在简洁的头衔中挣扎,但并不复杂。我有一个返回结构(派生类型)的函数,我正在寻找一种简单的方法来在调用函数时仅引用结构的一部分(不复制/指向另一个结构)。

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答案。

如果它存在,我真的在这里寻找简单的东西。否则,作为一个子程序,它会做得更好(如果替代方法是将其保留为函数但添加指针,接口等)。

我也试过让函数返回一个二维数组而不是一个结构并且有相同的基本问题 - 它可以工作,但我只能打印整个数组,而不是自己打印任何数组部分。

我甚至无法猜测语法,因为()用于fortran中的函数和数组部分(而不是像python这样使用[]进行索引的语言,所以它'混合函数和索引是很自然的,例如tax(xx,yy)[1,:])。

2 个答案:

答案 0 :(得分:3)

您可以通过使用函数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 

答案 1 :(得分:3)

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

在Fortran你不被允许这样做。您只能对变量或常量名称或关联名称使用%语法或数组索引()。