Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

sizeof in fortran

Tags:

sizeof

fortran

It's quite common in C-code to see stuff like:

malloc(sizeof(int)*100);

which will return a pointer to a block of memory big enough to hold 100 ints. Is there any equivalent in fortran?


Use case:

I have a binary file which is opened as:

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

I know that the file contains "records" which consist of a header with 20 integers, 20 real numbers and 80 characters, then another N real numbers. Each file can have hundreds of records. Basically, I'd like to read or write to a particular record in this file (assuming N is a fixed constant for simplicity).

I can easily calculate the position in the file I want to write if I know the size of each data-type:

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

Currently I have

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

Is there any way to do better?

constraints:

  • The code is meant to be run on a variety of platforms with a variety of compilers. A standard compliant solution is definitely preferred.
like image 219
mgilson Avatar asked Dec 21 '22 11:12

mgilson


1 Answers

In your use case I think you could use

inquire(iolength=...) io-list

That will give you how many "file storage units" are required for the io-list. A caveat with calculating offsets in files with Fortran is that "file storage unit" need not be in bytes, and indeed I recall one quite popular compiler by default using a word (4 bytes) as the file storage unit. However, by using the iolength thing you don't need to worry about this issue.

like image 186
janneb Avatar answered Jan 01 '23 16:01

janneb