答案 0 :(得分:1)
你的函数没有返回一个指针数组,它返回一个长度为16的字符数组。你可能会将返回值赋给一个排名为1的数组字符(len = 16)的指针或可分配变量,但是这是一个单独的问题。
返回数组的函数需要一个显式接口。从您的问题中不清楚是否已满足此要求,这可以通过三种方式实现:
contains
语句例如:
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一样按值传递,那么稍后可能会出现问题。