Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
Arrays fortran指针数组作为返回_Arrays_Syntax_Fortran - Fatal编程技术网

Arrays fortran指针数组作为返回

Arrays fortran指针数组作为返回,arrays,syntax,fortran,Arrays,Syntax,Fortran,我在看一个Fortran函数,它返回一个数组(指针)到固定长度的字符串。大概是这样的: FUNCTION F(N) INTEGER :: N CHARACTER(LEN=16) :: F(N) F(1:N) = 'DEFAULT' ... END FUNCTION F 该函数计算N个字符串,据我所知,它试图在数组中返回这些字符串 来电者有: ... ALLOCATE(X(N)) X = F(N) 然而,当F返回时,我得到一个segfault。作者声称他在编译和运行它时没有发现任何问题。我试

我在看一个Fortran函数,它返回一个数组(指针)到固定长度的字符串。大概是这样的:

FUNCTION F(N)
INTEGER :: N
CHARACTER(LEN=16) :: F(N)

F(1:N) = 'DEFAULT'
...
END FUNCTION F
该函数计算N个字符串,据我所知,它试图在数组中返回这些字符串

来电者有:

...
ALLOCATE(X(N))
X = F(N)
然而,当F返回时,我得到一个segfault。作者声称他在编译和运行它时没有发现任何问题。我试图理解何时为实际字符串分配内存,以及返回后内存是否在作用域中?是吗

CHARACTER(LEN=16) :: F(N)
行分配N*16个字符,然后在F中分配指向它们的N个指针?我来自C,所以可能我完全错过了这个,请温柔一点。 我怀疑F指向内存的实际值在返回后没有绑定(我认为它可能在堆栈上,等等)


非常感谢您提供的任何见解。

您的函数不返回指针数组,而是返回长度为16的字符数组。您可能将返回值分配给秩1数组字符(len=16)的指针或可分配变量,但这是一个单独的问题

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

  • 将函数放入模块中(最简单!)
  • 包含
    语句后,将函数放入主程序中
  • 为中使用的作用域单元中的函数编写接口块
  • 例如:

    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字符串包含一些元数据,包括长度(并且不是以null结尾)。数组本身将在内部具有一个数组描述符,该描述符存储有关数组边界、维度和一些其他信息的信息,因此总体分配将至少为N*(16个字符+标量开销)+数组描述符长度。在引擎盖下发生的事情比在C中发生的要多


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

    感谢您花时间发表评论!确实定义了一个接口,但我没有显示。我不清楚分配(X(N))的目的是什么?我认为数组是由F函数分配的。当然,我应该说明,X被声明为字符(LEN=16),可分配::X(:)仅当左侧是可分配的时,分配上的重新分配才适用。您的示例将指针用于左侧-无论编译器选项如何,分配时的重新分配都不会应用。@IanH我去掉了该位。我最初使用了一个可分配的指针,但改为一个指针来匹配Q,但忘记了取出重新分配的东西。谢谢你们指出这一点。你们这些家伙说得太离谱了。我现在不知道。。。你是说代码应该有效吗?Valgrind抱怨调用F。我想我必须尝试升级我的编译器。我对答案投了更高的票,主要是因为它为我指明了正确的方向。我意识到答案并不比问题好多少。。。所以我发现了一些有用的东西:我将ALLOCATABLE更改为指针,代码开始工作。现在我只需要更好地理解这里发生了什么。令人费解的是,作者声称他在不同的机器上用gfortran和ifort编译了它,却从未看到过任何错误。谢谢大家!