Como realizo una resta en tipos definidos por el usuario? (Con LSet y uLong¿?)

Iniciado por EddyW, 21 Agosto 2011, 22:18 PM

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

EddyW

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 (vb) [Seleccionar]
Private Type cD
    A As Long
    B As Long
    C As Long
    D As Long
End Type

Private Type tStrg
    tStrg As String * 8
End Type

Private Sub Form_Load()
    Dim One As cD, Two As cD, Res As cD
    Dim LS As tStrg
    LS.tStrg = "86420"
    LSet One = LS
    LS.tStrg = "6020"
    LSet Two = LS
    ' Aquí no se como restar ONE - TWO usando el UTD Res
    ' El resultado se mostraría así ..:
    With Res
            ' Operaciones que no se como .¿?
    End With
    LSet LS = Res
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!!!

BlackZeroX

#1
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!¡.
The Dark Shadow is my passion.

BlackZeroX


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

Código (Vb) [Seleccionar]


Option Explicit

Private Type udtDouble
    value As Double
End Type

Private Type udtStr
    value As String * 8
End Type

Private Sub Form_Load()
Dim One     As udtDouble, _
    Two     As udtDouble, _
    Res     As udtDouble
Dim tStr    As udtStr


    tStr.value = "8"    '1000 0000
    LSet One = tStr
   
    tStr.value = "2"    '0010 0000
    LSet Two = tStr
   
    Res.value = (One.value - Two.value) ' 1000 0000 - 0010 0000 = 11000000 = (192 >> 4) = 12
    LSet tStr = Res

    Debug.Print tStr.value '= 192
    Debug.Print Asc(tStr.value) '= 12
   
End Sub



Dulces Lunas!¡.
The Dark Shadow is my passion.

EddyW

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 (vb) [Seleccionar]
Private Type bByte
    L() As Byte
End Type

Private Sub Form_Load()
    Dim EJ As bByte
    ReDim EJ.L(1 to 100) As Byte
    MsgBox LenB(EJ) ' => 4 ¿o.O?
End Sub


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

SaluDOS!!!

BlackZeroX

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!¡.
The Dark Shadow is my passion.