Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von diceman »

NicTheQuick hat geschrieben:Und warum machst du das so kompliziert? Wieso packst du das alles nicht in eine Liste und überprüfst dann einfach nur den Typen mit einem kleinen If während du über die Liste läufst? Ständig Elemente hinzuzufügen und zu löschen kostet viel mehr Zeit.
diceman hat geschrieben:Ich behaupte nicht, daß das praktikabel sei oder man das braucht, aber es hat Spaß gemacht, das auszutüfteln, und es war eine gute Übung fürs Verständnis, wie Listen, Strukturen und Elemente miteinander interagieren: :D
:wink:
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von diceman »

//EDIT:
Lösung selber gefunden. Mit ChangeCurrentElement() gehts ... :allright:
noob hat geschrieben:Entschuldigung, ich habe noch einmal eine (doofe?) Frage ...

Gegeben sei irgendeine Structure und die dazugehörige Liste zum verwalten:

Code: Alles auswählen

Structure MY_STRUCT
    someProperty.i
EndStructure
New List myStruct.MY_STRUCT()
Dann kann ich ja mit *myPointer.MY_STRUCT einen Pointer initialisieren. Wenn ich jetzt bei irgendeinem Element in der Liste bin, kann ich mit *myPointer = @myStruct() den Pointer auf dieses Element setzen, und irgendwann später die Properties des Elementes an der Pointer-Stelle abrufen:

Code: Alles auswählen

Debug myPointer\someProperty
So weit so klar, funktioniert auch.

Wie aber kann ich eben dieses Listenelement, auf das der Pointer zeigt, sofort an die aktuelle Stelle holen, so daß ich es z.B. mit DeleteElement(myStruct()) löschen kann, ohne daß ich vorher mit ForEach einmal die ganze Liste durchrattern und danach suchen muß?

Code: Alles auswählen

SelectElement(myStruct(),*myPointer)
funktioniert nicht, da ich da an der Position nur die Listenposition angeben kann, und nicht die Speicheradresse.
Vielen Dank. :)
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von mk-soft »

Noch ein kleiner Tipp.
Eine Struktur kann auch wieder Elemente aufnehmen

Edit. Es gibt auch noch 'Enumeration'

Code: Alles auswählen



Enumeration OBJECT
  #OBJ_Schatztruhe
  #OBJ_Schwert
  #OBJ_Beil
EndEnumeration

Structure ACTOR
  x.i
  y.i
EndStructure

Structure OBJECT Extends ACTOR
  id.i
  type$
  locked.i
EndStructure

Structure MONSTER Extends ACTOR
  name$
  hp.i
  List obj.OBJECT()
EndStructure


Global NewList *act.ACTOR()
Global NewList mon.MONSTER()
Global NewList obj.OBJECT()


AddElement(*act())
*act() = AddElement(obj())
obj()\x = 11
obj()\y = 6
obj()\id = #OBJ_Schatztruhe
obj()\type$ = "Schatztruhe"
obj()\locked = 0

AddElement(*act())
*act() = AddElement(obj())
obj()\x = 21
obj()\y = 6
obj()\id = #OBJ_Schwert
obj()\type$ = "Schwert"
obj()\locked = 0

AddElement(*act())
*act() = AddElement(obj())
obj()\x = 31
obj()\y = 6
obj()\id = #OBJ_Beil
obj()\type$ = "Beil"
obj()\locked = 0


AddElement(*act())
*act() = AddElement(mon())
mon()\x = 10
mon()\y = 5
mon()\name$ = "Goblin"
mon()\hp = 20

ForEach obj()
  If obj()\id = #OBJ_Schwert
    Break
  EndIf
Next
AddElement(mon()\obj())
mon()\obj() = obj() ; Hier wird das ganze aktuelle Element kopiert
mon()\obj()\x = 0
mon()\obj()\y = 0

Debug "Monster"
ForEach mon()
  Debug mon()\name$+" ("+mon()\hp+")   "+mon()\x+","+mon()\y
  ForEach mon()\obj()
    Debug "-> " + mon()\obj()\type$+" ("+mon()\obj()\locked+")   "+mon()\obj()\x+","+mon()\obj()\y
  Next
Next
Debug ""

Debug "Objekte"
ForEach obj()
  Debug obj()\type$+" ("+obj()\locked+")   "+obj()\x+","+obj()\y
Next
Debug ""

ForEach *act()
  Debug "" + *act()\x + "," + *act()\y
Next
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von diceman »

Ich habe nochmal eine elementare Frage zu Strukturen:
Ist es irgendwie möglich, sich die Anzahl an definierten Attributen einer Strukur zurückgeben zu lassen?
Also wenn ich z.B. sowas habe ...

Code: Alles auswählen

Structure FOO
    name.s
    attribute.i
    someFloat.f
EndStructure
... sollte mir der entsprechende Befehl eine "3" zurückgeben.
SizeOf() gibt nämlich nur den reservierten Speicher zurück, also im obigen Beispiel eine 20.
Danke! :)
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von ccode_new »

