En cualquier lenguaje de
programación, un apuntador es una variable cuyo contenido es la dirección en
memoria de otra variable, una estructura de datos o un procedimiento.
En RPG IV (o Free) el tipo de variable APUNTADOR se especifica en la hoja D colocando este carácter en la
posición correspondiente a la definición del tipo: *
Esto le indica al compilador que
la variable se utilizará para guardar la dirección en memoria de alguna otra
estructura de datos. El contenido de esta variable tipo apuntador no se
modifica a lo largo del programa. En cambio, para una variable de otro tipo
(numérica, alfabética, estructura de datos, arreglos, etc.) el programador puede modificar su valor.
Una variable tipo apuntador puede
contener la dirección de un procedure o de una variable. Si el apuntador
contiene la dirección de un procedure, debe utilizarse la palabra clave
(Keyword) PROCPTR en la definición del apuntador.
Un apuntador que es utilizado
para contener la dirección de variables o estructuras de datos es denominado “puntero
de base” en inglés (basing pointer). Se puede acceder a variables, estructuras
de datos y arreglos mediantes estos
punteros de base. La palabra clave (Keyword) BASED es especificada en la definición de la
variable cuyo valor es asignado según el contenido de una dirección de otra
variable.
Un ejemplo de este código es el siguiente:
d W_Pointer
s *
d w_nombre
s 30
inz(‘Maria Jimenez’)
d Nombre
s 05
based(W_Pointer)
W_pointer = %addr(W_nombre)
En este punto la variable Nombre
tiene el contenido ‘Maria’
Cabe destacar que mientras la
variable W_pointer no tenga
dirección asignada no se puede trabajar con la variable Nombre. Solo a partir del momento en que se asigna a la variable w_pointer una dirección de memoria con
la operación %addr puede trabajarse
con el contenido de la variable Nombre. Esto es así, porque la variables BASED
no tienen memoria asignada hasta que el programa no esté cargado en memoria.
La variable Nombre hace referencia, en su definición a la variable tipo
apuntador W_Pointer que va a
contener la dirección en memoria de la variable que realmente contiene la data.
Muchos dirán: muy interesante el
tema pero, ¿Para qué sirve el uso de
Apuntadores?
Las estructuras de datos y las
variables que han sido declaradas BASED (la variable Nombre del ejemplo) pueden
utilizar almacenamiento dinámico.
Con almacenamiento dinámico, la
cantidad de memoria asignada al programa puede variar. Tradicionalmente cuando
declaramos una matriz o arreglo (Array) con un numero incierto de elementos. Declaramos el arreglo con el máximo número de elementos que pensamos
que pueden generarse a tiempo de ejecución, aun cuando raramente eso pueda
suceder. Se desperdicia memoria y puede degradarse el rendimiento del equipo.
Con el uso de apuntadores la historia cambia.
La función %Alloc asigna un numero de bytes en memoria a un apuntador.
En este ejemplo. Se declara un
arreglo de 1000 posiciones.
Sin embargo se asignan en memoria las primeras 100
d W_Pointer
s *
d w_array s 10 dim(1000) based(w_pointer)
W_pointer = %Alloc(100)
W_pointer = %addr(W_array)
Memoria adicional puede ser asignada utilizando la función:
%Realloc
w_pointer= %realloc(w_pointer:200)
Ahora se puede trabajar con 200 elementos del arreglo.
Parámetros tipo apuntador y apuntadores a procedures son muy
utilizados en las Apis. Este uso y otros múltiples usos de los apuntadores los
estaremos comentando en próximos artículos.
Si te pareció
interesante, reenvíalo a un amigo haciendo click en el sobrecito que está al
final del artículo. El conocimiento es valioso, compártelo.
Autor: Ing. Liliana Suárez
Autor: Ing. Liliana Suárez