On Tue, 25 Jan 2000 11:23:32 +0100 (MET) Roland Schilling <[log in to unmask]> wrote: > 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? all mailbase lists keep messages for two years and I got them to keep this list indefinitely a couple of months 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 | > +----------------------------------------------------------------------+ > I'm the list owner. url is http://www.mailbase.ac.uk/lists-a-e/comp-fortran-90/ ------------------- Ian Chivers [log in to unmask] * This e-mail message was sent with Execmail V5.0 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%