elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  ¿Por què da desbordamiento este codigo?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Por què da desbordamiento este codigo?  (Leído 3,867 veces)
theghost_te

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: ¿Por què da desbordamiento este codigo?
« Respuesta #10 en: 22 Noviembre 2010, 04:44 am »

Ok gracias, ahora todo esta claro.


En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: ¿Por què da desbordamiento este codigo?
« Respuesta #11 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]
* 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!¡.


« Última modificación: 22 Noviembre 2010, 07:50 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
theghost_te

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: ¿Por què da desbordamiento este codigo?
« Respuesta #12 en: 22 Noviembre 2010, 21:29 pm »

Ok man, esto no lo sabia.
En línea

frankorndimex

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: ¿Por què da desbordamiento este codigo?
« Respuesta #13 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.
En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines