Print

Print


On many (most modern) architectures,  trying to stuff a pointer into an 
integer*4 will not work.  But it is also not necessary.  A simpler 
version of your program is


      subroutine MyRoutine()
        implicit none
        print *, "In routine"
      end subroutine

      program test
      implicit none
      procedure(),pointer :: ptr
      external            :: MyRoutine
      ptr => MyRoutine
      call ptr()
      end

Procedure pointers were put into Fortran just so you would not have to 
play the games below. Procedure pointers are a feature of the latest 
standard, but I suspect IBM has them implemented.  Customers ranked 
procedure pointers pretty high on the implementation priority lists.

Cheers,
Bill


Drew Mccormack wrote:

> I have just been playing around with the 'external' keyword, trying  
> to 'trick' fortran into storing a pointer to a subroutine for me.  
> Alas, my XLF compiler tells me at run-time that I have issued an  
> illegal instruction. Can anyone explain to me why the following  
> doesn't work?
>
>
> subroutine MyRoutine()
>   implicit none
>   print *,'In routine'
> end subroutine
>
> subroutine Message(routine)
>   implicit none
>   external routine
>   call routine()
> end subroutine
>
> subroutine saveOrMessageProcPointer(ptr, savePtr)
>   implicit none
>   integer*4        :: ptr
>   logical          :: savePtr
>   integer*4, save  :: savedPtr
>   if ( savePtr) then
>     savedPtr = ptr
>   else
>     call Message(savedPtr)
>   endif
> end subroutine
>
> program Test
>   implicit none
>   external MyRoutine
>   call saveOrMessageProcPointer(MyRoutine, .true.)
>   call saveOrMessageProcPointer(MyRoutine, .false.)
> end program
>
>
> Regards,
> Drew
>
> ---------------------------------------------------------
> Drew McCormack
>
> www.maniacalextent.com


-- 
Bill Long                                   [log in to unmask]
Fortran Technical Support    &              voice: 651-605-9024
Bioinformatics Software Development         fax:   651-605-9142
Cray Inc., 1340 Mendota Heights Rd., Mendota Heights, MN, 55120