2014-03-12 88 views
2

Fortran內部函數transfer可用於將派生類型轉換爲實數或整數數組。當在依賴原始類型(整數,實數等)的數組進行持久化的遺留系統中工作時,這可能非常有用。確定內存中的Fortran派生類型大小

下面的代碼運行至少在ifortgfortran和一個簡單的派生類型例如轉換爲整數陣列(與溶液更新):

program main 
    implicit none 

    integer, parameter :: int_mem_size = storage_size(1) 

    type subtype 
     integer a 
     double precision b 
    end type subtype 

    type :: mytype 
     integer :: foo 
     double precision :: bar 
     type(subtype) :: some_type 
    end type 

    type(mytype) :: my_var 
    type(subtype) :: my_subtype 

    ! Old version: integer :: x(30) 
    integer, allocatable :: x(:) 
    integer :: mem_size 

    !Allocate array with required size 
    mem_size = storage_size(my_var) 
    allocate(x(mem_size/int_mem_size)) 

    my_subtype%a = 1 
    my_subtype%b = 2.7 

    my_var%foo = 42 
    my_var%bar = 3.14 
    my_var%some_type = my_subtype 

    write(*,*) "transfering..." 
    x = transfer(my_var, x) 
    write(*,*) "Integer transformation:", x 

end program main 

在我的PC,這是輸出(此結果是至少依賴於平臺):

transfering... 
Integer transformation:     42   0 1610612736 1074339512   
999   0 -1610612736 1074108825 

我的問題是,我「猜測」,一個30元件長整型陣列足夠大,以存儲該數據結構。有什麼方法可以確定數組需要多大才能存儲整個數據結構?

回答

4

如果您有符合Fortran 2008的編譯器或足夠兼容的編譯器,您會發現內部函數storage_size,它返回用於存儲其參數的位數。如果大多數我熟悉的編譯器實現一個非標準函數來做到這一點,英特爾Fortran編譯器有一個名爲sizeof的函數,它返回存儲其參數所需的字節數。

+0

這似乎是伎倆,謝謝!我已經更新了示例代碼以反映任何感興趣的人的解決方案 – Paul