jueves, 19 de septiembre de 2024

Procedimientos. Datos.

Intercambio de datos entre matrices.

Con independencia del modo en que hayamos conseguido ingresado los datos en una matriz, hay veces que nos interesa utilizar estos datos para pasárselos a otra. En esta entrada vamos a analizar diferentes situaciones, posibilidades y procedimientos de uso de una matriz como fuente de datos de otra.


Cierto que podemos utilizar un listado Calc como fuente de datos, y que la presentación de la lista en columna o fila es una forma visual de mostrar el contenido de una una matriz simple, por lo que la primera forma de pasar datos de una matriz-fuente a otra (matriz-recurso, podríamos decir) es utilizar los procedimientos vistos en [esta entrada anterior], pero precisamente lo que nos interesa tratar en esta entrada es el trabajo con matrices definidas mediante código, por lo que no se contempla el acceso a fuentes de datos "externas", sino el traslado de datos entre matrices en sentido estricto.

En ese sentido, la forma y circunstancia más simple se da cuando queremos duplicar, por algún motivo los datos originales de una matriz en una segunda; la primera sirve de fuente original de datos (matriz-fuente) y la segunda (o las segundas) como matrices de trabajo (matriz-recurso), sobre la(s) que ejecutaremos diferentes acciones, sean éstas las que sean (1).

En estas circunstancias, OOo Basic nos permite utilizar una forma muy simple y eficiente de paso de datos: es suficiente con asignar la matriz-fuente a la matriz-recurso, del mismo modo que podemos asignar una variable a otra:
  • vSegunda = vPrimera
  • mRecurso() = mFuente() 
En ambos casos, siempre que la variable y la matriz original contenga datos (2), estos pasarán a la variable o matriz a que se asignan. Lo interesante es que en el caso de las matrices este paso se hace directamente, sin que sea necesario hacerlo dato a dato mediante un bucle, que sería la forma esperada (3).

No obstante, este método sólo es útil cuando queremos trasladar a la matriz-recurso todos los datos (y en el mismo orden) que contiene la matriz-fuente, pero no sirve si sólo queremos trasladar una parte de ellos, por ejemplo, los situados en las posiciones 3-5 (4). En ese caso deberemos utilizar un bucle For realizando previamente un redimensionado de la matriz receptora (5):

End Sub

Sub Matices2

Dim mFuente () As Integer, mRecurso() As Integer, i As Integer

mFuente = Array(1,2,4,8,16,32,64,128)

ReDim mRecurso(2)
For i = 3 To 5
mRecurso(i-3) = mFuente(i)
Next

MsgBox "Visualizar datos de mFuente()"
For i = LBound(mFuente()) To UBound(mFuente())
MsgBox mFuente(i)
Next

MsgBox "Visualizar datos de mRecurso()"
For i = 0 To UBound(mRecurso())
MsgBox mRecurso(i)
Next

End Sub

El script anterior es un ejemplo de cómo podemos pasar a la matriz-recurso (mRecurso()) un subconjunto de los datos de la matriz-fuente (mFuente()). Observa que ninguna de las dos están dimensionadas al ser declaradas, pero mientras que mFuente() queda dimensionado mediante Array() (mFuente = Array(1,2,4,8,16,32,64,128)), mRecurso() debe debe serlo explícitamente mediante la instrucción ReDim (ReDim mRecurso(2)). El ciclo For que sigue nos permite definir qué elementos de la primera pasaremos a la segunda; para ello es fundamental el valor de inicio y de fin que demos al contador i (For i = 3 To 5, en este caso) (6).

NOTAS

(1) Un motivo puede ser que la primera (matriz-fuente) contenga los datos de partida que nos interese conservar sin modificaciones para poder realizar diferentes operaciones con ellos, siendo las matrices-recurso los soportes sobre los que realizar dichas operaciones. Una de ellas (matrices Integer), producir un incremento o un decremento de valores, otra con ellas (matrices-String) la selección de un subconjunto de datos y/o la eliminación del resto. En ambos casos, si trabajáramos con la matriz original perderíamos los datos iniciales, que son precisamente los que nos interesar conservar para realizar diferentes operaciones.
(2) Ya he explicado en varias ocasiones que esta es una forma de hablar para simplificar el discurso, pero que en realidad tanto las variables como las matrices no son otra cosa que etiquetas que facilitan al script el acceso a direcciones de memoria RAM que contienen los datos que son referenciados por los nombres o identificadores de las variables y de las matrices.
(3) No obstante, las similitudes de manejo variables-matrices no van mucho más allá. Por ejemplo, en el caso de un intercambio de datos entre variables, es posible ejecutar directamente una operación sobre la variable-origen para que el valor de la variable-recurso incorpore el efecto de esa operación directamente (vSegunda = vPrimera + 2), cosa que no se puede hacer en el caso de las matrices (mRecurso() = mFuente()+2): en este caso la operación genera error, así que nos exige realizar el proceso en dos pasos, el primero la asignación y el segundo desarrollado mediante un bucle, por ejemplo, sobre los elementos de mRecurso().
(4) Recuerda que las matrices inician en la posición 0, por lo que la posición 3 se corresponde con el cuarto elemento de la matriz.
(5) Aunque la tendencia es declarar las matrices con un valor numérico (ver nota 4), lo cierto es que podemos declararlas sin definir su tamaño. La matriz-fuente tendrá el tamaño que definamos mediante Array(). Para otros modos de trabajar con la matriz, deberemos redimensionarla previamente a la introducción de datos mediante la instrucción ReDim.
(6) Obsérvese el valor que se le da al índice de mRecurso() (mRecurso(i-3)) para el correcto posicionamiento de los datos en función del tamaño de la matriz. Los dos ciclos que siguen sirven para comprobar el contenido de ambas matrices, por lo que no son relevantes en esta explicación.

No hay comentarios:

Publicar un comentario

Comenta esta entrada