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

Function Overloading

brunocalado
Beginner
1,000 Views
How can I create a interface for overload this functions?

I need just to use
CALL func(a,b)
for the all functions

SUBROUTINE func1(a,b)
INTEGER :: a,b
END SUBROUTINE

SUBROUTINE func2(a,b)
REAL :: a,b
END SUBROUTINE


0 Kudos
1 Solution
Steven_L_Intel1
Employee
1,000 Views
This is how it's done. Note that geneSize is not defined here, but I assume you'll take care of that.

[plain]MODULE test
USE IFPORT

INTERFACE getRandom
MODULE PROCEDURE getRandomA
MODULE PROCEDURE getRandomB
MODULE PROCEDURE getRandomC
END INTERFACE

CONTAINS
INTEGER FUNCTION getRandomA()
IMPLICIT NONE
getRandomA = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION

INTEGER FUNCTION getRandomB(max)
IMPLICIT NONE
INTEGER, INTENT(IN) :: max
getRandomB = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION

INTEGER FUNCTION getRandomC(min, max)
IMPLICIT NONE
INTEGER, INTENT(IN) :: min, max
getRandomC = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION
END MODULE

[/plain]

View solution in original post

0 Kudos
4 Replies
Xiaoping_D_Intel
Employee
1,000 Views
Quoting - brunocalado
How can I create a interface for overload this functions?

I need just to use
CALL func(a,b)
for the all functions

SUBROUTINE func1(a,b)
INTEGER :: a,b
END SUBROUTINE

SUBROUTINE func2(a,b)
REAL :: a,b
END SUBROUTINE



You can use generic name for procedures like below:

INTERFACE func

SUBROUTINE func1(a,b)
INTEGER :: a,b
END SUBROUTINE

SUBROUTINE func2(a,b)
REAL :: a,b
END SUBROUTINE

END INTERFACE

0 Kudos
brunocalado
Beginner
1,000 Views
Not working...

What's wrong?

INTERFACE getRandom
INTEGER FUNCTION getRandomA()
END FUNCTION
INTEGER FUNCTION getRandomB(max)
INTEGER, INTENT(IN) :: max
END FUNCTION
INTEGER FUNCTION getRandomC(min,max)
INTEGER, INTENT(IN) :: min, max
END FUNCTION
END INTERFACE


MODULE test
USE IFPORT
CONTAINS
INTEGER FUNCTION getRandomA()
IMPLICIT NONE
getRandomA = MOD( IRAND(), geneSize-1 ) + 1 ! GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION

INTEGER FUNCTION getRandomB(max)
IMPLICIT NONE
INTEGER, INTENT(IN) :: max
getRandomB = MOD( IRAND(), geneSize-1 ) + 1 ! GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION

INTEGER FUNCTION getRandomC(min, max)
IMPLICIT NONE
INTEGER, INTENT(IN) :: min, max
getRandomC = MOD( IRAND(), geneSize-1 ) + 1 ! GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION
END MODULE
0 Kudos
Steven_L_Intel1
Employee
1,001 Views
This is how it's done. Note that geneSize is not defined here, but I assume you'll take care of that.

[plain]MODULE test
USE IFPORT

INTERFACE getRandom
MODULE PROCEDURE getRandomA
MODULE PROCEDURE getRandomB
MODULE PROCEDURE getRandomC
END INTERFACE

CONTAINS
INTEGER FUNCTION getRandomA()
IMPLICIT NONE
getRandomA = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION

INTEGER FUNCTION getRandomB(max)
IMPLICIT NONE
INTEGER, INTENT(IN) :: max
getRandomB = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION

INTEGER FUNCTION getRandomC(min, max)
IMPLICIT NONE
INTEGER, INTENT(IN) :: min, max
getRandomC = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION
END MODULE

[/plain]

0 Kudos
brunocalado
Beginner
1,000 Views
This is how it's done. Note that geneSize is not defined here, but I assume you'll take care of that.

[plain]MODULE test
USE IFPORT

INTERFACE getRandom
MODULE PROCEDURE getRandomA
MODULE PROCEDURE getRandomB
MODULE PROCEDURE getRandomC
END INTERFACE

CONTAINS
INTEGER FUNCTION getRandomA()
IMPLICIT NONE
getRandomA = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION

INTEGER FUNCTION getRandomB(max)
IMPLICIT NONE
INTEGER, INTENT(IN) :: max
getRandomB = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION

INTEGER FUNCTION getRandomC(min, max)
IMPLICIT NONE
INTEGER, INTENT(IN) :: min, max
getRandomC = MOD( IRAND(), geneSize-1 ) + 1 !        GENERATE RANDOM FROM 1 TO geneSize-1
END FUNCTION
END MODULE

[/plain]


Worked.

Thank you.
0 Kudos
Reply