fortran指针数组作为返回

时间:2015-11-04 03:41:51

标签: arrays syntax fortran

< p>我正在查看一个Fortran函数,它返回一个固定长度字符串数组(指针)。这样的事情:< / p> < pre>< code> FUNCTION F(N) INTEGER :: N 字符(LEN = 16):: F(N) F(1:N)=' DEFAULT' ... 结束功能F. < /代码>< /预> < p>该函数计算N个字符串,据我所知,尝试在数组中返回这些字符串。< / p> < p>来电者:< / p> <预><代码> ... ALLOCATE(X(N)) X = F(N) < /代码>< /预> < p>但是当F返回时我得到一个段错误。作者声称他在编译和运行时没有看到任何问题。我试图了解何时为实际字符串分配内存以及返回后内存是否在范围内?是< / p> < pre>< code> CHARACTER(LEN = 16):: F(N) < /代码>< /预> < p>行分配N * 16个字符然后在F中指向它们的N个指针?我来自C所以也许我完全错过了这一点,请温柔。 我怀疑F的实际指向内存在返回后没有绑定(我认为它可能在堆栈上等)。< / p> < p>我们非常感谢任何见解。< / p>

1 个答案:

答案 0 :(得分:1)

你的函数没有返回一个指针数组,它返回一个长度为16的字符数组。你可能会将返回值赋给一个排名为1的数组字符(len = 16)的指针或可分配变量,但是这是一个单独的问题。

返回数组的函数需要一个显式接口。从您的问题中不清楚是否已满足此要求,这可以通过三种方式实现:

  1. 将该功能放入模块中(最简单!)
  2. contains语句
  3. 之后将该函数放入主程序中
  4. 在作用域中为函数编写接口块。
  5. 例如:

    module A
    contains
      function f(n)
        implicit none
        integer :: n
        character(len=16) :: f(n)
    
        f(1:n) = 'DEFAULT'
      end function f
    end module A
    
    program test
      use A
      implicit none
      character(len=16), pointer :: array(:)
    
      allocate(array(10))
      array = f(10)
    
      print *, array
    end program test
    

    这会将您的函数置于模块“A”中,只需添加implicit none语句,您应该使用它。与C不同,Fortran将允许您使用变量而不声明它们并隐式地为它们分配类型,当拼写错误创建新变量和调试噩梦时,它会变得丑陋。 implicit none告诉编译器只使用你声明的变量。

    上例中的主程序将函数的返回值存储在指向字符数组的指针中。返回值不仅仅是N * 16字节,因为与C不同,Fortran字符串包含一些元数据,包括长度(并且不以空值终止)。数组本身将在内部具有一个数组描述符,用于存储有关数组边界,维度和一些其他信息的信息,因此总体分配将至少为N *(16 +字符标量开销)+数组描述符长度。引擎盖下比C更多。

    最后一点需要注意,函数f的同名变量f是函数的类型及其返回值。当函数返回并且内存将被复制到array的已分配内存中时,这将在范围内。作为C程序员可能遇到的最后一个潜在问题是Fortran通过引用传递参数。这不是问题,但如果您假设像C一样按值传递,那么稍后可能会出现问题。