[Next] [Previous] [Top]
TARGET
attribute,
type [, attr] :: name
POINTER
for pointer variables, or
TARGET
for target variables.
INTEGER, TARGET :: list(100)
INTEGER, POINTER :: first, current, last
REAL, POINTER, DIMENSION(:) :: p(:)
REAL, TARGET :: a(3), b(6), c(9)
=
(assignment operator)
=>
(pointer assignment operator)
INTEGER, POINTER :: pt
INTEGER, TARGET :: x=34, y=0
pt => x ! pt points to x
y = pt ! y equals x
pt => y ! pt points to y
pt = 17 ! y equals 17
y = pt !y = target
pt = 17 !target = 17
IF( pt<0 ) THEN !target < 0
...
pt => y
WRITE(6,*) pt !output is y
READ(5,*) pt !input into y
A pointer must be associated with a target to be dereferenced.
NULLIFY
statement.
NULLIFY
statement:
NULLIFY( pointer )
Nullified pointers can be thought of as `pointing at nothing'.
ASSOCIATED( pointer [,TARGET] )
TRUE
. if pointer
points to a valid target (or to TARGET
, if present),
FALSE
. if pointer
has been nullified (or points to a target other than TARGET
, if present).
REAL, POINTER :: pt !undefined
REAL, TARGET :: t1, t2
...
test = ASSOCIATED( pt ) !illegel
pt => t1
test = ASSOCIATED( pt ) !t
test = ASSOCIATED( pt, t1 ) !t
test = ASSOCIATED( pt, t2 ) !f
...
NULLIFY( pt )
test = ASSOCIATED( pt ) !f
INTEGER, POINTER :: p, pa(:)
...
ALLOCATE( p, pa(100) )
p = 100
pa = 0
...
DEALLOCATE( pa, p) !undefined
INTEGER, POINTER :: pt(:)
...
ALLOCATE( pt(25) )
NULLIFY( pt )
No way to reference the allocated storage (pt
now points elsewhere).
REAL, POINTER :: p1, p2
...
ALLOCATE( p1 )
p2 => p1
DEALLOCATE( p1 )
p2
's target no longer exists (undefined state). Dereferenced data unpredictable!
REAL, TARGET :: grid(10,10)
REAL, POINTER :: centre(:,:), row(:)
centre => grid(4:7,4:7)
row => grid(9,:)
centre => grid(5:6,5:6)
TYPE data
REAL, POINTER :: a(:)
END TYPE data
TYPE(data) :: event(3)
DO i=1, 3
READ(5,*) n
ALLOCATE( event(i)%a(n) )
READ(5,*) event(i)%a
END DO
TYPE list
REAL :: item
TYPE( list ), POINTER :: next
END TYPE list
Note - recursion-like property in declaration allowing the pointer to reference its own data type.
INTENT
attribute.
INTERFACE
SUBROUTINE suba( a )
REAL, POINTER :: a(:)
END SUBROUTINE suba
END INTERFACE
REAL, POINTER :: pt(:)
REAL, TARGET :: data(100)
...
pt => data
CALL suba( pt )
CALL subb( pt )
...
SUBROUTINE subb( b ) !internal
REAL :: b(:) !size=100
...
SUBROUTINE suba( a ) !external
REAL, POINTER :: a(:)
...
POINTER
attribute.
INTERFACE
FUNCTION max_row ( a )
REAl, TARGET :: a(:,:)
REAL, POINTER :: max_row(:)
END FUNCTION max_row
END INTERFACE
REAL, TARGET :: a(3,3)
REAL, POINTER :: p(:)
...
p => max_row ( a )
...
FUNCTION max_row ( a )
REAL, TARGET :: a(:,:)
REAL, POINTER :: max_row(:)
INTEGER :: location(2)
location = MAXLOC( a )
max_row => a(location(1),:)
END FUNCTION max_row