【发布时间】:2012-03-11 00:35:37
【问题描述】:
我有一个带有可分配数组A 的 Fortran 程序,如下所示:
real, dimension(:,:) allocatable :: A
...
allocate(A(x0:x1;y0:y1))
这个数组最终作为参数传递给一个看起来像
的子例程subroutine my_subroutine(arr)
real, dimension(x0:x1,y0:y1) :: arr
...
end subroutine my_subroutine
我想用 C 库中实现的自定义内存分配函数 my_alloc 替换 Fortran 的 allocate 语句。我将第一个代码示例更改为:
type(c_ptr) :: cptr
real, pointer, dimension(:,:) :: A
...
cptr = my_alloc(...)
call c_f_pointer(cptr,A,[x1-x0+1,y1-y0+1])
这很好用,除了通过在 c_f_pointer 函数中指定范围而不是下限/上限,我失去了数组的原始形状 (x0:x1,y0:y1)。但这不是一个大问题:指针作为子程序的参数传递,子程序需要一个数组并将指针视为一个数组,具有适当的边界。
我真正的问题是:当我还想重写子程序的代码以使用指针而不是数组时。
subroutine my_subroutine(arr)
real, pointer, dimension(x0:x1,y0:y1) :: arr
...
end subroutine my_subroutine
上面的代码不起作用; gfortran 说
Array pointer 'arr' at (1) must have a deferred shape
以下代码可以编译
subroutine my_subroutine(arr)
real, pointer, dimension(:,:) :: arr
...
end subroutine my_subroutine
但是当我尝试执行从 x0 到 x1 以及从 y0 到 y1 的循环时,它没有提供边界并且程序崩溃。
我该如何处理这种情况?在子例程中,我需要 fortran 知道 arr 是指向形状为 (x0:x1,y0;y1) 的数组的指针。
【问题讨论】: