Toon posts:

[VB6] Structure omzetten in string

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig aan een simpel spelletje dat straks over netwerk moet gaan draaien. De info over de players wordt alsvolgt opgeslagen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Private Type Plr
    X As Double
    Y As Double
    VX As Double
    VY As Double
    PL As Boolean
    PR As Boolean
    PU As Boolean
    PD As Boolean
End Type

Dim Player(8) As Plr


Maar goed, als je wat door Winsock wilt gaan sturen, moet het een string zijn. M.a.w. ik moet deze Type omzetten in een String. Hiervoor had ik al CopyMemory gebruikt, maar dat werkt niet goed ofzo, vast omdat het doubles zijn denk ik.

In de serverwindow had ik dit gemaakt:
code:
1
2
3
4
5
Function SendInfo(playernum As Byte) As String
    Dim k As String * 40
    CopyMemory ByVal VarPtr(k), ByVal VarPtr(Player(playernum)), 40
    SendInfo = k
End Function


en in de client window dit:
code:
1
2
3
4
5
Private Sub Timer2_Timer()
    Dim k As String * 40
    k = Form1.SendInfo(0)
    CopyMemory ByVal VarPtr(Player(0)), ByVal VarPtr(k), 40
End Sub


even voor de duidelijkheid: mijn app heeft dus 2 windows, 1 server en een client die met elkaar alleen maar via Subs en Functions communiceren.
Als je dan in de client window de waarden van die doubles opvraagt, komt er 0 uit, of geeft VB een fatal error [lekker dat je dan ook je source code kwijt ben btw]. Weet iemand een betere manier om deze structure om te zetten in string, en weer terug?

  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Waarom niet zo:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Type t
    a As Integer
    b As Double
    c As Boolean
End Type

Private Sub Test()
    Dim q As t
    Dim q_ser As String
    q.a = 12
    q.b = 34.126
    q.c = False
    q_ser = CStr(q.a) & "|" & CStr(q.b) & "|" & CStr(q.c)
End Sub


En vervolgens met split oid. uitlezen...

[ Voor 15% gewijzigd door Limhes op 06-07-2003 14:44 ]


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 18:53

RayNbow

Kirika <3

Ik heb eens zitten spitten in de MSDN en vond het artikel "Typeless Strings" uit "Hardcore Visual Basic". Ff naar de code gekeken en wat zitten uitproberen:
(M'n VB is tijdens het uitproberen wel een paar keer gecrasht :P)
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias _ 
"RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Type Plr
    X As Double
    Y As Double
    VX As Double
    VY As Double
    PL As Boolean
    PR As Boolean
    PU As Boolean
    PD As Boolean
End Type

Dim Player As Plr
Dim Player2 As Plr

Dim strPlayer As String * 40

Dim Temp As String


Private Sub Command1_Click()
    CopyMemory ByVal strPlayer, ByVal VarPtr(Player), 40
    
    ' DEBUG CODE
    Dim I As Integer
    Temp = ""
    For I = 1 To 40
        Temp = Temp & Asc(Mid(strPlayer, I, 1))
    Next I
    Debug.Print Temp
    ' /DEBUG CODE
    
    CopyMemory ByVal VarPtr(Player2), ByVal strPlayer, 40

End Sub

Private Sub Form_Load()
    With Player
        .X = 10
        .Y = 20
        .VX = 30
        .VY = 40
        .PL = True
        .PR = True
        .PU = False
        .PD = False
    End With
    
End Sub


Uiteindelijk op F5 gedrukt en ff het debug window gebruikt. Code werkte ;)

Dus:
CopyMemory ByVal NaamVanStringVariabele, ByVal VarPtr(NaamUDTVariabele), GrootteVanUDT


Limhes schreef op 06 juli 2003 @ 14:43:
Waarom niet zo:

Visual Basic:
1
...


En vervolgens met split oid. uitlezen...
Dat kan natuurlijk wel, maar dan moet je meer bytes overpompen... en je moet juist zuinig zijn met bandbreedte ;)

[ Voor 4% gewijzigd door RayNbow op 06-07-2003 15:03 ]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Verwijderd

Topicstarter
yes, hij werkt! Van die string moest er dus GEEN varptr doorgegeven worden. Weer wat geleerd :D
Nu nog de boel door WinSok gooien. Dat moet lukken, heb ik al eerderderder gedaan

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 18:53

RayNbow

Kirika <3

Tja, ik wist ook niet dat je geen pointer van de string moest doorgeven, maar ik las ergens dat VB dat automatisch deed of zo...

Over VarPtr, die moet je in ieder geval nooit op Strings gebruiken.
They’ll probably also deny knowledge of VarPtr’s cousins, StrPtr and ObjPtr. VarPtr doesn’t work on Strings because the pointer you would get back would be the pointer to the ANSI buffer that Visual Basic creates when calling API functions. StrPtr returns a pointer to the real Unicode string value. ObjPtr returns a pointer to an object. It makes me dizzy to even think about what hardcore programmers might think of to do with object pointers. I won’t talk about them in this chapter.

Bron: Bring Your Hatchet, Hardcore Visual Basic (MSDN)

Ipsa Scientia Potestas Est
NNID: ShinNoNoir