在C代码中看到以下内容是很常见的:
malloc(sizeof(int)*100);
Run Code Online (Sandbox Code Playgroud)
它将返回一个指针,指向一块足以容纳100个整数的内存块.在fortran中有没有相同的东西?
使用案例:
我有一个二进制文件打开为:
open(unit=10,file='foo.dat',access='stream',form='unformatted',status='old')
Run Code Online (Sandbox Code Playgroud)
我知道该文件包含"记录",其中包含一个包含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
Run Code Online (Sandbox Code Playgroud)
目前我有
!Hardcoded :-(
SIZEOF_INT = 4
SIZEOF_FLOAT = 4
SIZEOF_DOUBLE = 8
SIZEOF_CHAR = 1
Run Code Online (Sandbox Code Playgroud)
有什么方法可以做得更好吗?
限制:
在您的用例中,我认为您可以使用
inquire(iolength=...) io-list
Run Code Online (Sandbox Code Playgroud)
这将为您提供io-list所需的"文件存储单元"数量.使用Fortran计算文件偏移量的一个警告是"文件存储单元"不需要以字节为单位,实际上我记得一个非常流行的编译器默认使用一个字(4字节)作为文件存储单元.但是,通过使用iolength,你不必担心这个问题.
@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
Run Code Online (Sandbox Code Playgroud)
请参阅:http : //gcc.gnu.org/onlinedocs/gfortran/ISO_005fFORTRAN_005fENV.html http://h21007.www2.hp.com/portal/download/files/unprot/fortran/docs/lrm/lrm0514.htm