Seite 2 von 2
Verfasst: 15.08.2006 18:49
von ts-soft
Hab Deinen Code mal leicht angepaßt, wegen der Strings (die müssen eine feste länge haben)
Code: Alles auswählen
Structure player
clientid.l
name.s{50}
string.s{50}
EndStructure
playeranzahl = 30
Dim player.player(playeranzahl)
; -> rein
player(0)\clientid = 0815
player(0)\name = "zocki"
player(0)\string = "Dies ist ein String"
player(1)\clientid = 4711
; ...
; zum anzeigen, der Einfachheit mit Debbuger
Debug player(0)\name
; grösse des Playerbuffers einzeln (104 Bytes je Player)
Debug SizeOf(player)
; Membuffer:
Debug @player(0)
Debug @player(1)
; Abstand im Speicher (sollte auch 104 sein)
Debug @player(1) - @player(0)
Jetzt mal in die Hilfe schauen und versuchen gezielte Fragen zu stellen.
Das Debug dient nur zur Anzeige, könnte man auch in eine Console
Printen, wäre aber für ein Beispiel zuviel Aufwand

Verfasst: 15.08.2006 18:55
von Brügge
häää? ich bin jetzt ein bisschen verwirt... wo wird es denn in den buffer eingespeißt? und wie heißt der buffer? und noch ne frage wir reden doch von dem selben oder? (memorybuffer) oder?
Verfasst: 15.08.2006 19:05
von ts-soft
Die Player stehen im Speicher. Der obige Code gibt die Startadresse dieses
Speichers (Buffer oder wie auch immer). Diese Adresse + 104 ist der
Speicher eines Spielers. Adresse + (104 * 31) ist die grösse des Speichers,
aller Spieler, nämlich die Spieler 0 - 30 (Dim ist nullbasiert)
Es ist also nicht nötig, es in einen anderen Speicher zu copieren, es steht
bereits hintereineinader im Speicher. Du mußt nur noch die passenden
startadressen mit @ und die länge = sizeof(player) berücksichtigen.
Verfasst: 15.08.2006 19:10
von Brügge
achso.....

stimmt ja! wenn ich eine variable abspeicher, dann geht die ja auch in den memory und dann brauch ich nur die adresse herausfinden ... ^^ thx!!!!!
Verfasst: 15.08.2006 19:14
von Brügge
achja.. wenn ich jetzt alles über netzwerk verschicke also der "buffer" dann muss der den doch wieder auseinander nehmen oder? wie mach ich denn das?
Verfasst: 15.08.2006 19:26
von ts-soft
Ich hoffe mal diese Version ist verständlich und richtig

, muß
sowas normal auch erstmal testen. Der Umweg über *buffer ist nicht
unbedingt notwendig, erspart uns aber, später alle Player mit *
anzusprechen
Code: Alles auswählen
Structure player
clientid.l
name.s{50}
string.s{50}
EndStructure
playeranzahl = 30
Dim player.player(playeranzahl)
*buffer = AllocateMemory(SizeOf(player) * 31)
If *buffer
;lese Daten
;...
; Kopiere Buffer zu unseren PlayerSpeicher
CopyMemory(*buffer, @player(0), SizeOf(player) * 31)
; *buffer überflüssig
FreeMemory(*buffer)
EndIf
Verfasst: 16.08.2006 08:29
von edel
Schreib doch gleich in den Buffer
Beispiel :
Code: Alles auswählen
Structure player
clientid.l
name.s
string.s
EndStructure
*Buffer.player = AllocateMemory(SizeOf(player)*3) ; speicher fuer 3 spieler (Structure player) reservieren.
*write_buffer.player = *Buffer ; startadresse sichern
*read_buffer.player = *Buffer ; startadresse sichern
*write_buffer\clientid = 0
*write_buffer\name = "Heinz"
*write_buffer\string = "bla1"
*write_buffer + SizeOf(player)
*write_buffer\clientid = 1
*write_buffer\name = "Gerd"
*write_buffer\string = "bla2"
*write_buffer + SizeOf(player)
*write_buffer\clientid = 2
*write_buffer\name = "Dieter"
*write_buffer\string = "bla3"
For i = 1 To 3
Debug *read_buffer\clientid
Debug *read_buffer\name
Debug *read_buffer\string
Debug "----"
*read_buffer + SizeOf(player)
Next
; nochmal
*read_buffer.player = *Buffer ; startadresse wieder herstellen
Debug "---------------------------"
For i = 1 To 3
Debug *read_buffer\clientid
Debug *read_buffer\name
Debug *read_buffer\string
Debug "----"
*read_buffer + SizeOf(player)
Next
ups ... 2. Seite nicht gesehen
