Curso Básico de Programación
en Visual Basic

Tercera Entrega: 14/Jun/97.
por Guillermo "guille" Som

 

Bien, después de un mes y pico, seguimos con la tercera entrega del curso "super-básico" de programación con Visual Basic. Si quieres ver las entregas anteriores, pulsa en los siguientes links: este para la Primera y este otro para la Segunda.

Esta entrega la voy empezar con recomendaciones e instrucciones del buen hacer en Visual Basic, espero que sigas algunas, preferiblemente todas, estas normas.

Ya has visto cómo maneja el Visual Basic las variables, si a esta "libertad" (aunque más bien es libertinaje), le añadimos que no nos obliga a nada, es decir el VB nos está diciendo: "puedes usar las variables para lo que quieras, cómo quieras (o casi) y cuando quieras"
Y esto en principio podría parecer una buena cosa, pero realmente es un mal hábito, que muchos de los que venís del BASIC, ya tenéis formado y creo que ahora sería un buen momento para empezar a cambiar.

Lo primero que debes hacer es ir al menú Herramientas (Tools) y en Opciones (Options) marca la casilla que indica "Requerir declaración de variables" (Require Variable Declaration), esto añadirá a cada nuevo módulo (FRM, BAS o CLS) la siguiente instrucción: Option Explicit, de esta forma tendrás la obligación de declarar cada una de las variables que uses en el programa. Y tu preguntarás: ¿Para que obligar a que se declaren las variables? La respuesta es bien sencilla: para que las declares... (algunas veces me asombro de la lógica tan aplastante de mis comentarios)
Bromas aparte, es recomendable que declares las variables que vayas a usar y te diría más: no sólo es bueno declarar las variables, sino que mejor aún es declararlas del tipo adecuado.
Ya vimos que hay diferentes tipos de variables, no sólo de tipos genéricos como podrían ser para almacenar caracteres y números, sino que dentro de las numéricas hay varios tipos, y cada uno de ellos tiene una razón de ser.
En mis tiempos del BASIC normalito, es decir del MS-DOS, no existía esta obligación de declarar "forzosamente" las variables y cuando estabas escribiendo un programa (
proyecto que lo llaman ahora), grande, acababas "inevitablemente" usando más variables de la cuenta porque ya no recordabas si la variable "i" o "j" estaba siendo usada a nivel global o no... (yo es que con el despiste que gasto, me veía creando las variables "ii", "j2", etc., para no "meter la pata") y esto no era lo peor, al fin y al cabo lo único que ocurría era que estaba "desperdiciando" memoria, por no tener un control de las variables que estaba usando; lo malo era que se podían escribir erróneamente los nombres de las variables de forma que al final, el programa no funcionaba bien porque al escribir un nombre de variable, habíamos cambiado el nombre... era frustrante y algunas veces te volvías loco buscando el fallo...
La ventaja de usar el Option Explicit, es que si escribes mal una variable, el VB te avisa... bueno, algunas veces te avisa, sobre todo cuando se encuentra con la variable "mal escrita".

Aquí viene la segunda recomendación del día: cuando ejecutes un programa, hazlo con Control+F5, de esta forma se hace una compilación completa y "más o menos" exhaustiva del código, avisándote cuando hay algo que no "cuadra", con el VB3 no había problemas, ya que siempre se hacía la compilación completa, pero desde el VB4 se puede pulsar F5 y hasta que no llega al procedimiento actual, no comprueba si todo lo que hay en él está correcto.
Así que para "curarte en salud" procura hacer la compilación completa

La tercera recomendación no es obligatoria, siempre que sigas la que voy a dar después, esta es una norma que también he usado desde mis tiempos de MS-DOS (aunque reconozco que últimamente no la pongo en práctica, ya que hago lo que después comentaré en la cuarta recomendación).
En todos los módulos, antes sólo eran BAS, ponía al principio la siguiente línea:
DEFINT A-Z
de esta forma le indicaba al BASIC que mi intención era usar todas las variables del tipo Integer (entero), (realmente después usaba del tipo que me daba la gana, pero mi primera intención era no complicarme la vida con la mayoría de las variables), cuando quería usar una variable diferente de Integer, le indicaba "explícitamente" de que tipo era y así me obliga a usar la mayoría de ellas de este tipo que a la larga es o era el más usado, ya que para hacer bucles (
ya te explicaré en un ratillo que es eso de los bucles y cómo hacerlos en VB) y otros cálculos "normales", era más que suficiente y en la mayoría de los casos: más rápido.

