Programación General > Visual Basic para principiantes

 Funcion para Saber si Un Arreglo Esta Vacio

<< < (4/4)

Jimbenit:
B) Bienvenido amigo...

Nebire:

--- Cita de: "Astronald" ---No se....., no encontre en internet entonces hice esta funcion
 las variables Variat  para crear arreglos en esta utilizo una pero solo por referencia para permitir todo tipo de matrices
--- Fin de la cita ---

Es como decir que no te gustan las ruedas pero que las utilizas sólo para girar... Para qué otra cosa puede utilizarse algo sino para aquello para lo que fue diseñado ????, la función de un Variant es precisamente esa, la de poder utilizarse con limitaciones que tiene otros tipos de datos, para poder hacerlo así ella misma tiene que ser un tipo de datos. Usar una vaiant con otros propósitos es como usar una rueda cuadrada para hacer una bicicleta. Cada cosa tiene sus propios datos más aptos para lo que se pretende usar, por ejemplo para definir colores usamos un long o una matriz de bytes que es equivalente a un long, nadie va a usar una cadena de strings, tipológicamente un carácter puede alojar un byte pero el tratamiento de cadenas sólo encuentra su sentido en el lenguaje humano, no en las matemáticas, las definiciones de colores y sus operaciones y aplicaciones son puramente matemáticas, las aplicaciones y operaciones de strings son relativamente lentas comparadas con operaciones maemáticas, por tanto usar un tipode datos fuera del espacio para lo que tiene su diseño, no es que sea un error es que simplemente habla del escaso conocimiento que un usuario pueda tener sobre un tipo de datos.

Un ejemplo de la vida misma...
Quien mejor que un médico para atender en un hospital, que es el 'tipo de datos' requerido para el caso, y que mejor que el tipo de datos 'cocinero' para la clase restaurante y ni un médico ni un cocinero usaríamos como guardaespaldas de un mafioso porque cada uno tiene su área de aplicación. Eso no quita que haya un 'tipo de datos' que siendo médico no es muy buen médico y que siendo cocinero no es muy buen cocinero y que siendo guardaespaldas tampoco sea un buen guardaespaldas, ahora bien cuando usaríamos a este tipo?... queda claro que no en cualquier situación pero si que es patente su utilidad preferible a cada uno de los otros en determinadas situaciones, por ejemplo en una zona de guerra, cada destacamento de pocos hombres no pueda contar con umn médico o un cocinero, posiblemente todos sean expertos guerrilleros entonces el tipo de datos que tanto es coninero  como médico como guerrillero aunque no rinda en ninguna de las áreas como el tipo de datos dedicado tiene más utilidad que  carecer de ello.
 
Lo mismo sucede en programación, los tipos de datos tienen su especialización y el variant fue concebido para usarse en las zonas límites entre tipos de datos como por ejemplo muchas llamadas a las API quien lo usa para sustituir a un tipo de datos genérico simplemente no es consciente de que es un Variant, ni conoce la utilidad de los tipos de datos.

La conversación trataba sobre como ha resuelto cada uno ese tema en cuestión, los métodos que yo expuse son los métodos que yo usaba al principio, cuando al caso, era muy frecuente el uso para dicha función, si sólo se iba a usar pocas veces (tal vez 2 o 3) en un programa uno lo suele resolver con el 'on error...' como ya lo expuso nuestro amigo amigo cpMario casi al inicio del post. Para un uso intensivo de dicha función yo utilizo realmente un API que hay para esta cuestión.

Un Variant tiene su sitio en la programación, quizás el errror de MS fuera no explicarse bien. Ellos lo definieron como un tipo de datos 'especial' pero que puede usarse como un tipo de datos 'normal', y con ello lo que querían decir  era que no había que hacer cosas 'raras' para usarlo sino usarlo del mismo modo que el resto de tipos (pero no para hacer lo mismo que el resto de tipos para eso se definió como especial). Cuando declaramos un objeto y o asignamos un dato al mismo el procedimiento es distinto de los tipos de datos genéricos es sólo esto lo que se quería entender como 'normal', su declaración y asignaciones, es decir su tratamiento pero no su utilidad. Los que no habíais nacido o erais muy pequeños e ignorabais siquiera lo que era la programación cuando apareció Visual Basic es normal que no conozcais detalles que se van perdiendo y olvidando con el tiempo y especialmente cuando desde la enseñanza siempre le han dedicado un 'mal de ojo' al Basic en general.

Astronald:
Sin querer entrar en conflictos te muestro este apartado que esta en la MSDN si quieren comprobarlo por favor busquen optimizar codigo.

Y lo otro es que creo mas costoso que los desarrollador nos pongamos a discutir...

Optimizar Codigo (Fuene MSDN)

A menos que desarrolle tareas como la generación de fractales, sus aplicaciones raramente se verán limitadas por la velocidad de ejecución del código. Normalmente son otros factores, como la velocidad de vídeo, los retrasos de la red o la actividad del disco, los que limitan las aplicaciones. Por ejemplo, cuando un formulario tarda en cargarse, puede deberse al número de controles y gráficos del formulario más que a la lentitud del código del evento Form_Load. Sin embargo, puede encontrar puntos del programa en los que la velocidad del código es el factor principal, especialmente en las rutinas a las que se llama con mucha frecuencia. Cuando éste sea el caso, puede usar varias técnicas para incrementar la velocidad real de las aplicaciones:

