Fortran - Pointeurs

Dans la plupart des langages de programmation, une variable de pointeur stocke l'adresse mémoire d'un objet. Cependant, dans Fortran, un pointeur est un objet de données qui a plus de fonctionnalités que le simple stockage de l'adresse mémoire. Il contient plus d'informations sur un objet particulier, comme le type, le rang, les étendues et l'adresse mémoire.

Un pointeur est associé à une cible par allocation ou affectation de pointeur.

Déclaration d'une variable de pointeur

Une variable de pointeur est déclarée avec l'attribut pointer.

Les exemples suivants montrent la déclaration de variables de pointeur -

integer, pointer :: p1 ! pointer to integer  
real, pointer, dimension (:) :: pra ! pointer to 1-dim real array  
real, pointer, dimension (:,:) :: pra2 ! pointer to 2-dim real array

Un pointeur peut pointer vers -

  • Une zone de mémoire allouée dynamiquement.

  • Un objet de données du même type que le pointeur, avec le target attribut.

Allocation d'espace pour un pointeur

le allocateL'instruction vous permet d'allouer de l'espace pour un objet pointeur. Par exemple -

program pointerExample
implicit none

   integer, pointer :: p1
   allocate(p1)
   
   p1 = 1
   Print *, p1
   
   p1 = p1 + 4
   Print *, p1
   
end program pointerExample

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

1
5

Vous devez vider l'espace de stockage alloué par le deallocate instruction lorsqu'elle n'est plus requise et évite l'accumulation d'espace mémoire inutilisé et inutilisable.

Cibles et association

Une cible est une autre variable normale, avec un espace réservé pour elle. Une variable cible doit être déclarée avec letarget attribut.

Vous associez une variable de pointeur à une variable cible à l'aide de l'opérateur d'association (=>).

Réécrivons l'exemple précédent, pour démontrer le concept -

program pointerExample
implicit none

   integer, pointer :: p1
   integer, target :: t1 
   
   p1=>t1
   p1 = 1
   
   Print *, p1
   Print *, t1
   
   p1 = p1 + 4
   
   Print *, p1
   Print *, t1
   
   t1 = 8
   
   Print *, p1
   Print *, t1
   
end program pointerExample

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

1
1
5
5
8
8

Un pointeur peut être -

  • Undefined
  • Associated
  • Disassociated

Dans le programme ci-dessus, nous avons associatedle pointeur p1, avec la cible t1, utilisant l'opérateur =>. La fonction associée teste l'état d'association d'un pointeur.

le nullify L'instruction dissocie un pointeur d'une cible.

Nullify ne vide pas les cibles car il peut y avoir plus d'un pointeur pointant vers la même cible. Cependant, vider le pointeur implique également l'annulation.

Exemple 1

L'exemple suivant montre les concepts -

program pointerExample
implicit none

   integer, pointer :: p1
   integer, target :: t1 
   integer, target :: t2
   
   p1=>t1
   p1 = 1
   
   Print *, p1
   Print *, t1
   
   p1 = p1 + 4
   Print *, p1
   Print *, t1
   
   t1 = 8
   Print *, p1
   Print *, t1
   
   nullify(p1)
   Print *, t1
   
   p1=>t2
   Print *, associated(p1)
   Print*, associated(p1, t1)
   Print*, associated(p1, t2)
   
   !what is the value of p1 at present
   Print *, p1
   Print *, t2
   
   p1 = 10
   Print *, p1
   Print *, t2
   
end program pointerExample

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

1
1
5
5
8
8
8
T
F
T
0
0
10
10

Veuillez noter que chaque fois que vous exécutez le code, les adresses mémoire seront différentes.

Exemple 2

program pointerExample
implicit none

   integer, pointer :: a, b
   integer, target :: t
   integer :: n
   
   t = 1
   a => t
   t = 2
   b => t
   n = a + b
   
   Print *, a, b, t, n 
   
end program pointerExample

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

2  2  2  4