Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: theghost_te en 22 Noviembre 2010, 00:36 am



Título: ¿Por què da desbordamiento este codigo?
Publicado por: 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:

Código:

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é?


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: Dessa en 22 Noviembre 2010, 00:53 am
En el code estas declarando r como Byte


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: theghost_te en 22 Noviembre 2010, 00:57 am
No , lo que pasa es que me equivoque al escribir


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: theghost_te en 22 Noviembre 2010, 00:59 am
Aqui esta la captura de pantalla
http://www.uploadfilesystem.com//viewimage.php?file=/imagenes/10/11/22/csT84224.jpg


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: Dessa en 22 Noviembre 2010, 01:09 am
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



Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: theghost_te en 22 Noviembre 2010, 01:11 am
volvi a subir la imagen en otro server pincha en el enlace otra vez
Ah y prueba el code, deberas me da desboramiento


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: Psyke1 en 22 Noviembre 2010, 01:44 am
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


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: Dessa en 22 Noviembre 2010, 03:24 am
Como te dice Mr Frog o cambias el tipo de variable o lo combiertes, depende el caso
Código:
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




Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: theghost_te en 22 Noviembre 2010, 03:45 am
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:


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: Dessa en 22 Noviembre 2010, 03:49 am
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)

Código:

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í ...


Código:

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












Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: theghost_te en 22 Noviembre 2010, 04:44 am
Ok gracias, ahora todo esta claro.


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: BlackZeroX en 22 Noviembre 2010, 07:10 am
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
  1.  
  2. Private Sub Form_Load()
  3.    Dim aa As Byte, bb As Byte, r As Integer
  4.    aa = 2
  5.    bb = 58
  6.    r = aa - bb
  7. End Sub
  8.  
  9.  

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
  1.  
  2. Private Sub Form_Load()
  3.    Dim aa As Byte, bb As Byte, r As Integer
  4.    aa = 2
  5.    bb = 58
  6.    r = (0% + aa) - bb
  7. End Sub
  8.  
  9.  

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
  1. vartmp1 = (0% + aa)  ' // Aqui se hace la prevencion del OverFlow es decir se convierte a Integer (0%)
  2. vartmp2 = vartmp1 - bb
  3. r = vartmp2
  4.  


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!¡.


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: theghost_te en 22 Noviembre 2010, 21:29 pm
Ok man, esto no lo sabia.


Título: Re: ¿Por què da desbordamiento este codigo?
Publicado por: frankorndimex en 8 Diciembre 2010, 03:25 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:

Código:

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.