Evitar el uso de variables Variant.
Usar variables Long Integer y aritmética de números enteros.
Pasar a variables las propiedades utilizadas con mayor frecuencia.
Usar variables de nivel de módulo en lugar de variables estáticas.
Reemplazar las llamadas a procedimientos por código en línea.
Usar constantes siempre que sea posible.
Pasar argumentos con ByVal en lugar de ByRef.
Usar argumentos opcionales con tipo.
Usar colecciones.
Incluso si no va a optimizar la velocidad del código, conviene tener presentes estas técnicas y los principios en los que se basan. Si adquiere el hábito de elegir algoritmos más eficientes al escribir código, obtendrá una ventaja adicional a la velocidad de la aplicación.

Evitar el uso de variables Variant
El tipo de datos predeterminado de Visual Basic es Variant. Es cómodo para los programadores principiantes y en aplicaciones en las que la velocidad de procesamiento no es importante. Sin embargo, si piensa optimizar la velocidad real de su aplicación, debe evitar el uso de variables Variant. Como Visual Basic convierte las variables Variant al tipo de datos apropiado en tiempo de ejecución, las operaciones con otros tipos de datos simples eliminan este paso adicional y son más rápidas que sus equivalentes Variant.

Un buen sistema para no usar variables Variant es usar la instrucción Option Explicit, que le obliga a declarar todas las variables. Para usar Option Explicit, active la casilla de verificación Requerir declaración de variables en la ficha Editor del cuadro de diálogo Opciones, disponible en el menú Herramientas.

Tenga cuidado cuando declara múltiples variables: si no utiliza la cláusula As tipo, se considerarán variables Variant. Por ejemplo, en la siguiente declaración, X e Y son Variant:

Dim X, Y, Z As Long

Escritas de esta manera, las tres variables son de tipo Long:

Dim X As Long, Y As Long, Z As Long

Para obtener más información   Para aprender más acerca de los tipos de datos de Visual Basic, vea "Tipos de datos" en "Fundamentos de programación".

Astronald:
agregue la funcion a el modulo donde se hacia la prueba de tiempo de duración y es la opcion mas lenta..

Funcion 1: 971
Funcion 2: 62
Funcion 3: 13617

que tristeza entonces hice esta otra


--- Código: Text --- Private Sub Funcion3()    Dim Lista() As Integer    Dim a As Integer    Dim i As Long    For i = 0 To 100000        AgregarElemento Lista        Lista(i) = 1    Next iEnd Sub Private Sub AgregarElemento(ByRef Arreglo As Variant)    On Error GoTo SinIniciar    ReDim Preserve Arreglo(UBound(Arreglo) + 1)Exit SubSinIniciar:    ReDim Arreglo(0)End Sub  
y o sorpresa ....

Funcion 1: 959
Funcion 2: 59
Funcion 3: 76

Bueno no es la mas rapida pero...
 * No tenemos que actualizar la variable NElementos, lei y el hecho de utilizar un procedimiento hace que se se mas costoso el codigo, pero sino lo utilizamos se perderia la modularidad y entonces tendriamos que repetir la misma linea en todos los segmentos donde lo utilizamos.

Otra cosa es que la funcion Ubound cuesta, y en la funcion 2 no se utiliza...
y bueno tambien falta ver que necesitamos hacer consultar el arreglo, o agregar un elemento.

Nebire:
A lo largo de la conversación ya se ha debatido acerca de los Variant, no resulta necesario darle más vueltas. Si has leído el post entero verás que no hace falta añadir nada más. Los variant deben usarse para casos especiales donde su uso tenga significado, si no es así se está desaprovechando capacidades de proceso.

En cuanto a los tiempos de cálculo, te señalo nuevamente que lo más rápido es usar la API si se va a hacer un uso intensivo preguntando si un array está declarado, si no se va a hacer un uso intensivo prácticamente da igual el método que se use, ya que sólo es significativo cuando se va a hacer varios millones de consultas para 4 ó 5 consultas en un minuto -no  i m p o r t a- . si has leído el post verás que 300.000 ejecuciones de un bucle en el peor caso de los 3 que presenté más arriba tardaba poco más de 1sg. por tanto no merece la pena ni discutirlo.

De todos modos si quieres el más rápido te doy un código para que lo pruebes... y dejemos esta conversación ya, no hay nada más que añadir, a lo sumo si a alguien le cuesta entender algo, y end icho caso que pregunte...

Este código será el doble o el triple (al menos) de rápido que cualquier otro que hayas usado en VB

Colcar un boton y un textbox en el formulario.

--- Código: Visual Basic --- Private Declare Sub ArrayDeclarado Lib "msvbvm60.dll" Alias "GetMem4" (elArray() As Any, devol As Long) Private Sub Command1_Click()        dim n as long, t as single, tamaño as long        dim apiArray() as integer         t = Timer        For j = 0 To 10           for k= 0 to 30000                Call ArrayDeclarado(apiArray, n)                If n > 0 Then                    ReDim Preserve apiArray(0 To UBound(apiArray))                    apiArray(UBound(apiArray)) = k                Else                    ReDim apiArray(0 To 0)                    apiArray(0) = 0                End If            Next            Erase apiArray        Next j       Text1.Text = Timer - t       Tamaño = 300000 * Len(apiArray(0))        msgbox "Tardó: " & Text1.Text  & "sg.  y el tamaño de la matriz era: " & Tamaño end sub' NOTA: el código se ha embutido de las mismas características que se dieron algunos mensajes más arriba para compararlo en idénticas condiciones.  p. d.: fíjate en la declaración de la API como se declara el parámetro 'elArray' como as 'any' (cualquier tipo) precisamente para relajar la comprobación de tipos... si no fuera así, esa función requeriría una copia específica por cada tipo de datos y sucedería igual con muchísimas funciones...

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa