从 c_ptr 投射后保留(或恢复)lbound

Preserve (or restore) lbound after casting from c_ptr

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

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

是否有类似 reshape 的东西可以将 someTypePtr 改回原来的 lbound:ubound

奇怪,应该是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