Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - BlackZeroX

#1031
Cita de: Raul100 en 17 Septiembre 2011, 23:40 PM
y pues segun que en cada caracter termina con un byte en 0 eso sucede porque el caracter es ascii no?
si fuera algun caracter unicode como una letra japonesa utilizara ese byte no? y el caracter ya no tuviera byte con un 0... ?

Supongo que si la vdd nunca e usado esos caracteres al 100% ya que no tengo la necesidad... a mi esta estructura en un uso rapido me sirven para manejar rapidamente un split() por caracter... en un array de tipos integer...

Asi como lo hacen en este post... en la funcion IsHour_Psyke12.


Dulces Lunas!¡.
#1032
Cita de: Raul100 en 17 Septiembre 2011, 18:18 PM
entonces lo que dices que cada caracter al final tiene un caracter nulo :P no es lo mismo que LPSTR ya que el caracter nulo lo lleva al final de la cadena
mas lo que dice cobein que los caracteres se almacenan en memoria en formato Unicode que creo que son 2 bytes
y entonces seria mas otro byte del caracter nulo? osea 3 byte :P no entiendo
o se me ocurre que el caracter nullo no requiere de ningun byte? o si verdad :P ?

1ro:  LPSTR    es una Definicion/Alias de un puntero a una cadena ANSI de PSTR.

2do:
Cita de: BlackZeroX▓▓▒▒░░ en 16 Septiembre 2011, 23:36 PM
.
Cada caracter esta separado por un byte NULO o con valor 0...


Aun que al final la cadena termina en 2 bytes 0... guiandome en el Alias LPWSTR.
Aun que el tipo correcto de las strings es BSTR.

Dulces Lunas!¡.
#1033
.
Revisa este codigo... te lo acabe de hacer solo para que veas como es una String Unicode en vb6...

En los primeros 4 bytes se almacen la longitud en BYTES de la cadena... despues se empiesan por poner los numeros en ascii de cada letra, separados por el ascii 0 o byte 0, y tengo entendido que la cadena termina con 2 bytes 0 en esto ultimo me puedo equivocar pero no lo creo ya que de lo contrario el api lstrlenW (corrijanme por favor ya que no recuerdo su nombre esactamente), no sabria hasta donde termina dicha cadena en Unicode...

El tipo de string es:  CWSTR

Código (vb) [Seleccionar]


Option Explicit

Private Declare Sub PutMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Long)
Private Declare Sub GetMem4 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)

Private Sub Form_Load()
Dim bStrUnicode(17)     As Byte     '   //  4 bytes (Longitud), Num Caracteres * 2, 2 bytes 0
                                    '   //  (4 + (6*2) + 2) = 18 es decir 0 - 17 dimensiones...
Dim i                   As Long
Dim pStr                As String
Dim lpStrBack           As Long
   
    '   //  Primeros 4 bytes...
    PutMem4 ByVal VarPtr(bStrUnicode(0)), 12
    i = &H4
    '   //  Bytes de los caracteres + su separador...
    bStrUnicode(i) = Asc("M"): bStrUnicode(i + 1) = 0: i = i + &H2
    bStrUnicode(i) = Asc("i"): bStrUnicode(i + 1) = 0: i = i + &H2
    bStrUnicode(i) = Asc("g"): bStrUnicode(i + 1) = 0: i = i + &H2
    bStrUnicode(i) = Asc("u"): bStrUnicode(i + 1) = 0: i = i + &H2
    bStrUnicode(i) = Asc("e"): bStrUnicode(i + 1) = 0: i = i + &H2
    bStrUnicode(i) = Asc("l"): bStrUnicode(i + 1) = 0: i = i + &H2
    '   //  Ultimos 2 bytes infdican el final de la cadena Unicode...
    bStrUnicode(i) = 0: bStrUnicode(i + 1) = 0          '   //  Bytes a mi parecer Obligatorios... corrijanme
   
    pStr = "BlackZeroX"
    GetMem4 ByVal VarPtr(pStr), VarPtr(lpStrBack)       '   //  Repaldo del puntero al bloque...
    MsgBox pStr
    PutMem4 ByVal VarPtr(pStr), VarPtr(bStrUnicode(4))  '   //  Apuntamos al indice 4 de bStrUnicode
    MsgBox pStr
    PutMem4 ByVal VarPtr(pStr), lpStrBack               '   //  Restauramos... es obligatorio o causaria un crash...
    MsgBox pStr
   
End Sub



en pocas palabras la estructura de una string en vb6 seria algo asi... estrictamente en este orden.

Código (Vb) [Seleccionar]


Type CWStr
    lLn         As Long     '   // 12. Deben ser igual a la longitud en bytes de bData... (6 * 2)
    bData(11)   As Byte     '   // Miguel; Estas dimenciones dependen de la longitud de la cadena. en este caso es de longitud (6 * 2).
    iEnd        As Integer  '   // Se iguala a 0 para setear el termino de la cadena. integer = 2 bytes...
