Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.

Friday, July 26, 2013

¿Para qué sirven las variables tipo apuntador (pointer)?




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