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 Intel®EM64T and 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
(KIND=INT_PTR_KIND()) 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 Intel® EM64T and Itanium-based systems, the declaration for p in the INTERFACE block is equivalent to INTEGER(8) p and on IA-32 systems, it is equivalent to INTEGER (4) 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