Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
Объявления
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
29282 Обсуждение

F77 Data statement to F90 parameter - something not quite right

TommyCee
Начинающий
1 180Просмотр.

Here I go again - messing w/ F77 code from the late 90s.  This little subroutine has been converted to F90 but something's not quite right w/ the conversion of the 2 DATA statements.  The parameter statement I have "seems" right but compiler gives:

Error: The shapes of the array expressions do not conform.   for [UPCASE],  [LWCASE], [INDCHECK] & [RUNSTREAM]

Strangely, this line gives no compiler error but doesn't seem equivalent:

character(1), parameter :: UPCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', lwcase = 'abcdefghijklmnopqrstuvwxyz'

Is the real trouble the interaction with the INDEX intrinsic?

Full code snippet is here:

subroutine lowerUPPER(iString,Runstream) 
!================================================================================================100
! Purpose: To convert all characters from lower case to UPPER CASE (using INDEX intrinsic function).             
!          Note that the character(80) 'Runstream' Variable Includes the Original Case for Echoing 
!          and for Later Use To Retrieve Filenames.
!================================================================================================100
implicit none
!Local variables: 
!character     :: UPCASE*26
!character     :: lwcase*26
character*(*) :: Runstream
integer(4)    :: I, iString, IndCheck
                                                                        
!Variable Initializations:
!DATA UPCASE/'ABCDEFGHIJKLMNOPQRSTUVWXYZ'/ 
!DATA LWCASE/'abcdefghijklmnopqrstuvwxyz'/ 

character(1), dimension(26), parameter :: UPCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', lwcase = 'abcdefghijklmnopqrstuvwxyz'

      DO 20 I = 1, iString 
         if (Runstream(I:I) .NE. ' ') then 
            IndCheck = INDEX(lwcase,Runstream(I:I)) 
            if (IndCheck .NE. 0) then 
               Runstream(I:I) = UPCASE(IndCheck:IndCheck) 
            endif 
         endif 
   20 EndDo 
                                                                        
      return 

End subroutine lowerUPPER
0 баллов
9 Ответы
TommyCee
Начинающий
1 180Просмотр.

Oops - in the code snippet, this is the line that I used (I omitted the brackets):

character(1), dimension(26), parameter :: UPCASE = ['ABCDEFGHIJKLMNOPQRSTUVWXYZ'], lwcase = ['abcdefghijklmnopqrstuvwxyz']

 

DavidWhite
Ценный участник II
1 180Просмотр.

Fortran does not use an array of characters to store strings, as does C.  You should be using

character(LEN=26), parameter :: UPCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', lwcase = 'abcdefghijklmnopqrstuvwxyz'

Then the code (I:I) extracts a substring from the two strings, rather than the Ith element.

If you want an array, you would need to use

character(1), dimension(26), paramter :: UPCASE =(/'A', 'B', 'C', ..... /)

Then you would reference the Ith element as UPCASE(I).

Regards,

David

FortranFan
Почетный участник III
1 180Просмотр.

As explained by David, your use of UPCASE variable in line 24 above is like that of an usual Fortran string.  So you can use something like the code below as your lowerUPPER procedure:

SUBROUTINE lowerUPPER(iString,Runstream)

   !================================================================================================100
   ! Purpose: To convert all characters from lower case to UPPER CASE (using INDEX intrinsic function).
   !          Note that the character(80) 'Runstream' Variable Includes the Original Case for Echoing
   !          and for Later Use To Retrieve Filenames.
   !================================================================================================100

   IMPLICIT NONE

   !.. Argument list
   INTEGER(4), INTENT(IN)          :: iString
   CHARACTER(LEN=*), INTENT(INOUT) :: Runstream

   !.. Local variables
   INTEGER(4) :: I
   INTEGER(4) :: IndCheck

   !.. Constants
   CHARACTER(LEN=26), PARAMETER :: UPCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
   CHARACTER(LEN=26), PARAMETER :: lwcase = 'abcdefghijklmnopqrstuvwxyz'

   DO I = 1, iString
      IF (Runstream(I:I) /= ' ') THEN
         IndCheck = INDEX(lwcase,Runstream(I:I))
         IF (IndCheck /= 0) THEN
            Runstream(I:I) = UPCASE(IndCheck:IndCheck)
         END IF
      END IF
   END DO

   RETURN

END SUBROUTINE lowerUPPER

This is assuming you want the same logic in converting the string to upper case as you showed originally.  You may also want to look into the intrinsic functions ICHAR and CHAR respectively and use them instead to do the string conversion; this way, you will get faster performance and not need the UPCASE and lwcase constants in your code.

TommyCee
Начинающий
1 180Просмотр.

Thank you one and all for your great responses!  I would have posted back sooner but was UNable to access this post in my usual way!  (I could access all other posts, but not THIS one.)  I've never experienced this before on IDZ.  I am now accessing this via another machine (Win7 laptop).

David White nailed it & FortranFan did a bang-up job rewriting my routine.  Kudos all!

It turns out that I had mistakenly interpreted UPCASE & lwcase as arrays, vs. just simple 26-character strings.  Duh.

As was duly pointed out, the answer was:

character(26), parameter :: UPCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', lwcase = 'abcdefghijklmnopqrstuvwxyz'

jimdempseyatthecove
Почетный участник III
1 180Просмотр.

>>Thank you one and all for your great responses!  I would have posted back sooner but was UNable to access this post in my usual way!  (I could access all other posts, but not THIS one.)  I've never experienced this before on IDZ.  I am now accessing this via another machine (Win7 laptop).

Of late, I have been having some weird forum access issues too. Many thread links open, some don't IE 10.0.14. When this happens, I open a FireFox session (leaving IE open at "back one" from error), copy the link from IE, paste it into FireFox, the page opens.

Something on those pages are causing this behavior.

TC: you might want to try the dual browser thing to save you a trip to the other computer

Jim Dempsey

Steven_L_Intel1
Сотрудник
1 180Просмотр.

Tommy's problem was that his browser had cached an error page. He cleared his browser cache and the problem resolved.

jimdempseyatthecove
Почетный участник III
1 180Просмотр.

>>Tommy's problem was that his browser had cached an error page. He cleared his browser cache and the problem resolved.

I am not a web page programmer. This said, there must be an attribute such as "don't cache me". It would save a lot of grief if there were an attribute and if it were used properly.

Jim Dempsey

Steven_L_Intel1
Сотрудник
1 180Просмотр.

Most of the time you want caching. But every once in a while it causes a problem.

JohnNichols
Ценный участник III
1 180Просмотр.

Mum says dad's been cached at the pub for 40 years, she wants the innkeeper to pay for the funeral as that is where all the money went

Ответить