引用 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 中,这是不允许的。您只能在变量或常量名称或关联名称上使用 % 语法或数组索引 ()。
我正在努力寻找一个简洁的标题,但它并没有那么复杂。我有一个 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 中,这是不允许的。您只能在变量或常量名称或关联名称上使用 % 语法或数组索引 ()。