Hallo diceman,

eine genaue Antwort habe ich jetzt auch nicht.

Vielleicht kannst du dir damit etwas basteln.

Code: Alles auswählen

Structure test
  a.i
  b.i
  c.i
  d.i
  e.i
  f.i
  g.i
  h.i
EndStructure

Debug OffsetOf(test\h) / 8 ;h ist an der achten Stelle (Beginn bei 0) - Durch 8 - weil ein Int 8 Bytes hat.

;Hierbei muss die Speichergröße der einzelnen Elemente beachtet werden.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von diceman »

Oh, das ist eine gute Idee! :allright:
Die Sache ist die: ich bin momentan head over heels in den Routinen für's Speichern/Laden/Herstellen des World States in meinem Roguelike; das ist logistisch ein größerer Aufwand als angenommen, vor allem da ich vorhabe, auch beim (noch nicht implementierten) Ebenen-Wechsel die World Data zwischenzuspeichern und die actorList zu flushen und neu zu erstellen - so arbeite ich immer nur mit aktuell relevanten Daten, halte Performance oben und den Speicherverbrauch minimal, und kann mir viele isLegit-Abfragen sparen = weniger Debugging. Die Attribut-Liste meiner Actors ist mittlerweile auf rund 50 angewachsen, einiges davon sind Bytes, andere Integer, und 3 Floats habe ich auch. Bin diesbezüglich gebranntes Kind noch aus Blitzbasic-Zeiten, wo ich rund 25% aller Fehler auf falsche Dateitypen beim Speicher/Laden/Initialisieren zurückführen konnte. Ich möchte einfach sicher gehen, daß ich wirklich 100% aller Daten korrekt geladen habe, daher habe ich die Attribut-Typen in der Struktur-Definition angeordnet wie sie logisch und übersichtlich sind, beim Speichern und Laden dagegen sortiert nach Dateitypen - und so eine zusätzliche Abfrage, ob auch wirklich alles geladen und zugewiesen wurde, kann da nichts schaden, da hin und wieder auchmal ein paar Attribute wieder rausfliegen oder neu hinzukommen. :)
Habe außerdem ein paar Debugging-Tools in den Code implementiert, so kann ich z.B. jederzeit in game mit TAB einen Actor taggen und mir dann mit erneutem Drücken der TAB-Taste seine Properties anzeigen lassen, oder durch Drücken einer Taste den state der collisionMap() oder die Dijkstra-Values pro Feld anzeigen lassen, etc.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von mk-soft »

Ich glaube zum speichern und laden von ganzen Strukturen ist JSON eine gute alternative.
Habe aber selber noch nicht mit gearbeitet.
InsertJSONStructure(JSONWert, *Puffer, Struktur)
ExtractJSONStructure(JSONWert, *Puffer, Struktur)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von Bisonte »

mk-soft hat geschrieben:Ich glaube zum speichern und laden von ganzen Strukturen ist JSON eine gute alternative.
Habe aber selber noch nicht mit gearbeitet.
Das klappt wunderbar, weil auch die Strings wirklich übergeben werden und nicht nur die Adressen zu ihnen.

@ccode_new:

Code: Alles auswählen

Debug OffsetOf(test\h) / 8 ;h ist an der achten Stelle (Beginn bei 0) - Durch 8 - weil ein Int 8 Bytes hat.
Böser Fehler. Das ist nur bei 64Bit Kompilaten !
Bei 32Bit sind es lediglich 4 Bytes für INTEGER !

In deinem Beispiel wäre

Code: Alles auswählen

Debug OffsetOf(test\h) / SizeOf(Integer)

angebrachter.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von diceman »

JSON kommt für mich leider nicht in Frage, weil ich die Listen-Elemente nicht direkt beim Laden erstelle, sondern nur die Daten puffere und dann an meine actorFactory() weiterreiche, welche daraus dann erst funktionierende Elemente erstellt. Die actorFactory() automatisiert alle mögliche Schritte für mich, initilialisiert, zählt, weist zu, sortiert, und stellt sicher, daß hinter alles läuft und korrekt miteinander agiert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Hilfe bei Strukturen (Elemente zufügen/löschen/finden)

Beitrag von ccode_new »

Hallo Bisonte,

ich denke das diceman soweit mitdenkt.

Natürlich hast du recht.

Der Code war ja auch nur zum Weiterdenken gedacht.
Also die Sache mit dem Offset-Gedöns.

Anbei: Strukturen kann man auch toll als Ersatz für AllocateMemory verwenden.

Code: Alles auswählen

Structure test
  a.b
  b.l
  c.f
  d.d
  e.i
  f.q
  g.w
EndStructure

Global tester.test ;Ersatz für AllocateMemory

TestString.s = "Hallo Welt"

PokeS(tester, TestString, SizeOf(test), #PB_Ascii)

Debug Chr(tester\a) ;Hier ist ein H

For i = 0 To Len(TestString)
  Debug Chr(PeekB(tester+i))
Next i
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten