我需要在子例程中爲相當複雜的結構(這裏用「真正的a(2)」代替)創建一個句柄,然後只傳遞句柄/指針到主例程。我還需要能夠創建儘可能多的這些所需的結構。 問題是,一旦指針返回到main,數據結構將被釋放。這裏是我的嘗試:如何在FORTRAN例程內爲結構/數組創建句柄?
program main
implicit none
integer i, j
real a(2) ! This can be a complicated structure
a=(/1.1,2.2/)
call myalloc(a,i)
a=(/3.1,4.2/)
call myalloc(a,j)
call myprint(i)
call myprint(j)
stop
end
Ç-----------------------------------
subroutine myalloc(a,i)
implicit none
real, pointer :: i(:) ! If I add "save" attribute I will get an error
real, target :: a(2)
allocate(i(2))
i => a
return
end
ç--------------------------------
subroutine myprint (i)
implicit none
real, pointer :: i(:)
print *, i
return
end
ç---- -----------------------------
結果是一些垃圾值: 3.93764868E-43 1.40129846E-45
或者我會得到: 在文件test.f(單位= 6,文件= '標準輸出') 內部錯誤的線41:list_formatted_write():壞類型
任何幫助,將不勝感激。
感謝您的回答。我應該更清楚地解釋我的問題。我需要一個結構,它的細節在主程序中是隱藏的(只能在將要成爲閉源庫的子例程中看到)。所以我試圖用「i」和「j」的整數。我在MPI庫中見過類似的東西,例如MPI_TYPE_COMMIT(type,err),其中type聲明爲整數並可能指向結構。這是另一個有效的嘗試,但我不確定是否可以通過「myMod」編譯爲二進制文件來計算「sType」組件。 http://web.eng.ucsd.edu/~mesmaily/test。f – mem
您可能希望使用'transfer'函數將指針從外部可見類型轉換爲庫內使用的內部指針。在形式上,Fortran 90只支持強類型指針,所以你可能在編譯器/運行時特定的beahviours嘗試這樣做。如果你能支持F2003,那麼互操作性擴展可能值得研究,因爲你有能力處理適當的空指針,就像在C中一樣。我必須說,從你原來的問題來看,沒有一個是明顯的。 – talonmies