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 - Fatal编程技术网

Fortran 引用返回结构/派生类型的函数

Fortran 引用返回结构/派生类型的函数,fortran,fortran90,Fortran,Fortran90,我正在努力写一个简洁的标题,但它并没有那么复杂。我有一个返回结构(派生类型)的函数,我正在寻找一种简单的方法,在调用函数时只引用结构的一部分(不复制/指向另一个结构) 我仅限于f90/f95功能集,但也可以随意包括f2003答案 我真的在这里寻找一些简单的东西,如果它存在的话。否则,它只是作为一个子例程(如果另一种选择是将其作为一个函数保留,但添加指针、接口等)更好 我还尝试让函数返回一个二维数组而不是一个结构,并且遇到了相同的基本问题——它可以工作,但我只能打印整个数组,不能单独打印任何数组部

我正在努力写一个简洁的标题,但它并没有那么复杂。我有一个返回结构(派生类型)的函数,我正在寻找一种简单的方法,在调用函数时只引用结构的一部分(不复制/指向另一个结构)

我仅限于f90/f95功能集,但也可以随意包括f2003答案

我真的在这里寻找一些简单的东西,如果它存在的话。否则,它只是作为一个子例程(如果另一种选择是将其作为一个函数保留,但添加指针、接口等)更好

我还尝试让函数返回一个二维数组而不是一个结构,并且遇到了相同的基本问题——它可以工作,但我只能打印整个数组,不能单独打印任何数组部分


我甚至很难猜测那里的语法,因为fortran中的函数和数组部分都使用了
()
(与python等使用
[]
进行索引的语言相反,因此混合函数和索引是相当自然的,例如
tax(xx,yy)[1,:]
).

您可以通过使用函数返回重载派生数据类型的名称来创建用户定义的构造函数

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中,你是不允许这样做的。只能对变量名、常量名或关联名使用%语法或数组索引()。

谢谢,+1。正如我在问题中猜到的,fortran做了额外的工作,因此从实用的角度来看,我可以只使用一个子程序,因为它有点简单——而且目前我还没有足够新的编译器来测试它。;-)但这很酷,谢谢!我知道如果没有f2003,我不能主要使用
associate()
,但是模块本身应该为我编译吗?我的f90编译器抱怨类型和接口都使用tTax名称,但将分别编译它们中的任何一个(当然,main在这些情况下不起作用)。如果我可以在main中使用foo%tx而不是tx,从我的角度来看,这将是一个足够的解决方案。@VladimirF或jlok:对于我上面的评论,这里有什么简单的答案吗?还是值得单独提问?@JohnE可能是一个单独的问题。从你的描述来看还不够清楚。可能是旧的编译器,可能是错误的代码。对,这是我的工作假设,但我总是希望有一些python风格的语法糖,这似乎与fortran的精神背道而驰@JohnE这里有一个到Python-Fortran-Rosetta-Stone@jlokimlin的链接是的,这很好,但有趣的是,对于我的问题,它将Fortran子例程视为等同于Python/numpy!我这里的问题很明显,我试图让fortran函数像python函数一样工作,我可能只是努力让fortran看起来更像python。
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