Histórico da Página
...
Sem Formato |
---|
PRIVATE aTabela[5,8] // Crea la matriz aTabela |
Cuando se crea un array sin los valores definidos, cada uno de sus elementos tiene el valor NIL atribuido. Este valor persiste hasta que los elementos se inicien con otros valores. El siguiente ejemplo, demuestra la atribución de diversos datos en algunos elementos del array aTabela.
Sem Formato |
---|
aTabela[1,1] := 100 // Equivale à aTabela[1][1] := 100 aTabela[2][3] := "AdvPL" aTabela[5,4] := DATE() aTabela[2][2] := .T. aTabela[3,3] := aTabela[1,1] * 2 aTabela[4,4] := SQRT(aTabela[1,1]) |
Los índices que identifican los elementos de un array son siempre números enteros y comienzan con el número 1. Los índices atribuidos a los elementos de un array deber ser compatibles con sus dimensiones y con el número de elementos de cada dimensión. Si esto no ocurre, se generará un error durante la ejecución del programa. Por ejemplo:
Sem Formato |
---|
aTabela[6,1] := 1 |
La atribución anterior causará un error, pues el array aTabela posee sólo 5 líneas.
El AdvPL también permite crear e iniciar un array con base en la estructura de una tabla de datos y de las informaciones de una carpeta de archivos contenidos en el servidor. Los respectivos comandos (DBSTRUCT y DIRECTORY) están descritos en el tópico Funciones.
La función AFILL() está especialmente destinada a iniciar los elementos de los array de una sola dimensión con un determinado dato. Por ejemplo:
Sem Formato |
---|
LOCAL aVetor[20] AFILL(aVetor, SPACE(10), 1, 10) // Inicia los 10 primeros elementos del array unidimensional aVetor con diez espacios en blanco. AFILL(aVetor, 0, 11, 20) // Inicia los 10 últimos elementos del array unidimensional aVetor con el valor numérico cero. |
Los elementos de un array se pueden iniciar con el resultado de cualquier expresión válida del AdvPL y con cualquier tipo de dato, incluso bloques de código y referencias a otros array. Una vez iniciados, los elementos de un array se pueden utilizar como si fueran variables.
Como en el AdvPL se puede atribuir una referencia a un array para un elemento de otro array, la estructura del array que ya existe se puede modificar dinámicamente durante la ejecución del programa. Por ejemplo:
Sem Formato |
---|
PRIVATE aTabela[5,5] // El array se ha creado con 5 líneas y 5 columnas. aTabela[1, 1] := { 10, 20, 30, 50, 80 } // La estructura del array se modificó en el momento de la ejecución. |
Si se muestra el contenido del elemento aTabela[1, 1, 5], aparecerá el contenido 80
Mientras tanto, si se intenta mostrar el contenido de los siguientes elementos, ocurrirá un error, pues no existen estos elementos en la estructura del array:
Sem Formato |
---|
aTabela[1, 2, 1] aTabela[2, 1, 1] |
Analizando este ejemplo, las tres dimensiones tienen validez sólo para el elemento aTabela[1, 1], ya que el mismo pasó a contener una referencia a otro array con una dimensión. Este poderoso recurso del AdvPL, permite que se aprovechen recursos increíbles de programación. Así mismo, como la estructura de un array puede cambiar dinámicamente, se debe tomar cuidado para utilizarla, puesto que existe el riesgo de perder totalmente el control de una aplicación, volviéndola confusa y susceptible a errores.
Utilización de los array como parámetros de rutinas
Los array se pueden pasar como argumentos para funciones. Cuando el paso se realiza por medio de la sintaxis de las funciones, los array son, por definición, pasados por valor. Esto significa que una copia referente al array se pasa al parámetro que será recibido por la función
que se llamó. En esta situación, cualquier modificación realizada en los elementos del array por la función que se llamó, se reflejará automáticamente en el array original. Por ejemplo:
Sem Formato |
---|
LOCAL aLista[20] // Se crea el array y todos los elementos reciben el valor NIL AFILL(aLista, 1, 1, 10) // Atribuye el valor 1 a los 10 primeros elementos AFILL(aLista, 2, 11, 20)// Atribuye el valor 2 a los 10 últimos elementos. MSGALERT(aLista[1]) // Muestra el valor 1 MSGALERT(aLista[11]) // Muestra el valor 2 Dobro(aLista) // Ejecuta la función Dobro() MSGALERT(aLista[1]) // Muestra el valor 2 MSGALERT(aLista[11]) // Muestra el valor 4 // Función Dobro() FUNCTION Dobro(aMat) LOCAL nElem := 0 FOR nElem := 1 TO LEN(aMat) aMat[nElem] := aMat[nElem] * 2 NEXT nElem RETURN NIL |
En este ejemplo, cuando se ejecuta la función Dobro(), se pasa al parámetro aMat una copia de referencia del array aLista La función Dobro() multiplica todos los elementos del array aLista por dos. Cuando se finaliza la función Dobro(), se descarta la referencia aMat, pero se mantienen las modificaciones efectuadas en los valores de los elementos del array aLista.
...
Un array también se puede suministrar como resultado de funciones. Este recurso permite que una función, que por lo general provee un único valor como resultado, suministre múltiples valores por medio de los elementos de un array y por el comando RETURN. Por ejemplo:
Sem Formato |
---|
aTabela := CriaTb(5, 10, SPACE(10)) |
...
...
// Función CriaTB, que alimenta al array de acuerdo con el número de líneas y columnas, así como el contenido. |
...
FUNCTION CriaTb(nLinhas, nColunas, cConteudo) |
...
LOCAL aTab[nLinhas, nColunas] |
...
FOR nElem1 := 1 TO nLinhas |
...
FOR nElem2 := 1 TO nColunas |
...
aTab[nElem1, nElem2] := cConteudo |
...
NEXT nElem2 |
...
NEXT nElem1 |
...
RETURN aTab |
Funciones especiales para manejar Arrays
El operador doble igual ( == ) se utiliza para comparar dos arrays, verificando si son equivalentes. Es decir, si tienen el mismo contenido. Por ejemplo:
Sem Formato |
---|
LOCAL aTabela1 := { 1, 2, 3 } |
...
LOCAL aLista := { 1, 2, 3 } |
...
LOCAL aTabela2 := |
...
...
aTabela1 IF aTabela1 == |
...
aTabela2 // Resultado: .T. (verdadero) |
...
MSGALERT(“El contenido de los arrays aTabela1 y aTabela2 son iguales”) |
...
ENDIF
...
ENDIF IF aTabela1 == |
...
aLista // Resultado: .F. (falso) |
...
MSGALERT(“El contenido de los arrays aTabela1 y aLista son diferentes”) ENDIF |
ENDIF
El AdvPL tiene dos funciones para cambiar las dimensiones de un array existente:
...