Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: EddyW en 21 Agosto 2011, 22:18 pm



Título: Como realizo una resta en tipos definidos por el usuario? (Con LSet y uLong¿?)
Publicado por: EddyW en 21 Agosto 2011, 22:18 pm
Hola,

No pude pensar en un mejor título que describa el topic, lamento eso :P
Quiero realizar una resta de 2 números de 16 Bytes, pero es un UDT..
Código
  1. Private Type cD
  2.    A As Long
  3.    B As Long
  4.    C As Long
  5.    D As Long
  6. End Type
  7.  
  8. Private Type tStrg
  9.    tStrg As String * 8
  10. End Type
  11.  
  12. Private Sub Form_Load()
  13.    Dim One As cD, Two As cD, Res As cD
  14.    Dim LS As tStrg
  15.    LS.tStrg = "86420"
  16.    LSet One = LS
  17.    LS.tStrg = "6020"
  18.    LSet Two = LS
  19.    ' Aquí no se como restar ONE - TWO usando el UTD Res
  20.    ' El resultado se mostraría así ..:
  21.    With Res
  22.            ' Operaciones que no se como .¿?
  23.    End With
  24.    LSet LS = Res
  25. End Sub

Pensé en restar One.A con Two.A, y así sucesivamente, pero no funciona (De todas formas no tiene lógica para funcionar así),
No se si esto sirva, pero más o menos es lo que debería devolver:
Citar
  ONE       . TWO       . RES
A 3539000 . 3145782 . 3145784
B 3276852 . 3145778 . 3145780
C 2097200 . 2097184 . 2097200
D 2097184 . 2097184 . 2097184
  =86420  . =6020    . =80400
Más o menos creo que capta la idea ..
Alguna ayuda :P

SaluDOS!!!


Título: Re: Como realizo una resta en tipos definidos por el usuario? (Con LSet y uLong¿?)
Publicado por: BlackZeroX en 21 Agosto 2011, 22:55 pm
pues...

Para hacer la resta debes pasar los strings a numero... (Ni siquiera te acercas a los numeros de la string).

Al hacer el LSET lo que andas haciendo es que SOLO COPIAS los bytes tal cuales de un UDT a otro UDT, es decir que tan solo el string "6420" es el numero "9007336695791664", es decir un numero de 8 Bytes (Double)... asi que la operacion matematica que tu planteas esta alocada...

Cada caracter de una string son 2 bytes es decir que en un tipo long solo caben dos caracteres... aun que esto creo que ya lo sabes por que en el UDT tStr creas un buffer adecuado a el UDT cD.

El metodo es mas complicado aun (Debes crear una funcion que sume).

Dulces Lunas!¡.


Título: Re: Como realizo una resta en tipos definidos por el usuario? (Con LSet y uLong¿?)
Publicado por: BlackZeroX en 21 Agosto 2011, 23:20 pm

Mirate este ejemplo d eloq ue digo, es complicado hacer una resta como la quieres hacer...

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Type udtDouble
  5.    value As Double
  6. End Type
  7.  
  8. Private Type udtStr
  9.    value As String * 8
  10. End Type
  11.  
  12. Private Sub Form_Load()
  13. Dim One     As udtDouble, _
  14.    Two     As udtDouble, _
  15.    Res     As udtDouble
  16. Dim tStr    As udtStr
  17.  
  18.  
  19.    tStr.value = "8"    '1000 0000
  20.    LSet One = tStr
  21.  
  22.    tStr.value = "2"    '0010 0000
  23.    LSet Two = tStr
  24.  
  25.    Res.value = (One.value - Two.value) ' 1000 0000 - 0010 0000 = 11000000 = (192 >> 4) = 12
  26.    LSet tStr = Res
  27.  
  28.    Debug.Print tStr.value '= 192
  29.    Debug.Print Asc(tStr.value) '= 12
  30.  
  31. End Sub
  32.  
  33.  

Dulces Lunas!¡.


Título: Re: Como realizo una resta en tipos definidos por el usuario? (Con LSet y uLong¿?)
Publicado por: EddyW en 21 Agosto 2011, 23:39 pm
Precisamente estaba pensando en esos 2 Bytes, gracias por aclarar, me va ha servir tu ejemplo ;)
Tengo otra duda que me saltó, por que esto 'esta mal'?

Código
  1. Private Type bByte
  2.    L() As Byte
  3. End Type
  4.  
  5. Private Sub Form_Load()
  6.    Dim EJ As bByte
  7.    ReDim EJ.L(1 to 100) As Byte
  8.    MsgBox LenB(EJ) ' => 4 ¿o.O?
  9. End Sub

Supongo que es por que es una variable dinámica, pero ¿no hay forma?,

SaluDOS!!!


Título: Re: Como realizo una resta en tipos definidos por el usuario? (Con LSet y uLong¿?)
Publicado por: BlackZeroX en 21 Agosto 2011, 23:49 pm
lo que pasa es que:

L() As Byte

Se trata como puntero a una structura SafeArray... que a su vez tiene un miembro pvData que apunta al 1er indice del array.

Dulces Lunas!¡.