Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在fortran中使用函数返回可放置在赋值左侧的引用_Fortran_Fortran90_Fortran95_Fortran2003 - Fatal编程技术网

在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)

如标题中所述,我希望直接修改通过从函数检索的指针访问的数据。在赋值(=)中出现的函数返回的引用不是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) :: 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]
我希望getter
get(I,j)
模拟指针矩阵

        j = 1   2   3

i = 1:   [[a1, a2, a3],
i = 2:    [b1, b2, XX],
i = 3:    [c1, XX, XX]]
wehre
XX
将引用
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