mehrere Variablen in einen buffer

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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 :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

@player(0)
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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

achso..... :mrgreen: stimmt ja! wenn ich eine variable abspeicher, dann geht die ja auch in den memory und dann brauch ich nur die adresse herausfinden ... ^^ thx!!!!!
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag 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?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ich hoffe mal diese Version ist verständlich und richtig :wink: , 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 :D
Antworten