Handling Integer Pointers

Integer pointers (also known as Cray*-style pointers) are not the same as Fortran 90 pointers, but are instead like C pointers. Integer pointers are 4-byte INTEGER quantities on IA-32 systems, and 8-byte INTEGER quantities on ItaniumŪ-based systems.

Passing Integer Pointers

When passing an integer pointer to a routine written in another language:

For example:

! Fortran main program.

      INTERFACE

         SUBROUTINE Ptr_Sub (p)

         !DEC$ ATTRIBUTES C, ALIAS:'Ptr_Sub_' :: Ptr_Sub

            INTEGER p

         END SUBROUTINE Ptr_Sub

      END INTERFACE

      REAL A(10), VAR(10)

      POINTER (p, VAR) ! VAR is the pointee

                       ! p is the integer pointer

      p = LOC(A)

      CALL Ptr_Sub (p)

      WRITE(*,*) 'A(4) = ', A(4)

      END

  !

  //C subprogram

      void Ptr_Sub (float *p)

      {

         p[3] = 23.5;

      }

On Itanium-based systems, the declaration for p in the INTERFACE block should be INTEGER(8) p.

When the main Fortran program and C function are built and executed, the following output appears:

A(4) = 23.50000

Receiving Pointers

When receiving a pointer from a routine written in another language:

For example:

 ! Fortran subroutine.      SUBROUTINE Iptr_Sub (p)      !DEC$ ATTRIBUTES C, ALIAS:'Iptr_Sub_' :: Iptr_Sub         integer VAR(10)         POINTER (p, VAR)         OPEN (8, FILE='STAT.DAT')         READ (8, *) VAR(4) ! Read from file and store the                            ! fourth element of VAR      END SUBROUTINE Iptr_Sub ! //C main program extern void Iptr_Sub(int *p); main ( void ) {   int a[10];   Iptr_Sub (&a[0]);   printf("a[3] = %i\n", a[3]); }

When the main C program and Fortran subroutine are built and executed, the following output appears if the STAT.DAT file contains 4:

   a[3] = 4