我在简洁的头衔中挣扎,但并不复杂。我有一个返回结构(派生类型)的函数,我正在寻找一种简单的方法来在调用函数时仅引用结构的一部分(不复制/指向另一个结构)。
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,:]
)。
答案 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你不被允许这样做。您只能对变量或常量名称或关联名称使用%语法或数组索引()。