Fortran - Punteros

En la mayoría de los lenguajes de programación, una variable de puntero almacena la dirección de memoria de un objeto. Sin embargo, en Fortran, un puntero es un objeto de datos que tiene más funcionalidades que simplemente almacenar la dirección de memoria. Contiene más información sobre un objeto en particular, como tipo, rango, extensiones y dirección de memoria.

Un puntero se asocia con un objetivo por asignación o asignación de puntero.

Declarar una variable de puntero

Una variable de puntero se declara con el atributo de puntero.

Los siguientes ejemplos muestran la declaración de variables de puntero:

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 puntero puede apuntar a:

  • Un área de memoria asignada dinámicamente.

  • Un objeto de datos del mismo tipo que el puntero, con la target atributo.

Asignar espacio para un puntero

los allocateinstrucción le permite asignar espacio para un objeto puntero. Por ejemplo

program pointerExample
implicit none

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

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

1
5

Debe vaciar el espacio de almacenamiento asignado por el deallocate declaración cuando ya no sea necesaria y evitar la acumulación de espacio de memoria no utilizado e inutilizable.

Objetivos y asociación

Un objetivo es otra variable normal, con un espacio reservado para él. Una variable de destino debe declararse con eltarget atributo.

Asocia una variable de puntero con una variable de destino utilizando el operador de asociación (=>).

Reescribamos el ejemplo anterior para demostrar el concepto:

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

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

1
1
5
5
8
8

Un puntero puede ser:

  • Undefined
  • Associated
  • Disassociated

En el programa anterior, tenemos associatedel puntero p1, con el objetivo t1, usando el operador =>. La función asociada prueba el estado de asociación de un puntero.

los nullify declaración disocia un puntero de un objetivo.

Nullify no vacía los objetivos, ya que podría haber más de un puntero apuntando al mismo objetivo. Sin embargo, vaciar el puntero también implica anulación.

Ejemplo 1

El siguiente ejemplo demuestra los conceptos:

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

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

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

Tenga en cuenta que cada vez que ejecute el código, las direcciones de memoria serán diferentes.

Ejemplo 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

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

2  2  2  4