lunes, 30 de septiembre de 2024

Funciones. Matrices.

Límite inferior y superior de una matriz

Posiblemente conocemos los valores numéricos que marcan las posiciones inicial y final de una matriz, bien por establecer su dimensión (número de elementos) en la declaración de la matriz, bien por otros motivos, pero no siempre es así... ni necesitamos que así sea.


Bien por desconocimiento, bien por asegurarnos de no cometer un error, dos funciones Built-In disponibles para trabajar con matrices nos resuelven el problema de conocer los valores de posición inicial y final de una matriz. Estas dos funciones son LBound() y UBound().

Ambas funciones reciben como único parámetro la matriz sobre la que trabajamos y devuelven un valor numérico (Integer) que identifica la posición inicial (LBound()) y final de la matriz (UBound()).

Cierto que la posición inicial es invariablemente la posición 0, ya que esa es la posición con la que se inician todas las matrices en OOo Basic (1) salvo que indiquemos los contrario, con lo que LBound() nos ofrece poca información novedosa, pero UBound() sí resulta de gran interés, dado que no siempre sabemos cuanto elementos tiene una matriz y, en consecuencia, no sabemos cual es el valor de posición del último. Ya a la inversa: gracias a UBound() podemos saber cuántos elementos componen una matriz, ya que es suficiente con sumar +1 al valor que nos devuelve para saberlo. Un ejemplo sencillo:

Sub Longmatriz

Dim mDiaSem() As String
Dim iPosIni As Integer, iPosFin As Integer, iNumElem As Integer

mDiaSem() = Array("lunes", "martes", "miércoles", "jueves", "viernes", "sábado","domingo")

iPosIni = LBound(mDiaSem())
iPosFin = UBound(mDiaSem())
iNumElem = iPosFin + 1

MsgBox "Posición del primer elemento de la matriz: " & iPosIni
MsgBox "Posición del último elemento de la matriz: " & iPosFin
MsgBox "Número de elementos de la matriz: " & iNumElem

End Sub

GraciasLBound(mDiaSem()) confirmamos algo que sabemos por definición: que el valor de posición del primer elemento de la matriz mDiaSem()  es 0 y gracias a UBound(mDiaSem()) que el valor de la posición final es 6. Es suficiente con realizar una sencilla operación (iNumElem = iPosFin + 1) para conocer el número de elementos que la componen (7).

El uso de ambas funciones tiene especial interés cuando necesitamos recorrer el contenido de una matriz mediante un bucle. En este caso (también para asegurarnos y evitar errores), puede ser más sencillo asignar los valores devueltos por ambas funciones como iterable del ciclo. Por ejemplo:

For i = LBound(mDiaSem()) To UBound(mDiaSem())
MsgBox ("Dia " & i+1 & " de la semana: " & mDiaSem(i))
Next

Ambas funciones sirven respectivamente para marcar el valor de inicio y de finalización del bucle For (For i = LBound(mDiaSem()) To UBound(mDiaSem())) en función de los valores que devuelven respecto a la matriz mDiaSem(), con lo que no cabe posibilidad de error (2).

NOTAS

(1) Salvo que indiquemos lo contrario mediante la instrucción Option Base declarada al inicio del módulo y fuera del cuerpo de los script: Option base 1 hace que las matrices inicien en la posición 1. Aunque es una posibilidad, en la práctica no es frecuente hacer uso de ella.
(2) Este uso de ambas funciones es muy frecuente en el trabajo con bucles sobre matrices, así que es común encontrarlo en el código de los script y funciones. La principal razón de ello es que impide cometer errores de infradimensionar o sobredimensionar el ciclo respecto al número de elementos de la matriz.

No hay comentarios:

Publicar un comentario

Comenta esta entrada