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