This is a beginners question but I haven't found a comprehensive answer.
What are the differences (if any) of the following declarations?
CHARACTER(5) :: a
CHARACTER, DIMENSION (5) :: b
CHARACTER(LEN=5) :: c
CHARACTER :: d(5)
CHARACTER :: e*5
And: are all of these declarations possible with other types, e.g REAL
?
Three of those declare a character variable that holds a string of 5 characters. Two of them declare an array of 5 characters, each capable of holding a single character.
The two that declare arrays of 5 elements will work the same way to declare an array of 5 reals. The three that declare characters of length 5 have no analog in other variable types. The specific syntax of a subset of those three will compile, however, but will be used to select different kinds of reals, rather than denoting a character length.
Regardless of the type,
<type>,dimension(5) :: b
and<type> :: b(5)
are identical and denote an array of length5
.<type>
can be e.g.character
,integer
,real
,logical
, etc.character(5)
is a short-hand ofcharacter(len=5)
and declares a string of length5
. If the length is omitted, it is assumed to be on.character :: d(5)
is an array of five length-1 strings.character :: e*5
is an older variant to specify the string length.len
is intrinsic to strings (and makes no sence for e.g. floats). You can specify your own derived types to have an lengthlen
, though ("Parameterized derived types"). For integers and floats (and some others) you can specify thekind
of the variable in a similar way.For details consult the Fortran 2008 Standard, Ch. 4.4.3.2 "Character type specifier".