Programación General > Visual Basic para principiantes

 Funcion para Saber si Un Arreglo Esta Vacio

<< < (2/4) > >>

m0skit0:
Perdón, señor listo Nebire, UBound da error si el array no tiene ningún elemento. Prueba esto:


--- Código: Visual Basic --- Dim Lista() as IntegerDim a as Integer a = UBound(Lista)  

Nebire:

--- Cita de: "m0skit0" ---Perdón, señor listo Nebire, UBound da error si el array no tiene ningún elemento. Prueba esto:


--- Código: Visual Basic --- Dim Lista() as IntegerDim a as Integer a = UBound(Lista)  
--- Fin de la cita ---

Gracias por lo de 'listo', no hacía falta, y perdonado estás... ignorar cosas es lo más normal, pero no deberías precipitarte sin investigar un poco al menos, no te parece...?. Crees que lógico hacer una afirmación sin conocer en profundidad lo que se hace y dice ?.

Prueba el siguiente código comentado... y fíjate que las 3 primmeras líneas de tu código son casi idénticas a las mías, la diferencia está en lo que ignoras


--- Código: Visual Basic --- ' a nivel de módulo, en el formulario Dim Lista    ' de entrada se define como una variant, no un array...Dim a as Integer  Private Sub Form_Click()  'for k= 0 to 15      If Not IsArray(Lista) Then        Lista = Array()     End If      a = UBound(Lista)   ' al llegar aquí esto nunca da error, incluso cuando Lista() no ha sido inicializado todavía      If UBound(Lista) = -1 Then        ' aquí se entrará cuando el array no haya sido inicializado, incluso cuando es nothing, para probar esto activar el bucle for o pulsar más de 10 veces en el formulario...        msgbox "El array no ha sidfo inicializado, pero no da error...."        ReDim Lista(0 To 0)    ' por ejemplo se aprovecha para inicializar el array a 1 elemento... o lo que se quiera    Else        ReDim Preserve Lista(UBound(Lista) + 1)  ' se redimensiona en un elemento más que es lo que quería el que abrió el hilo        End If    msgbox "La matriz LISTA tiene " & a  & " elementos.... palabra de ley."        'eliminar la matriz      if ubound(lista)=10 then          set Lista=nothing      end if   ' nextend sub   
Ahora pruébalo paso a paso y me comentas.... para la próxima si no encuentras la solución, simplemente dí 'No lo veo', queda más propio con la verdad decir no lo veo que decir es falso, cuando es verdadero...

m0skit0:
Primero, disculpa lo de "listo". No iba con mala intención, aunque lo de "tontería" por tu parte supongo que tampoco.  <_<

Segundo, en este tema he investigado más de lo que te imaginas puesto que es un asunto del trabajo.

Declarar variables variant es de mala programacion puesto que son lentas y ocupan memoria innecesariamente. Yo prefiero mi solución porque es más rápida a la hora de ejecutar y ocupa menos memoria. Como regla general, JAMÁS deben usar variables de tipo Variant.

Nebire:

--- Cita de: "m0skit0" ---Declarar variables variant es de mala programacion puesto que son lentas y ocupan memoria innecesariamente. Yo prefiero mi solución porque es más rápida a la hora de ejecutar y ocupa menos memoria. Como regla general, JAMÁS deben usar variables de tipo Variant.
--- Fin de la cita ---
Efectivamente como regla general, no para todo caso habido o por haber... esta es una digna excepción.
En cuanto a que tu solución es más rápida y ocupa menos no estoy de acuerdo... tu fabricas un registro por el sólo hecho de no tener claro como mediar con un array no inicializado. si montas la solución que te doy en una función del modo que más te convenga (obtener true, false para ver si está declarado o devolviendo un entero indicando su límite a sabiendas de que -1 indica no inicializado) creo que es más rápido y agota menos memoria por la sencilla razón de que si finalmente tu programa hubiera de tener pongamos 300 arrays tu solución crearía 300 variables extras para reconocer su tamaño, aparte 300 descriptores del registro que también ocupa lo suyo. Mi solución no tiene ese problema la función puede recibir cualquier array si lo pones como parámetro, es por tanto una función universal sean cuantas sean los arrays que tengas. Además puedes usar la misma función con parámetros adicionales opcionales para redimensionarlo...

