I haven't been following this whole discussion, but I do know
something about how Fortran allocates and passes string argument
(the joys of Fortran/C/python inter-language calls), for what
it's worth.

By definition in the Fortran language all strings have a predefined
length, which Fortran magically knows.  Therefore, it doesn't need
termination (like null termination in C).  In practice, we've found
that most compilers, when you pass a string to a routine, also pass
its length, although you don't do so explicitly, so that "character(len=*)
arg" works.  In practice (and this is probably part of the standard),
Fortran ' ' pads all strings.  As usual, there's no default value
in new strings, so strings declared, string arrays declared, and
string arrays allocated may or may not have any particular value
at initialization.  But if you set a string to ' ', or even '',
it'll actually set it all to spaces, because of the padding.  There's
no null termination.  len(string) returns the overall (allocated
or declared) length, len_trim(string) will return the length ignoring
any trailing spaces.  If the underlying routines receiving the
string want to know how long it is, and they're C routines, they
have to have another (integer, by reference) argument.  Unfortunately,
compilers don't always agree on where that hidden argument goes.
Most, I think, put it after the explicit arguments, but some might
put it right after the string being passed.  If the receiving
routines are Fortran from another compiler, you're just hosed, I
think.

As with every array in Fortran, arrays of strings
are contiguous in memory, and presumably the end of string (1,1)
is right before the beginning of string(2,1), etc.

                                                Noam

Reply via email to