En Basic, y por supuesto todavía en Visual Basic, aunque cada vez va a menos, se puede indicar el tipo de una variable de varias formas, al declararlas con Dim, vimos que se hacía de la siguiente forma:

Dim unNumero As Integer
Dim unNumeroLargo As Long
Dim otroNumero As Single
Dim masNumeros As Double
Dim unNombre As String
Dim multiUso As Variant

Cada una de estas variables es de un tipo distinto, las cuatro primeras numéricas, la quinta para almacenar cadenas de caracteres y la última del tipo por defecto del VB: Variant que como su nombre indica (aunque en inglés), es Variante y puede almacenar prácticamente cualquier cosa, objetos incluidos, (ya veremos los objetos en otra ocasión). Lo del tipo por defecto, es siempre que no se haya especificado un tipo determinado para todas las variables, por ejemplo usando el DEFINT A-Z, el tipo por defecto ya no es Variant, sino Integer.
Al grano, "quesnoche", a lo que iba era que además de declarar las variables de esta forma, también se puede hacer de de esta otra:

Dim unNumero%
Dim unNumeroLargo&
Dim otroNumero!
Dim masNumeros#
Dim unNombre$

En el caso de Variant no existe un caracter especial para indicar que es de ese tipo, así que cuando quieras usar una variable Variant, tendrás que declararla como en el primer ejemplo.
Aún queda otro carácter para otro tipo de datos numérico, el tipo Currency que se puede declarar con @. Este tipo ocupa 8 bytes y permite guardar números de tipo moneda, es decir números no enteros, pero con un número determinado y fijo de decimales, ahora no recuerdo, pero en la ayuda o en los manuales podrás ver la "retaila" de números que cada tipo admite.

Para terminar con las recomendaciones de hoy, voy a indicarte algo que debes tener en cuenta cuando declaras variables y que aún los más expertos caen en la trampa.

Además de declarar las variables con Dim, poniendo cada declaración en una línea, cosa que por otro lado queda bastante claro y es como suelo hacerlo, aunque últimamente estoy volviendo a coger malos hábitos... ¿será la edad?
También se pueden declarar más de una variable con un mismo DIM, vamos a verlo con un ejemplo:
Dim Numero As Integer, NumeroLargo As Long, otroNum As Single, Nombre As String, Numerazo As Double
por supuesto también valdría de esta otra forma:
Dim Numero%, NumeroLargo&, otroNum!, Nombre$, Numerazo#
Y si me apuras, también de esta otra:
Dim Numero%, NumeroLargo As Long, otroNum As Single, Nombre$, Numerazo#

Pero sea como fuere, en todos los ejemplos se ha especificado el tipo que queremos asignar.
Por supuesto también podremos declarar variables de esta forma:
Dim unaVariable, otraVariable, terceraVariable
Pero, surge esta pregunta ¿de que tipo son estas tres variables? (
al menos se espera que te surja...)
La respuesta es bien sencilla, si se ha entendido toda la "retahila" que te he soltado anteriormente:
Serán del tipo Variant o del especificado con el DEFINT A-Z (
es decir Integer)
Voy a suponer que la tercera recomendación no la estás poniendo en práctica, por tanto serían del tipo Variant.

Pero fíjate que podrías caer en el error, sobre todo si has programado algo en C, de pensar que esta línea:
Dim Numero, otroNumeroInt, elTercero As Integer
o esta otra:
Dim Numero As Integer, otroNumeroInt, elTercero
están declarando tres números Integer y no es así, lo que se está declarando sería, en el primer caso:
Numero y otroNumeroInt como Variant y elTercero como entero.
en el segundo caso sólo Numero sería del tipo entero y las otras dos variables del tipo Variant.

Sería "ideal" que fuese como aparenta, pero el VB no hace estas "virguerías", ni incluso en la versión 5.

