我可以在FORTRAN 2003中为派生数据类型重载入口访问运算符[],()或{}吗?在以下示例中,我想为派生数据类型“custom”定义访问方案。
type custom
integer, dimension(:), allocatable :: a
end type custom
type(custom) :: t
! after some initialization
! .....
! .....
! .....
!
t%a( (/ 1, 2, 5 /) ) ! return entries located in positions 1, 2, and 5
t{ (/ 1, 2, 5 /) } ! ?????? I want to define what stuff it should return
我该怎么做?
更新:
请注意,我不想直接使用数组“t%a”并对其执行常规子数组操作。相反,我想重新定义数据类型“自定义”的数组操作,这样t {'first'}应该返回指针t%a或t%a(1)中的第一个条目,所以我可以说
t['first']= 18
或
print *, t['first'].
还有额外的重载我希望得到像t [1] = 18这样的功能,比如t ['first'] = 18。
答案 0 :(得分:2)
这取决于你所说的“回归”。
本身提供的例子
t%a([1,2,5]) ! Using syntax offered by Fortran 2003
不会返回任何内容:它是子对象。通过引用该子对象,我们可以做各种事情:
print *, t%a([1,2,5])
t%a([1,2,5]) = 27
t%a([1,2,5]) = sin(real(t%a([1,2,5])))
但仍然没有“回归”的概念。至关重要的是,正如我们将要看到的,这些不是表达。
回答这个问题,t[]
,t()
,t{}
是什么意思,然后答案就是“不”。 * 你可以例如,想要说:
t[1,2,5] = 1
表示
t%a[1,2,5] = 1
但这不是需要考虑的事情。
可以创建一个像
这样的表达式print *, t%ref([1,2,5])
但我们完全处于不可定义的领域。
然而,正如你现在提到的指针,还有更多要说的。虽然首选语法t[1]
或t["first"]
不可用,但我们仍然可以选择类型绑定过程。例如,函数调用t%ref("first")
很可能能够返回指向t%a
的第一个元素的指针。例如,t%ref(1)
可能就像
module reference
implicit none
type custom
integer, dimension(:), allocatable :: a
contains
procedure ref
end type custom
contains
function ref(t, idx)
class(custom), target, intent(in) :: t
integer, intent(in) :: idx
integer, pointer :: ref
ref => t%a(idx)
end function ref
end module reference
use reference
implicit none
type(custom), target :: t
integer, pointer :: b
t%a = [1, 2, 3, 4, 5]
print *, t%a
b => t%ref(1) ! Fortran 2008 allows direct assignment
b = 8 ! but compiler support is very limited.
print *, t%a
end
如果需要,ref
可以通用,以便t%ref("first")
(等)可以接受。
* 我的理由是这里t
是一个标量。但是,正如弗拉基米尔F在评论()
和[]
中提到的可能意味着事情。第一个涉及阵列,第二个涉及共阵。那么,语法是一个问题,但这个答案更多地关注机制而不是语法。