End Type



Temibles Lunas!¡.
#1034

Código (Vb) [Seleccionar]


Private Sub Form_Load()
MsgBox TextoEntreMedio("aitheoiethi[BLABLABLA]taihoithaoihtoea", "(", "]")
End Sub



Dulces Lunas!¡.
#1035
.
Quien esta tan loco como para desactivar el Beep?... en casos extraordinarios arrancarlo de la Motherboard? juren que esto ultimo habra y hay casos.

P.D.: No sabia eso del Beep, solo sabia que era para detectar errores...

Dulces Lunas!¡.
#1036
.

Cita de: extreme69 en 17 Septiembre 2011, 01:35 AM
¿Será que primero tengo que ver en que posición del string está el "[", luego hacer lo mismo con el "]" y una vez que sé las posiciones hacer un mid? ¿o hay alguna manera más fácil/rápida?

que comes que adivinas...

Cita: http://visual-coders.herobo.com/blog/?p=1

Código (Vb) [Seleccionar]


'------------------------------------------------------------------------
' *Function : Text_Between_Words
' *Author   : *PsYkE1*
' *Mail     : vbpsyke1@mixmail.com
' *Date     : 10/4/10
' *Purpose  : It returns the text wich is between two words
' *Recommended Websites :
'       http://foro.rthacker.net/
'       http://InfrAngeluX.Sytes.Net/
'------------------------------------------------------------------------
Option Explicit
Public Function Text_Between_Words(ByVal sTextToAnalyze As String, ByVal sStartWord As String, ByVal sEndWord As String) As String
Dim iPosition1                  As Integer
Dim iPosition2                  As Integer
Dim iStart                      As Integer
   iPosition1 = InStr(sTextToAnalyze, sStartWord)
   If CBool(iPosition1) Then
       iStart = iPosition1 + Len(sStartWord)
       iPosition2 = InStr(iStart, sTextToAnalyze, sEndWord)
       If CBool(iPosition2) Then
           Text_Between_Words = Mid$(sTextToAnalyze, iStart, iPosition2 - iStart)
       End If
   End If
End Function



Código (vb) [Seleccionar]


Debug.Print Text_Between_Words("El contexto es el ámbito de referencia de un texto. ¿Qué entiendo por ámbito de referencia?.", "referencia", "referencia")



Dulces Lunas!¡.
#1037
.
CopyMemory en ningun momento reserva memoria... solo copia un bloque de bytes a otro bloque...

Citando la MSDN de la API SysAllocStringLen

Citar

If pch is NULL, a string of the requested length is allocated, but not initialized. The pch string can contain embedded null characters and does not need to end with a NULL. Free the returned string later with SysFreeString.


Nota: MSDN.

P.D.: esta discusion tiene cita a una respuesta que Psyke1 ha borrado...

Dulces Lunas!¡.
#1038
Código (vb) [Seleccionar]


Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

Private Sub Form_Load()
    Beep 5000, 5000
End Sub



Si no te funciona eso entonces vas a abrir tu PC y a ver si esta la pequeña bocina, ya que es Obligatoria su existencia.

Dulces Lunas!¡.
#1039
.
Cada caracter esta separado por un byte NULO o con valor 0... por ello es mejor usar PutMem2 pero igual y solo quieres hacer alguna otra cosa...

Código (vb) [Seleccionar]


Option Explicit

Private Declare Sub PutMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal NewVal As Byte)
Private Declare Sub GetMem1 Lib "msvbvm60" (ByVal Addr As Long, ByVal RetVal As Long)

Private Sub Form_Load()
Dim sStr            As String
Const NAME          As String = "Miguel Angel"
Const CARACTER      As Long = &H2               '   //  Posicion del caracter a leer.
Dim bChar           As Byte

    sStr = "ABCDEFGH"
   
    MsgBox sStr
    GetMem1 (StrPtr(NAME) + ((CARACTER * 2) - 2)), VarPtr(bChar) '   //  Leemos un Byte...
    PutMem1 (StrPtr(sStr) + 2), bChar         '   //  Escribimos el byte en la posicion de "B"
    MsgBox sStr
End Sub



@Psyke1

Si usas SysAllocStringLen deberas liberar la memoria con SysFreeString.

Dulces Lunas!¡.
#1040
Programación Visual Basic / Re: [Reto] IsHour
16 Septiembre 2011, 01:28 AM
@ A mi criterio ni la de Raul338 ni la mia son legiles (me tarde un poco en entender la de Raul338, mas que nada como comprobaba los rangos, ya que esta dispersa esa region)... y la mia esta un poco ofuscada... mas aun sin comentarios, almenos que seas yo  :xD.

Para mi la funcion mas rapida y legible es la de IsHour_Psyke12, no tengo que comprobarla para saber eso.

Dulces Lunas!¡.