Community
cancel
Showing results for 
Search instead for 
Did you mean: 
Highlighted
New Contributor I
19 Views

Function return value in IF STATEMENT

Friends;

This is probably silly question: why does the first if statement gives Compilation error #6385 while the second one compiles.

C
C     LOGICAL :: TEST
C
      IF(COMPASX(RUNTYP,STAT))    GOTO 91
C      
      TEST=COMPASX(RUNTYP,STAT)
      IF(TEST)                    GOTO 91
C

The function COMPASX is defined as follows:

      !-----------------------------------------------------------------
      LOGICAL FUNCTION COMPASX(AONE,ATWO)
      !
      IMPLICIT INTEGER (I-N)
      IMPLICIT REAL (A-H,O-Z)
      !
      !LOGICAL::COMPAS
      CHARACTER,INTENT(IN) :: AONE(4), ATWO(4)
      !
      ! standard Fortran IV convention
      !
      DO I=1,4
          IF( (LLE(AONE(I),ATWO(I)) .XOR. LLE(ATWO(I),AONE(I))) ) THEN
              COMPASX=.FALSE.
              RETURN
          END IF
      END DO
      !
      COMPASX=.TRUE.
      !
      RETURN
      END FUNCTION COMPASX
      
      !-----------------------------------------------------------------

By the way, could somebody suggest a better way to compare two character arrays in FORTRAN?

Regards;

I. Konuk

0 Kudos
5 Replies
Highlighted
Valued Contributor III
19 Views

You have more than one

You have more than one problem but I think the first one is that the type of function compasx is not known where it is called. If compasx was in a module or there was an explicit interface that would not be the case. Adding logical, external :: compasx in the calling routine would be helpful to the compiler. The types of your call parameters also need examination.
0 Kudos
Highlighted
New Contributor II
19 Views

By the way, could somebody

By the way, could somebody suggest a better way to compare two character arrays in FORTRAN?

The following code fits with your coding approach and is valid Fortran:

  DO I=1,4
    IF ( AONE(I) .EQ. ATWO(I) ) CYCLE
    COMPASX=.FALSE.
    RETURN
  END DO
  COMPASX=.TRUE.
  RETURN

I would suggest that if there is confusion with the order or evaluation of functions in an IF statement (more complex than presented), then your second approach is to be preferred as it removes any ambiguity of order or evaluation when reading the code.

0 Kudos
Highlighted
19 Views

John,

John,

#3 is not always correct. Depending on character set, one could be defined as having two characters that are lexically equal yet numerically different.

If numerically equal is sufficient, then consider:

!-----------------------------------------------------------------
LOGICAL FUNCTION COMPASX(AONE,ATWO)
  IMPLICIT NONE
  CHARACTER,INTENT(IN) :: AONE(4), ATWO(4)
  INTEGER(4) :: MOLD
  !
  COMPASX = (TRANSFER(AONE,MOLD) == TRANSFER(ATWO,MOLD)) 
  RETURN
END FUNCTION COMPASX

!-----------------------------------------------------------------

Should that function be placed in a module, then chances of inlining are good.

Jim Dempsey

0 Kudos
Highlighted
New Contributor I
19 Views

Dear Friends:

Dear Friends:

Thank you for the clear explanation (I kind of guessed it) and helpful suggestions. I will use the approach closer to mine but much cleaner.

Regards;

I. Konuk

0 Kudos
Highlighted
19 Views

FWIW>>Depending on character

FWIW>>Depending on character set, one could be defined as having two characters that are lexically equal yet numerically different.

As an example: 'a' and 'A' could have the same collating sequence (depending on the selected collating sequence).

Jim Dempsey

0 Kudos