Además un problema que suele tener la gente es que una vez que termina de usar un array no lo destruye, porque luego le 'cuesta' volver a construirlo más tarde si lo necesita, mi solución permite además dejar de temer ese caso, con lo que cuando se precise puede eliminarse el array sin contemplaciones y sin tener que hacer un código o vairables extra de comprobación y/io mantenimiento. También he visto gente que usa un registro y en él un buleano para señalar cuando destruye el array y no debe utilizarlo. Lo cual es más de lo mismo y que mi solución hace innecesario.

Piénsalo un poco, dale vueltas y exprimenta...

post data: adjunto Nota de Mocosoft

--- Código: Text ---  Nota   Lasmatrices de cualquier tipo de datos requieren 20 bytes de memoria más cuatro bytes para cada dimensión de matriz, más el número de bytes que ocupan los propios datos. Puede calcular la memoria que ocupan los datos multiplicando el número de elementos de datos por el tamaño de cada elemento. Por ejemplo, los datos de una matriz unidimensional que consten de cuatro elementos de datos tipo Integer de dos bytes cada uno, ocupan ocho bytes. Los ocho bytes que requieren los datos más los 24 bytes necesarios para la matriz suman un requisito total de memoria de 32 bytes para dicha matriz.  Un tipo Variant que contiene una matiz requiere 12 bytes más que la matriz por sí sola.  Resumiendo si tienes 300 arrays en un programa y usas una función como indico sólo usarás 12 bytes más usando los 300 arrays usando un registro con un integer aparte del array usarás 2bytes por cada array dicho sea 600 bytes + el tamaño de los 300 descriptores de cada registro, el tiempo empleado en acceder a un registro siempre requiere calcular la dirección del registro + la de la variable, por lo que usar un registro siempre tendrá un tiempo de acceso mayor para calcular la dirección efectiva, y esto se aplica no sólo a la variable que lleva el contador del tamaño del array sino también para el propio array cada vez que se usa.

m0skit0:
Bueno, aquí cada uno tiene su forma de resolver los problemas. También veo que no te atienes a razones, puesto que te repito que una variable de tipo Variant (y no hablemos de un array de Variant) es la más lenta (puesto que hay que consultar el campo VarType cada vez que se opera con ella y convertir el dato adecuadamente, vamos que es una llamada a una función cada vez que la usas) y la que más memoria ocupa (¡16! bytes siempre) (más que un String de VB que ya es decir), por lo tanto tu código va a ser más lento que mi ejemplo y va a ocupar más memoria.

Aparte, con la declaración de un registro uno se ahorra la llamada a UBound() que añade más lentitud aún. Y no hablemos de Array(). El programa en el que estoy trabajando ahora tiene por lo menos 50 arrays diferentes con más de 30000 (!) elementos cada uno. He probado varias formas (incluídos los Variants) para obtener el mejor rendimiento, y la que tú propones te puedo asegurar, sin ofender, que es la más lenta de todas. Pero en lo que estoy de acuerdo es que la tuya en es la forma más legible y comprensible, aunque eso a veces no sea suficiente.

Aqui te dejo un enlace al tipo Variant y las excepciones para usarlo. Un saludo.

En cuanto a tu P.D., te comento:

1. Uso el tamaño del array + el tamaño de la variable de control, generalmente Integer, es decir 2 bytes, por lo tanto, me ahorro 10 bytes por cada array que si usara Variant (sin contar los bytes extra del tipo Variant, claro)

2. Para acceder a los registros no se suma por software, se usa direccionamiento indexado, la suma es interna por CPU por tanto más rapida. De todas formas puedes prescindir del registro y crear una varible independiente, aunque es más cutre y la diferencia no merece la pena.

3. Variant es una muy mala idea de Microsoft, cualquier programador con experiencia te lo puede confirmar. ¿Quién usa VARIANT en C++? Nadie, por algo será.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa