4

C コードでは、次のようなものがよく見られます。

malloc(sizeof(int)*100);

これは、100 int を保持するのに十分な大きさのメモリ ブロックへのポインタを返します。fortranに同等のものはありますか?


使用事例:

次のように開かれるバイナリファイルがあります。

open(unit=10,file='foo.dat',access='stream',form='unformatted',status='old')

このファイルには、20 個の整数、20 個の実数、80 個の文字、さらに別Nの実数を含むヘッダーで構成される「レコード」が含まれていることを知っています。各ファイルには数百のレコードが含まれる場合があります。基本的に、このファイルの特定のレコードを読み書きしたいと思います (N簡単にするために固定定数であると仮定します)。

各データ型のサイズがわかっていれば、書き込みたいファイル内の位置を簡単に計算できます。

header_size = SIZEOF_INT*20 + SIZEOF_FLOAT*20 + SIZEOF_CHAR*80
data_size = N*SIZEOF_FLOAT
position = (record_num-1)*(header_size+data_size)+1

現在、私は持っています

!Hardcoded :-(
SIZEOF_INT = 4
SIZEOF_FLOAT = 4
SIZEOF_DOUBLE = 8
SIZEOF_CHAR = 1

より良い方法はありますか?

制約:

  • このコードは、さまざまなコンパイラを使用してさまざまなプラットフォームで実行できるようになっています。標準に準拠したソリューションが間違いなく優先されます。
4

3 に答える 3

5

@jannebの回答はOPの質問に対処しますが、Fortranの「sizeof」の質問には回答しません。

との組み合わせによりinquirefile_storage_size型のサイズが得られます。このコードを試してください:

program sizeof
    use iso_fortran_env
    integer :: num_file_storage_units
    integer :: num_bytes
    inquire(iolength=num_file_storage_units) 1.0D0
    num_bytes = num_file_storage_units*FILE_STORAGE_SIZE/8
    write(*,*) "double has size: ", num_bytes
end program sizeof

参照: http://gcc.gnu.org/onlinedocs/gfortran/ISO_005fFORTRAN_005fENV.html http://h21007.www2.hp.com/portal/download/files/unprot/fortran/docs/lrm/lrm0514.htm

于 2013-07-14T20:26:33.900 に答える
5

あなたのユースケースでは、私はあなたが使用できると思います

inquire(iolength=...) io-list

これにより、io-list に必要な「ファイル ストレージ ユニット」の数がわかります。Fortran でファイルのオフセットを計算する際の注意点は、「ファイル記憶単位」をバイト単位にする必要がないことです。実際、ファイル記憶単位としてデフォルトで単語 (4 バイト) を使用する非常に人気のあるコンパイラを思い出します。ただし、iolength を使用すると、この問題を心配する必要はありません。

于 2013-01-04T21:35:54.923 に答える