Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between "character*10 :: a" and "character :: a(10)"

Trying to refresh my Fortran 90 knowledge for a project, I have run into some oddity when using internal files. Consider the example code:

! ---- internal_file_confusion.f90 ----
program internal_file_confusion
  implicit none 

  character*40 :: string1
  character :: string2(40)

  write(string1, *) "Hello World 1"
  write(*,*) "string1 = ", string1

  write(string2, *) "Hello World 2"
  write(*,*) "string2 = ", string2

end program 

which when compiled with gfortran crashes, writing to STDOUT

 string1 =  Hello World 1                          
At line 10 of file e:/Daten/tmp/fortran-training/internal_file_confusion.f90
Fortran runtime error: End of record

When declared with the *length notation the character array can be used for internal write, but not when declared with the name(length) notation. Furthermore I noticed that the *length notation seems to be allowed only for character arrays, while it is forbidden with an error message like

Error: Old-style type declaration INTEGER*40 not supported at (1)

for other data types.

What is the difference between these notations and why does it affect use as internal files?

like image 289
kdb Avatar asked Oct 29 '15 13:10

kdb


1 Answers

character*40 :: string is a character string of length 40

character :: string*40 is the same

character(len=40) :: string is also a character string of length 40

character :: string(40) is an array of 40 character strings of length 1

character*40 :: string(40) is an array of 40 character strings of length 40

character :: string(40)*40 is the same

character(len=40) :: string(40) is an array of 40 character strings of length 40

Your second internal writes fails, because it writes to the first string in the array string2. The first string string2(1) is just 1 character long and that is too short. For that reason you get the end of record error condition, the message is too long for the supplied string.

Internal writes treat array elements as separate records (similar to separate lines). One can utilize arrays of string in internal writes if one has more records (lines) to write into the array.

like image 60
Vladimir F Героям слава Avatar answered Sep 29 '22 19:09

Vladimir F Героям слава