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