2011-08-07 56 views
1

我需要在子例程中爲相當複雜的結構(這裏用「真正的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():壞類型

任何幫助,將不勝感激。

回答

1

這段代碼有太多的錯誤,它幾乎很難回答建設性的問題。

如果我明白你要做什麼,子例程myalloc應該像sorts的拷貝構造函數一樣 - 將內存分配到提供的指針上,然後將初始化參數的內容複製到分配的內存中。因此,在您myalloc關鍵的錯誤是這兩行:

allocate(i(2)) 
    i => a 

在這裏,你先分配內存的指針i,然後分配i指向a。爲什麼在這種情況下分配我?我認爲這更接近你想要做的:

subroutine myalloc(a,b,n) 
    implicit none 

    real, dimension(n) :: a 
    real, pointer,dimension(:) :: b 
    integer :: n 

    allocate(b(n)) 
    b = a ! This copies the contents of the array a to the allocation for b 

    return 
end 

然後在你的主程序中有一些莫名其妙的東西。爲什麼ij被聲明爲整數?當然他們必須指向真正的數組,如果打算將它們傳遞給你的myalloc,對它們執行分配/複製操作,然後打印它們?如果是這樣的話,那麼改變你的主讓這樣的事情應該是更接近什麼,似乎你正在嘗試做的:

program main 
    implicit none 

    interface 
     subroutine myalloc(a,b,n) 
     real,dimension(n) :: a 
     real,pointer,dimension(:) :: b 
     integer :: n 
     end subroutine myalloc 

     subroutine myprint(i) 
     real,pointer,dimension(:) :: i 
     end subroutine myprint 
    end interface 

    real,pointer,dimension(:) :: i, j 
    real :: a(2) 

    a=(/1.1,2.2/) 
    call myalloc(a,i,2) 

    a=(/3.1,4.2/) 
    call myalloc(a,j,2) 

    call myprint(i) 
    call myprint(j) 

    stop 
end 

有了這些變化,你應該得到這個運行時:

$ ./pointer 
    1.100000  2.200000  
    3.100000  4.200000  

這與您期望的輸出接近嗎?

+0

感謝您的回答。我應該更清楚地解釋我的問題。我需要一個結構,它的細節在主程序中是隱藏的(只能在將要成爲閉源庫的子例程中看到)。所以我試圖用「i」和「j」的整數。我在MPI庫中見過類似的東西,例如MPI_TYPE_COMMIT(type,err),其中type聲明爲整數並可能指向結構。這是另一個有效的嘗試,但我不確定是否可以通過「myMod」編譯爲二進制文件來計算「sType」組件。 http://web.eng.ucsd.edu/~mesmaily/test。f – mem

+0

您可能希望使用'transfer'函數將指針從外部可見類型轉換爲庫內使用的內部指針。在形式上,Fortran 90只支持強類型指針,所以你可能在編譯器/運行時特定的beahviours嘗試這樣做。如果你能支持F2003,那麼互操作性擴展可能值得研究,因爲你有能力處理適當的空指針,就像在C中一樣。我必須說,從你原來的問題來看,沒有一個是明顯的。 – talonmies