2015-02-11 35 views
1

鑄造後我有一個存儲陣列的類型:保存(或恢復)LBOUND從c_ptr

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

我給你的東西上創建指向c_ptr與

type(data), intent(inout) :: this 
integer, intent(in) :: lb, ub 
type(someType), target, intent(in) :: sometype(lb:ub) 
this%someTypePtr => sometype 

到someTypePtr後來我剛剛認爲這個實例爲這個。當我投這個指針回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

你的源代碼段,如圖所示,是有點不完整或有錯誤。例如 - 第二個片段中的數據必須具有POINTER屬性。我期望一個編譯器能夠診斷那個特定的問題 - 但是可能還有別的東西從示例源中丟失,導致其他問題。你能確保這些代碼片段是準確的嗎?你也可以顯示獲得C_PTR的代碼。在獲取它和它在第二個片段中的使用之間,你如何處理C_PTR?你正在使用哪種編譯器/版本/編譯選項? – IanH 2015-02-12 00:05:01

回答

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