Por tanto, cuando declares variables, fíjate bien de que tipo son las que estás declarando, para no llevarte sorpresas, sobre todo con los redondeos y errores de desbordamiento...
Un desbordamiento se produce cuando asignamos a un número un valor mayor del que está capacitado para almacenar, así si un entero sólo acepta valores de +/- 32767 (
realmente acepta hasta -32768), al asignarle un valor de 40000, nos dirá que "tururú" y dará error.

En cuanto a que tipo de variable usar en cada caso, tendrás que tener en cuenta que quieres hacer. Normalmente en los bucles se suelen usar variables enteras, bien Integer, si sabemos que no nos vamos a pasar de 32767, bien Long Integer que puede almacenar un valor de dos mil y pico millones... (¡quien los tuviera, aunque fuese en calderilla!)

Vamos a ver un ejemplo (al fin algo de código se escucha entre el público...), con este código podrás comprobar la velocidad de los bucles con los distintos tipos de variables y así poder comprobar cual es la más adecuada.
Crea un nuevo proyecto y asigna unos cuantos Labels (6 en total) y un botón.
Cuando ejecutes este programilla, puedes ir tranquilamente a tomar café, porque se tomará su tiempo...
En teoría nos mostrará el tiempo que emplea en hacer unos bucles con tipos diferentes de datos. Para que sea fiable, deberás especificar unos valores altos, ya que con números pequeños no es demasiado fiable, e incluso con números altos tampoco... la cosa era poner algo de código para "rematar" el capítulo de hoy...
En la próxima entrega explicaré las instrucciones que se han usado y en algunos casos, explicaré hasta el por qué de usarlas.

O sea esto es lo que se dice un programa inútil que además de consumir recursos del sistema y hacernos perder el tiempo, no vale para nada... (es que después de probarlo, me he dado cuenta de que o todos los formatos son prácticamente igual de rápidos o yo he estado "engañado" durante todo este tiempo...)

Option Explicit

Private Sub Command1_Click()
    Dim nInt As Integer
    Dim nLng As Long
    Dim nSng As Single
    Dim nDob As Double
    Dim nCur As Currency
    Dim nVar As Variant

    Dim timer1#, timer2 As Double
    Const minBucle = 1, maxBucle = 10

    Command1.Caption = "Calculando..."
    timer1 = Timer
    For nInt = minBucle To maxBucle
        Contar CInt(nInt), Label1
    Next
    timer2 = CDbl(Timer - timer1)
    Label1 = "Duración con Integer: " & timer2
    DoEvents

    timer1 = Timer
    For nLng = minBucle To maxBucle
        Contar CInt(nLng), Label2
    Next
    timer2 = CDbl(Timer - timer1)
    Label2 = "Duración con Long: " & timer2
    DoEvents

    timer1 = Timer
    For nSng = minBucle To maxBucle
        Contar CInt(nSng), Label3
    Next
    timer2 = CDbl(Timer - timer1)
    Label3 = "Duración con Single: " & timer2
    DoEvents

    timer1 = Timer
    For nDob = minBucle To maxBucle
        Contar CInt(nDob), Label4
    Next
    timer2 = CDbl(Timer - timer1)
    Label4 = "Duración con Double: " & timer2
    DoEvents

    timer1 = Timer
    For nCur = minBucle To maxBucle
        Contar CInt(nCur), Label5
    Next
    timer2 = CDbl(Timer - timer1)
    Label5 = "Duración con Currency: " & timer2
    DoEvents

    timer1 = Timer
    For nVar = minBucle To maxBucle
        Contar CInt(nVar), Label6
    Next
    timer2 = CDbl(Timer - timer1)
    Label6 = "Duración con Variant: " & timer2
    DoEvents
    Command1.Caption = "Calcular"
End Sub

Private Sub Contar(valor As Integer, etiqueta As Control)
    Dim i As Integer
    Dim unDoble As Double
    Const elMaximo = 1000&

    For i = 1 To elMaximo
        unDoble = unDoble + 1
        etiqueta.Caption = valor * elMaximo + unDoble
        DoEvents
    Next
End Sub

Te espero en la próxima entrega. Y como te digo y seguiré diciéndote: espero que me mandes tus comentarios, para saber si sólo lo estáis leyendo tú y alguien más... es que si no me dices nada, me aburro y acabaré por dejarlo...


 
entrega anterior ir al índice siguiente entrega

Ir al índice principal del Guille