- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I met a problem with ABSTRACT INTERFACE.
The definition of ABSTRACT INTERFACE in a MODULE cannot be seen from the procedures in that MODULE.
Here is sample codes.
The following code example won't work.
This one works.
I believe my first sample is compliant to the Fortran2003 standard, but I'm not sure.
What I'm trying to do is passing a comparison function to general sort routine.
Here is my full code, where I met this problem.
Yamajun.
I met a problem with ABSTRACT INTERFACE.
The definition of ABSTRACT INTERFACE in a MODULE cannot be seen from the procedures in that MODULE.
Here is sample codes.
The following code example won't work.
[cpp]MODULE m_mod
IMPLICIT NONE
!
ABSTRACT INTERFACE
INTEGER FUNCTION t_f()
END FUNCTION t_f
END INTERFACE
!
CONTAINS
!------------------------------
INTEGER FUNCTION nf(ifunc)
PROCEDURE (t_f) :: ifunc
PRINT *, ifunc()
RETURN
END FUNCTION nf
!------------------------------
END MODULE m_mod
[/cpp]
This one works.
[cpp]MODULE m_interface
IMPLICIT NONE
!
ABSTRACT INTERFACE
INTEGER FUNCTION t_f()
END FUNCTION t_f
END INTERFACE
!
END MODULE m_interface
!========================================================
MODULE m_mod
USE m_interface
IMPLICIT NONE
CONTAINS
!------------------------------
INTEGER FUNCTION nf(ifunc)
PROCEDURE (t_f) :: ifunc
PRINT *, ifunc()
RETURN
END FUNCTION nf
!------------------------------
END MODULE m_mod
[/cpp]
I believe my first sample is compliant to the Fortran2003 standard, but I'm not sure.
What I'm trying to do is passing a comparison function to general sort routine.
Here is my full code, where I met this problem.
[cpp]MODULE m_interface
IMPLICIT NONE
ABSTRACT INTERFACE
ELEMENTAL LOGICAL FUNCTION t_cmp(x1, x2)
REAL, INTENT(IN) :: x1, x2
END FUNCTION t_cmp
END INTERFACE
END MODULE m_interface
!========================================================
MODULE m_sort
USE m_interface
IMPLICIT NONE
!ABSTRACT INTERFACE
! ELEMENTAL LOGICAL FUNCTION t_cmp(x1, x2)
! REAL, INTENT(IN) :: x1, x2
! END FUNCTION t_cmp
!END INTERFACE
CONTAINS
!-----------------------------------------------------
RECURSIVE FUNCTION quick_sort(x, f) RESULT(res)
REAL, INTENT(IN) :: x(:)
REAL :: res(SIZE(x))
PROCEDURE (t_cmp) :: f
LOGICAL :: mask(SIZE(x) - 1)
IF (SIZE(x) > 1) THEN
mask = f(x(2:), x(1))
res = [ quick_sort( PACK(x(2:), mask), f ), &
x(1), &
quick_sort( PACK(x(2:), .NOT. mask), f ) ]
ELSE
res = x
END IF
RETURN
END FUNCTION quick_sort
! Reference : Arjen Markus, ACM Fortran Forum 27 (2008) 2-5.
!-----------------------------------------------------
END MODULE m_sort
!========================================================
MODULE m_func
IMPLICIT NONE
CONTAINS
!-----------------------------------------------------
ELEMENTAL LOGICAL FUNCTION lt(a, b)
REAL, INTENT(IN) :: a, b
IF (a < b) THEN
lt = .TRUE.
ELSE
lt = .FALSE.
ENDIF
RETURN
END FUNCTION lt
!-----------------------------------------------------
ELEMENTAL LOGICAL FUNCTION gt(a, b)
REAL, INTENT(IN) :: a, b
IF (a > b) THEN
gt = .TRUE.
ELSE
gt = .FALSE.
ENDIF
RETURN
END FUNCTION gt
!-----------------------------------------------------
END MODULE m_func
!========================================================
PROGRAM sort
USE m_sort
USE m_func
IMPLICIT NONE
REAL :: x(30)
PROCEDURE (t_cmp), POINTER :: fp
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(x)
fp => lt
PRINT *, quick_sort(x, fp)
PRINT *
fp => gt
PRINT *, quick_sort(x, fp)
STOP
END PROGRAM sort
[/cpp]
Yamajun.
Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I think this is a known bug but I won't be able to look it up until I return to the office tomorrow. There may be a workaround.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Yes, this is the same problem and I see it is fixed for a release later this year. The bug is that ABSTRACT INTERFACEs cannot be host-associated. They can be use-associated, though. For example, this works:
[plain]MODULE m_mod IMPLICIT NONE ! ABSTRACT INTERFACE INTEGER FUNCTION t_f() END FUNCTION t_f END INTERFACE END MODULE m_mod module m2_mod ! CONTAINS !------------------------------ INTEGER FUNCTION nf(ifunc) USE m_mod PROCEDURE (t_f) :: ifunc PRINT *, ifunc() nf = 0 RETURN END FUNCTION nf !------------------------------ END MODULE m2_mod[/plain]This is our issue DPD200051171
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Fixed in 11.1.
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page