Fortran - Puntatori
Nella maggior parte dei linguaggi di programmazione, una variabile puntatore memorizza l'indirizzo di memoria di un oggetto. Tuttavia, in Fortran, un puntatore è un oggetto dati che ha più funzionalità rispetto alla semplice memorizzazione dell'indirizzo di memoria. Contiene più informazioni su un particolare oggetto, come tipo, rango, estensioni e indirizzo di memoria.
Un puntatore è associato a un obiettivo tramite allocazione o assegnazione del puntatore.
Dichiarazione di una variabile puntatore
Una variabile pointer viene dichiarata con l'attributo pointer.
I seguenti esempi mostrano la dichiarazione di variabili puntatore:
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 puntatore può puntare a -
Un'area di memoria allocata dinamicamente.
Un oggetto dati dello stesso tipo del puntatore, con l'estensione target attributo.
Allocazione dello spazio per un puntatore
Il allocateL'istruzione consente di allocare spazio per un oggetto puntatore. Ad esempio:
program pointerExample
implicit none
integer, pointer :: p1
allocate(p1)
p1 = 1
Print *, p1
p1 = p1 + 4
Print *, p1
end program pointerExample
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
1
5
È necessario svuotare lo spazio di archiviazione allocato da deallocate dichiarazione quando non è più necessario ed evitare l'accumulo di spazio di memoria inutilizzato e inutilizzabile.
Obiettivi e associazione
Un obiettivo è un'altra variabile normale, con spazio riservato per esso. Una variabile di destinazione deve essere dichiarata contarget attributo.
Associare una variabile puntatore a una variabile di destinazione utilizzando l'operatore di associazione (=>).
Riscriviamo l'esempio precedente, per dimostrare il concetto:
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
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
1
1
5
5
8
8
Un puntatore può essere -
- Undefined
- Associated
- Disassociated
Nel programma sopra, abbiamo associatedil puntatore p1, con il target t1, utilizzando l'operatore =>. La funzione associata verifica lo stato di associazione di un puntatore.
Il nullify l'istruzione dissocia un puntatore da un obiettivo.
Nullify non svuota i target in quanto potrebbero esserci più puntatori che puntano allo stesso target. Tuttavia, lo svuotamento del puntatore implica anche l'annullamento.
Esempio 1
Il seguente esempio dimostra i concetti:
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
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
1
1
5
5
8
8
8
T
F
T
0
0
10
10
Tieni presente che ogni volta che esegui il codice, gli indirizzi di memoria saranno diversi.
Esempio 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
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
2 2 2 4