On Tue, 25 Jan 2000, Clive Page wrote:
> Further to the question put by Roland Schilling, and Richard Maine's
> reply, I agree that the rules of f95 make it easier, but it is possible to
> do something in f90, albeit with some difficulty. A discussion (I think
> on this list) early last year on how to produce a function which converts ...
Is there an archive where one could look up discussion from a year ago?
> ... an integer to a trimmed and left-justified string produced a couple of
> answers. My contribution was a function of which the declaration part
> was:
>
> FUNCTION int2str(intval) RESULT(string)
> INTEGER , INTENT(IN) :: intval
> INTEGER :: n
> CHARACTER(LEN=12 - MAX(0,SIGN(1,intval)) - VERIFY(TRANSFER(ACHAR(48+&
> (/(MOD(MAX(1,ABS(intval))/10**n,10),n=9,0,-1)/) ), &
> "1234567890"), ACHAR(48)) ) :: string
> INTEGER :: absval, j, k
> CHARACTER(LEN=11) :: buf
>
> If you inspect the CHARACTER statement carefully you can see how it works.
> It seems to be valid Fortran90; at the time it broke several compilers,
> though I think they are mostly fixed now.
>
> An alternative formulation, longer but perhaps more elegant was given by
> someone else (sorry I lost the author's attribution for the moment):
>
> FUNCTION INT2STR(intval) RESULT(string)
> INTEGER , INTENT(IN) :: intval
> CHARACTER(LEN=12 - MAX(0,SIGN(1,intval)) - VERIFY( &
> ACHAR(48+MOD(ABS(intval)/1000000000,10)) // &
> ACHAR(48+MOD(ABS(intval)/100000000,10)) // &
> ACHAR(48+MOD(ABS(intval)/10000000,10)) // &
> ACHAR(48+MOD(ABS(intval)/1000000,10)) // &
> ACHAR(48+MOD(ABS(intval)/100000,10)) // &
> ACHAR(48+MOD(ABS(intval)/10000,10)) // &
> ACHAR(48+MOD(ABS(intval)/1000,10)) // &
> ACHAR(48+MOD(ABS(intval)/100,10)) // &
> ACHAR(48+MOD(ABS(intval)/10,10)) // &
> ACHAR(48+MOD(MAX(1,ABS(intval)),10)), ACHAR(48))) :: string
> INTEGER :: absval, j, k
> CHARACTER(LEN=11) :: buf
>
> Perhaps one of these will give Roland Schilling some ideas. :-)
Yes, it does. Thanks a lot. Studying the rules for 'specification
expressions' resulted in the understanding that I cannot solve my
problem this way. What I really do not understand is why I'm not
allowed to embed something like the trim command in a character
function such that it returns the trimmed character string.
> One thing to bear in mind is that Standard Fortran does not permit
> recursive I/O, so that if you have a function containing even an internal
> file READ or WRITE the function cannot itself be used in the I/O list of
> another READ or WRITE statement. This can be a significant restriction.
Yes, I know this, and I agree that this is another significant
restriction. I can imagine why it is not allowed to do recursive
I/O, as long as it is external I/O. But I cannot see why this
restriction also applies to internal I/O. Hopefully these
deficiencies will go away with F2K.
Roland Schilling
+----------------------------------------------------------------------+
| Roland Schilling Home-Office: +49(89)32929-670 |
| Max-Planck-Institut fuer Quantenoptik Phone: +49(89)32905-265 |
| Hans-Kopfermann-Str. 1 Fax: +49(89)32905-200 |
| D-85748 Garching E-mail: [log in to unmask] |
| Germany http://www.geo600.uni-hannover.de |
+----------------------------------------------------------------------+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|