4

在 C 代码中看到以下内容很常见:

malloc(sizeof(int)*100);

这将返回一个指向足以容纳 100 个整数的内存块的指针。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

在您的用例中,我认为您可以使用

inquire(iolength=...) io-list

这将为您提供 io-list 需要多少个“文件存储单元”。使用 Fortran 计算文件中的偏移量的一个警告是,“文件存储单元”不必以字节为单位,实际上我记得一个非常流行的编译器默认使用单词(4 个字节)作为文件存储单元。但是,通过使用 iolength 事物,您无需担心这个问题。

于 2013-01-04T21:35:54.923 回答
5

@janneb 的答案将解决 OP 的问题,但它没有回答 Fortran 的“sizeof”问题。

inquire和的组合file_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 回答
1

如果所有记录都相同,这似乎是使用直接访问而不是流访问的情况。然后不要计算文件中的位置,你告诉编译器你想要的记录,它就会访问它。除非您希望这些文件可以跨平台移植或记录不完全相同……那么您必须有更多的控制权或计算记录的长度。虽然最初的 Fortran 90 概念是根据所需的精度声明变量,但现在有可移植的方法来按大小声明变量。使用已经提到的 iso_c_binding 模块或 iso_fortran_env 模块提供的类型。

于 2013-01-04T23:12:58.257 回答