Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
28446 Discussions

Character string allocation in elemental subroutine

Simon_Geard
New Contributor I
364 Views

If I build and run the attached program I get

Method 1:
   {Monday   }
   {Tuesday  }
   {Wednesday}
   {Thursday }
   {Friday   }
   {Saturday }
   {Sunday   }

but I don't understand why. I'd have thought that it should be


Method 1:
   {Monday}
   {Tuesday}
   {Wednesday}
   {Thursday}
   {Friday}
   {Saturday}
   {Sunday}

which I can get by using trim(n) on line 22. Could someone please explain to me why I get the first result. Thanks.

0 Kudos
6 Replies
Steven_L_Intel1
Employee
364 Views

When you have:

week = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']

this is an array constructor with elements of different lengths. If you compile with standards checking, you'll get:

If type specification is omitted, each ac-value expression  in the array constructor of type CHARACTER must have the same length type parameters. 

What we do as an extension is pad the shorter elements with blanks to the length of the longest element. So you're assigning values all the same length to the allocatable character components.You need the trim. To be standard compliant, you also need to add CHARACTER(9):: to the array constructor to set the length,

0 Kudos
Simon_Geard
New Contributor I
364 Views

Thanks, I now understand what is happening but not what the rationale is behind it. If I replace the array constructor with

    week(1) = 'Monday'
    week(2) = 'Tuesday'
    week(3) = 'Wednesday'
    week(4) = 'Thursday'
    week(5) = 'Friday'
    week(6) = 'Saturday'
    week(7) = 'Sunday'

then I don't need to use trim and I get the second result. From your reply the array constructor I used shouldn't compile so why isn't it's behaviour defined to be equivalent to individual assignments?

0 Kudos
Steven_L_Intel1
Employee
364 Views

I did not say it shouldn't compile, I said it was nonstandard and that we defined a meaning for it as an extension. In an array of character values, all values have the same length. You have to go to a derived type array to get the behavior you want. as you found. It's not the same as individual assignments as then there is no requirement that the expressions have the same length.

0 Kudos
Simon_Geard
New Contributor I
364 Views

Okay, I tried the following variation but hit a commpiler bug:

module daytime
    implicit none
    type day
        character(len=:), allocatable  :: name
    contains
        procedure, private             :: set_name_dtm
        procedure, private, pass(d_in) :: set_name_d
        generic, public                ::assignment(=) => set_name_dtm, set_name_d
    end type day
     
    abstract interface
        subroutine print_day(this)  
            import :: day
            type(day), intent(in) :: this
        end subroutine print_day
    end interface
     
contains
 
    elemental subroutine set_name_d(d_out, d_in)
        type(day), intent(out) :: d_out
        class(day), intent(in) :: d_in
        d_out%name = d_in%name
    end subroutine set_name_d
 
    elemental subroutine set_name_dtm(this, n)
        class(day), intent(inout)    :: this
        character(len=*), intent(in) :: n
        this%name = n     ! trim(n)  
    end subroutine set_name_dtm
     
end module daytime
 
 
program rdays
    use daytime
    implicit none
    integer, parameter            :: ndays = 7
    type(day)                     :: week(ndays)
    integer                       :: nargs, larg,  i
    character (len=16)            :: arg
    logical                       :: reversed = .false.
    procedure(print_day), pointer :: output
     
    nargs = command_argument_count()
    if (nargs == 1) then
        call get_command_argument(1, arg, larg)
        if (arg(1:larg) == 'rev') reversed = .true.
    end if
 
    week = [day('Monday'),day('Tuesday'),day('Wednesday'),day('Thursday'),day('Friday'),day('Saturday'),day('Sunday')]
     
end program rdays

ifort daytime2_f.f90

daytime2_f.f90(1): catastrophic error: **Internal compiler error: internal abort** Please report this error along with the circumstances in which it occurred in a Software Problem Report.  Note: File and line given may not be explicit cause of this error.
compilation aborted for daytime2_f.f90 (code 1)

 

0 Kudos
Steven_L_Intel1
Employee
364 Views

Sigh. Ok, thanks - we'll check it out.

0 Kudos
Steven_L_Intel1
Employee
364 Views

I can reproduce the internal compiler error up through version 15.0.1 but not in the current 15.0.2.

0 Kudos
Reply