从c_ptr转换后保留(或恢复)lbound

时间:2015-02-11 09:05:23

标签: pointers fortran fortran-iso-c-binding

我有一个存储数组的类型:

type data
  type(someType) pointer :: someTypePtr(:)
end type

我使用

为someTypePtr分配了一些东西
type(data), intent(inout) :: this
integer, intent(in) :: lb, ub
type(someType), target, intent(in) :: sometype(lb:ub)
this%someTypePtr => sometype

稍后我创建了一个c_ptr,指向我刚刚提到的实例 this 。当我之后将此指针强制转换为fortran类型时,下限以0开始:

type(c_ptr) :: ptr
type(someType) :: data
call c_f_pointer(ptr, data)
write(*,*) lbound(data%someTypePtr) !will give 0

是否有类似于重塑的内容将someTypePtr更改回原来的lbound:ubound

1 个答案:

答案 0 :(得分:1)

奇怪的是,它应该是1,而不是0。无论如何,您可以在之后重新映射指针:

 use iso_c_binding
 real(c_float), pointer :: ptr(:)
 type(c_ptr) :: ptr_c

 allocate(ptr(5:6))

 ptr_c = c_loc(ptr(lbound(ptr)))
 call c_f_pointer(ptr_c, ptr, [2])

 print *, lbound(ptr)

 ptr(5:6) => ptr

 print *, lbound(ptr)
end

运行:

> ./a.out 
           1
           5