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é?
En el code estas declarando r como Byte
No , lo que pasa es que me equivoque al escribir
Aqui esta la captura de pantalla
http://www.uploadfilesystem.com//viewimage.php?file=/imagenes/10/11/22/csT84224.jpg
No se ve bien la captura pero parece que aa es byte en dicha imagen
PD: si editas despues que alguien te responde se desordena el hilo
volvi a subir la imagen en otro server pincha en el enlace otra vez
Ah y prueba el code, deberas me da desboramiento
Byte solo va desde 0 hasta 255, 2 - 58 da un número negativo y eso no es compatible con el tipo de variable Byte, igualas r a el resultado de (aa - bb) siendo este incorrecto y una igualación, los dos lados deben ser coherentes.
La solucion es cambiar de tipo de variable y ya está... ;)
DoEvents! :P
Como te dice Mr Frog o cambias el tipo de variable o lo combiertes, depende el caso
Option Explicit
Private Sub Form_Load()
Dim aa As Byte, bb As Byte, r As Integer
aa = 2
bb = 58
r = CInt(aa) - CInt(bb)
MsgBox r
End Sub
Ok man , pero por que sucede esto? como ves el codigo esta bien r (INTEGER) deberia soportar el -56 resultante de aa-bb, esto solo se da en VB6? o tambien en el resto de lenguajes? .solo una explicaciòn para entenderlo. :laugh:
Porque el lenguaje antes de otogar a r (integer) hace la cunta en byte (2 - 58) es overflow
Fijate que así no da error (no es overflow)
Option Explicit
Private Sub Form_Load()
Dim aa As Byte, bb As Byte, r As Integer
aa = 59
bb = 58
r = aa - bb
MsgBox r
End Sub
pero así ...
Option Explicit
Private Sub Form_Load()
Dim aa As Byte, bb As Byte, r As Integer
aa = 2
bb = 58
r = aa - bb
MsgBox r
End Sub
Ok gracias, ahora todo esta claro.
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:
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:
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:
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] (http://wiki.elhacker.net/programacion/vb/4---principios-basicos)
* 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!¡.
Ok man, esto no lo sabia.
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.