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