在fortran中使用函数返回可放置在赋值左侧的引用
如标题中所述,我希望直接修改通过从函数检索的指针访问的数据。在赋值(=)中出现的函数返回的引用不是C++中的问题,而是FORTRAN错误中的以下最小例子:在fortran中使用函数返回可放置在赋值左侧的引用,fortran,fortran90,fortran95,fortran2003,Fortran,Fortran90,Fortran95,Fortran2003,如标题中所述,我希望直接修改通过从函数检索的指针访问的数据。在赋值(=)中出现的函数返回的引用不是C++中的问题,而是FORTRAN错误中的以下最小例子: module test_mod implicit none integer, target :: a=1, b=2, c=3 ! some member variables contains function get(i) integer, pointer :: get integer, intent(in)
module test_mod
implicit none
integer, target :: a=1, b=2, c=3 ! some member variables
contains
function get(i)
integer, pointer :: get
integer, intent(in) :: i
select case (i)
case (1)
get => a
case (2)
get => b
case (3)
get => c
end select
end function get
end module test_mod
program test
use test_mod
implicit none
integer, pointer :: i_p
!> prints out 1 2 3
print*, get(1), get(2), get(3)
!> this is what I want but I get the error
!> Error: 'get' at (1) is not a variable
get(2) = 5
!> this works but is not what I want
i_p => get(2)
i_p = 5
end program test
有没有办法做到这一点;也许我遗漏了一些属性?我想绕过编写任何setter例程,例如
set(i,value)
因为它应该模仿数组的外观。
在我的应用程序中,成员变量a、b、c
实际上是大小不同的数组
a = [a1, a2, a3]
b = [b1, b2]
c = [c1]
我希望getterget(I,j)
模拟指针矩阵
j = 1 2 3
i = 1: [[a1, a2, a3],
i = 2: [b1, b2, XX],
i = 3: [c1, XX, XX]]
wehreXX
将引用null()
更新:
我使用的是gfortran(版本5.2.0),部署机器只有从4.6.x开始的版本和更高版本。因此,很遗憾,我无法使用建议的fortran 2008标准功能。是否可以在没有现成编译器支持的情况下模拟上述行为
更新2:
因此,我最终实现了如下结构
type Vec_t
integer, allocatable, dimension(:) :: vec
end type Vec_t
type(Vec_t), allocatable, dimension(:), target :: data
我这样初始化(我在最后提到的三角矩阵应用程序)
我通过
print*, data(2)%vec(1)
data(2)%vec(1) = 5
这并不完全是我想要的,但对我的申请来说已经足够好了。让我们看看你想做什么:
get(2)=5
以及错误消息
错误:(1)处的“get”不是变量
这看起来相当全面:你不能做你想做的事。或者,也许
根据Fortran 2003的规则,get(2)确实不是一个变量。在Fortran 2003中,规则R601和R603给出了一个变量,这是一个指示符列表
赋值的左侧必须是变量
但看看Fortran 2008及其变量的定义。现在,一个变量可以是同一个指示符中的一个(或与同轴或复杂部件相关的指示符),但也可以是一个函数引用(C602到R602),该函数引用
应具有数据指针结果
Fortran 2008简介中对此进行了总结,详细介绍了对Fortran 2003的扩展,如下所示:
指针函数引用可以表示任何变量定义上下文中的变量
get(2)
是对具有数据指针结果的函数的引用<根据Fortran 2008的规则,代码>获取(2)可能会出现在赋值语句的左侧
唉,Fortran的这种解释是由当前的编译器做出的:在回答Cray编译器的问题时
这意味着这个答案实际上是说,您有两个选择:切换编译器或等待,直到这个功能更广泛。由于这两种方法都可能不切实际,因此您可能需要另一种解决方案,该解决方案提供了更便于携带的解决方案
我更喜欢innoSPG给出的链接,因为尽管后者基于前者,但相应字段“指针函数-指针函数ref是一个变量”的描述更为清晰。不过,这是一个更容易访问的文档,也是一个可行的替代方案。如果您查看此链接()的话,只有Cray在2014年11月实现了该功能。因此@nobody2100您必须特别注意您正在使用的编译器的版本。[弗朗西斯卡洛斯:哦,那是个好消息:D我等了10年以上……> RoGyvib你应该考虑加入一个编译器开发团队:)而不是等待一个特性10年。只是开玩笑。关于更新,有助于知道你使用临时PoTin对当前的工作有什么帮助。你更喜欢dl.acm.org上的科学论文,我仍然会选择我的论文,原因有两个:1)论文不是免费的,我不会仅仅为了知道什么是可用的或不可用的而买一篇论文;2)根据定义,论文是冻结的,所以不会更新,而fortranwiki上的链接将在以后更新。这些都是合理的观点,以及我为什么要包括在内您作为备选方案提供的链接。仅在本例中,描述“指针函数”没有立即的价值。被冻结是好的:当有广泛的支持时,我的答案已经过时了;)。仅供参考-F2008中变量的语法规则在标准首次发布后发生了变化-规则现在只允许函数引用,而不是更一般的“函数引用”在这种情况下,为了避免语法歧义。刚刚在Cray上尝试了该功能,它在那里工作,但我无法确认gfortran 5。我认为谣言是一个骗局。有人有最新的主干吗?
get(2)=5