msg(3f) - [M_strings:TYPE] converts any standard scalar type to a string
 (LICENSE:PD)
 function msg(g1,g2g3,g4,g5,g6,g7,g8,g9,sep)
  class(*),intent(in),optional  :: g1,g2,g3,g4,g5,g6,g7,g8,g9
  character(len=*),intent(in),optional :: sep
  character(len=:),allocatable :: msg
 msg(3f) builds a space-separated string from up to nine scalar values.
 g[1-9]  optional value to print the value of after the message. May
         be of type INTEGER, LOGICAL, REAL, DOUBLEPRECISION, COMPLEX,
         or CHARACTER.
 sep     separator between values. Defaults to a space
 msg     description to print
Sample program:
    program demo_msg
    use M_strings, only : msg
    implicit none
    character(len=:),allocatable :: pr
    character(len=:),allocatable :: frmt
    integer                      :: biggest
    pr=msg('HUGE(3f) integers',huge(0),&
    & 'and real',huge(0.0),'and double',huge(0.0d0))
    write(*,'(a)')pr
    pr=msg('real            :',&
     & huge(0.0),0.0,12345.6789,tiny(0.0) )
    write(*,'(a)')pr
    pr=msg('doubleprecision :',&
     & huge(0.0d0),0.0d0,12345.6789d0,tiny(0.0d0) )
    write(*,'(a)')pr
    pr=msg('complex         :',&
     & cmplx(huge(0.0),tiny(0.0)) )
    write(*,'(a)')pr
    ! create a format on the fly
    biggest=huge(0)
    frmt=msg('(*(i',int(log10(real(biggest))),':,1x))',sep='')
    write(*,*)'format=',frmt
    ! although it will often work, using msg(3f) in an I/O statement
    ! is not recommended
    write(*,*)msg('program will now stop')
    end program demo_msg
Output
   HUGE(3f) integers 2147483647 and real 3.40282347E+38
   and double 1.7976931348623157E+308
   real            : 3.40282347E+38 0.00000000
   12345.6787 1.17549435E-38
   doubleprecision : 1.7976931348623157E+308 0.0000000000000000
   12345.678900000001 2.2250738585072014E-308
   complex         : (3.40282347E+38,1.17549435E-38)
    format=(*(i9:,1x))
    program will now stop
John S. Urban
Public Domain
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(*), | intent(in), | optional | :: | generic1 | ||
| class(*), | intent(in), | optional | :: | generic2 | ||
| class(*), | intent(in), | optional | :: | generic3 | ||
| class(*), | intent(in), | optional | :: | generic4 | ||
| class(*), | intent(in), | optional | :: | generic5 | ||
| class(*), | intent(in), | optional | :: | generic6 | ||
| class(*), | intent(in), | optional | :: | generic7 | ||
| class(*), | intent(in), | optional | :: | generic8 | ||
| class(*), | intent(in), | optional | :: | generic9 | ||
| character(len=*), | intent(in), | optional | :: | sep | 
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(*), | intent(in) | :: | generic1(:) | |||
| class(*), | intent(in), | optional | :: | generic2(:) | ||
| class(*), | intent(in), | optional | :: | generic3(:) | ||
| class(*), | intent(in), | optional | :: | generic4(:) | ||
| class(*), | intent(in), | optional | :: | generic5(:) | ||
| class(*), | intent(in), | optional | :: | generic6(:) | ||
| class(*), | intent(in), | optional | :: | generic7(:) | ||
| class(*), | intent(in), | optional | :: | generic8(:) | ||
| class(*), | intent(in), | optional | :: | generic9(:) | ||
| character(len=*), | intent(in), | optional | :: | sep |