从 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
我有一个存储数组的类型:
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