¿Por què da desbordamiento este codigo?

Iniciado por theghost_te, 22 Noviembre 2010, 00:36 AM

0 Miembros y 1 Visitante están viendo este tema.

theghost_te


BlackZeroX

#11
Aquí va una explicacion de como trabaja VB6, solo lo voy a abreviar, lo voy a extender en la wiki alrato.

ANTES QUE ANDA la evaluación en VB6 trabaja de IZQUIERDA a Derecha...

El overflow ("Error 6 en tiempo de ejecución") del siguiente codigo:

Código (Vb) [Seleccionar]


Private Sub Form_Load()
    Dim aa As Byte, bb As Byte, r As Integer
    aa = 2
    bb = 58
    r = aa - bb
End Sub



Dicho error, se debe a que se crea una variable temporal del mismo tipo del 1er elemento de la expresion matematica en este caso es byte, trabaja similar a C con respecto al casting de tipos, esto tiene un nombre que me parece tenia algo que ver con conversion forzada, este proceso tiene un nombre, pero no recuerdo cual era xP.

Una de las muchas Soluciones, seria la siguiente:
Código (Vb) [Seleccionar]


Private Sub Form_Load()
    Dim aa As Byte, bb As Byte, r As Integer
    aa = 2
    bb = 58
    r = (0% + aa) - bb
End Sub



Donde se empesaria a trabajar de la siguiente manera:
(sabiendo como evaluacia vb6 las expresiones)

OJO: En el Paso 1 se hace una prevension al OverFlow, Los parentesis son solo de forma preventiva y/o entendible

1ero:
* Se suma (0% + aa) ---> [/b] Se hace un casting ( Conversion al tipo de datos ).

2do:
* Se evalua el resultado del anterior (1er Paso) con la siguiente expresion es decir - bb y se almacena finalmente el resultado

En forma entendieble trabaria haci:

Código (Vb) [Seleccionar]

vartmp1 = (0% + aa)  ' // Aqui se hace la prevencion del OverFlow es decir se convierte a Integer (0%)
vartmp2 = vartmp1 - bb
r = vartmp2



P.D.: Para saber que significa "%" en el 0 ( 0% ) lee lo que he escrito en la wiki.
4 - [Nociones básicas]
* Es decir que si fuera la variable r de tipo Long hubera usado % en lugar de %, (Aun que no afecta mucho que digamos...).

NOTA: De forma predeterminada se pone el 0 del tipo % ( Integer; Por lo cuel el IDE de vb6 lo elimina, caso omiso ante los demás tipos de variables que no hace lo mismo ), solo lo he agregado aquí para la redaccion logica del mismo.

Sangriento Infierno Lunar!¡.
The Dark Shadow is my passion.

theghost_te


frankorndimex

Cita de: theghost_te en 22 Noviembre 2010, 00:36 AM
Hola amigos estaba haciendo un codigo bastante extenso en VB6 y al ejecutar fallò en un bucle FOR que daba desbordamiento, luego lo ejecute paso a paso con F8 y el desbordamiento se producia al restar 2 variables de tipo BYTE aa = 2 y bb = 58, y guardarlas en una de tipo INTEGER llamada r. asi que ejecute por separado la parte que me daba errores:



Private Sub Form_Load()
   Dim aa As Integer, bb As Byte, r As Integer
   aa = 2
   bb = 58
   r = aa - bb
   'r = -2000
End Sub


si ejecutan ese code veran que les da desbordamiento.
La verda no sè por què me da errores, el resultado seria -56 que se guarda en r que es un INTEGER y deberia soportar el valor.
¿en què fallé?

no se si te sirva esto, no se mucho de programación pero puede ser una sugerencia:

Private Sub Form_Load()
    Dim aa As Integer, bb As Byte, r As Integer
    aa = 2
    bb = 58
    r = Int(aa - bb)
    MsgBox r
End Sub

o esto otro:

Private Sub Form_Load()
    Dim aa As Integer, bb As Integer, r As Integer
    aa = 2
    bb = 58
    r = aa - bb
    MsgBox r
End Sub

Como habían dicho anteriormente Byte es de 0 a 255 si los dejas como integer resulta.