Usando variables tipo Puntero en programas CL
Conozca el tipo de variables Puntero incorporadas al lenguaje CL a partir de la V5R4 en AS400.
Ya desde la V5R3 IBM ha estado incorporando nuevas facilidades al lenguaje de control CL/400.
Entre las características incorporadas al lenguaje CL, algunas de ellas ya fueron analizadas en “Nuevas sentencias de control en programación CL”, publicado en Teknodatips anteriormente, sobre sentencias estructuradas de selección e iteración, que impusieron un cambio en la manera de programar en CL.
IBM continuó incorporando facilidades con la liberación de nuevos releases del OS/400 (V5R4, IBM I 6.1 e IBM i 7.1), que siguen enriqueciendo la programación CL.
A los nuevos tipos de datos agregados en V5R3 que permiten declarar variables enteras con signo y sin signo (*INT, *UINT), la V5R4 suma un nuevo tipo para la declaración de variables posibilitando el manejo de variables de tipo Puntero en programas CL, que detallaremos en este artículo con un ejemplo de su uso.
Por esa razón, la comunmente usada sentencia DCL para la declaración de variables en CL cambia desde V5R4 para incorporar la posibilidad de definir nuevos tipos de almacenamiento en las variables y tipos de datos nuevos al declararlas.
Tipos de almacenamiento para variables
La sentencia DCL posee el nuevo parámetro Almacenamiento (palabra clave STG) que puede tomar tres valores posibles: *AUTO, *BASED o *DEFINED, especificando en cada caso el tipo de almacenamiento que se le va a asignar a la variable:
*AUTO: El almacenamiento para esta variable se asigna en el almacenamiento automático. En este caso el valor está asignado directamente en esa variable y no depende de ningún otro parámetro.
*BASED: El almacenamiento para esta variable se basa en la variable de puntero especificada en el parámetro Variable de puntero de base (palabra clave BASPTR).
*DEFINED: El almacenamiento para esta variable lo proporciona la variable CL especificada en el parámetro Definido en variable (palabra clave DEFVAR).
Por lo tanto, los valores almacenados en las variables con tipos de almacenamiento de *BASED y *DEFINED, dependen de valores asignados en otros parámetros.
El tipo de almacenamiento *BASED será usado al declarar una variable de tipo Puntero, mostrado en un ejemplo de la próxima sección.
Tipo de dato Puntero en la declaración de variables
Aunque los Punteros son bastante nuevos en el mundo AS400 para la mayoría de los programadores RPG, en muchos lenguajes, como C, son usados desde hace mucho tiempo, descontando lo aprendido sobre este tipo de datos en los inicios académicos con el conocimiento del lenguaje Pascal.
A diferencia de otros tipos de datos, los punteros no poseen datos, pero sí contienen la dirección de memoria para una porción de datos, y cada puntero tiene 16 bytes.
Si bien la programación en CL es simple y no pareciera poder darle un buen uso a ese tipo de datos, la utilización de punteros puede ofrecer más flexibilidad e interoperabilidad con otros lenguajes y APIs.
En el ejemplo siguiente se utiliza una variable de tipo Puntero en un programa CL:
En el programa anterior se muestra cómo usar una variable de tipo Puntero que rastrea un campo de texto largo que almacena la parte del usuario de la Lista de bibliotecas asignada a un trabajo, y busca una biblioteca determinada.
Donde:
- la sentencia RTVJOBA, recupera en la variable &USERLIBL la parte del usuario de la lista de bibliotecas del job. También el dispositivo en donde está corriendo el trabajo (en la varialbe &JOB) para cuando se envié un mensaje informativo más adelante con el comando SNDBRKMSG.
- la variable &PUNTERO está definida como un tipo de dato "Pointer" (*PTR) y está inicializado con la dirección (palabra clave ADDRESS) de &USERLIBL.
- La variable &LIB esta "basada" en la variable &PUNTERO (parámetro STG especificado en *BASED), que significa que no tiene su propia ubicación en almacenamiento, sino que lo mueve a la ubicación determinada en la variable &PUNTERO. Cuando se ejecuta este programa, la variable &LIB inicialmente superpone (overlays) los primeros 10 caracteres de la variable &USERLIBL.
- Cada vez que el programa "cicla", el puntero se mueve 11 caracteres hacia adelante en &USERLIBL para buscar una biblioteca determinada (en este caso TEKEXE).
- La función %OFS (también %OFFSET, desplazamiento) provista en la programación CL permite que el programa CL ajuste fácilmente la nueva ubicación del puntero (&PUNTERO) solamente agregando o sustrayendo un número de caracteres.
- El programa usa un incremento de 11 caracteres debido a que existe un byte en blanco entre cada nombre de biblioteca en la lista de bibliotecas (almacenadas en &USERLIBL), y como cada biblioteca puede tener un nombre de hasta 10 caracteres, el total es 11.
Para tener en cuenta ....
- Asociado con este soporte de tipo de datos Puntero, existen dos nuevas funciones: %ADDRESS ( %ADDR) y %OFFSET ( %OFS), esta última usada en el programa ejemplo mostrada en el tip. Estas funciones permiten cambiar o testear una dirección almacenada en un puntero o testear el valor de desplazamiento (offset) de un puntero, respectivamente.
- En el ejemplo presentado se utilizó el comando CHGVAR con la función %OFS, pero también puede usarse la %ADDRESS para cambiar el valor de una variable puntero.
- También puede usarse %ADDRESS en la condición de una sentencia IF para chequear el valor almacenado dentro de una variable Puntero.
- Es posible usar la función %OFFSET en la condición de una sentencia IF y se la tratará como valor entero sin signo de 4 bytes.
Copyright 2012 - Teknoda S.A.
IMPORTANTE: “Notas técnicas de AS/400 - IBM i" se envía con frecuencia variable y sin cargo como servicio a nuestros clientes IBM i - AS/400. Contiene notas/tutoriales/artículos técnicos desarrollados en forma totalmente objetiva e independiente. NS iTech - Teknoda es una organización de servicios de tecnología informática y NO comercializa hardware, software ni otros productos. |
Ficha técnica: Notas técnicas – Tips de AS400 - iSeries ”Usando variables tipo Puntero en programas CL"
Tema: Programación CL, declaración de variables en AS400 Descripción: Conozca el tipo de variables Puntero incorporadas al lenguaje CL a partir de la V5R4 en AS400.