ich würde gerne mal eine Umfrage (weiß allerdings grad nicht wie) bzw. Diskussion starten. Es geht darum, wie man am besten Elemente in einer eigenen Datenstruktur (z.b. Stack) speichert, und wie man damit umgeht, wenn sie gelöscht werden. Mich beschäftigt diese Frage z.Z. wieder, da ich schon sehr viele Ansätze gefunden hab, aber keiner so wirklich zufriedenstellend war. Das Problem ist halt, dass PB erstens kein OOP unterstützt (ich will jetzt keine Diskussion starten, warum denn nicht), und zweitens keinen Garbage Collector besitzt. Also muss man sich selbst um die Speicherverwaltung kümmern, klar! Aber wie? Hab in den Jahren nun vier mögliche Wege gefunden, die ich jetzt mal vorstellen will:
Zu jeder Methode gibt es übrigens hier ein Beispielcode:
http://cshw89.mevedia.de/StackMethoden.zip
=======================
Methode1:
- Einfügen (push) kann man nur Integer bzw. Pointer
- Beim Löschen aus dem Stack (pop) wird der eingefügte Wert ignoriert. Es wird also nichts freigegeben.
Vorteile
- Die eingefügten Werte können alles sein: Integer, Pointer von Strings, Speicheradressen ect...
Nachteile:
- Speicherleckgefahr!
- Falls es Pointerwerte sind, muss der Benutzer den Stack immer leeren, und dabei jeden Wert freigeben
- Falls komplexere Gebilde zum Stack hinzugefügt werden, muss darauf geachtet werden, dass auch weitere Verweise freigegeben werden
=======================
Methode2:
- Einfügen (push) kann man nur Speicheradressen
- Beim Löschen aus dem Stack (pop) wird der eingefügte Wert als Speicheradresse interpretiert und der Speicher freigegeben
Vorteile:
- Falls die Speicherstellen keine Verweise zu weiteren Speicheradressen besitzen, braucht sich der Benutzer um nichts zu kümmern
Nachteile:
- Speicherleckgefahr!
- Siehe Vorteil, falls nicht, muss darauf geachtet werden, und seperat freigegeben werden
- Im Stack können keine einfachen Werte wie "1" hinzugefügt werden. Dazu muss immer ein Speicher adressiert werden, indem dann "1" hineingeschrieben wird
=======================
Methode3:
- OOP Gedanke
- Erstelle ein Interface Object, das eine Funktion 'free' besitzt
- Jedes eingefügte Element muss einer Structure/Interface angehören, die/das von Object erbt. Jedes Element besitzt also eine free()-Methode
- Beim Löschen aus dem Stack (pop) wird diese Funktion free() aufgerufen
Vorteile:
- Keine Speicherleckgefahr
- Es können in einem Stack Elemente vieler verschiedener "Klassen" hinzugefügt werden
Nachteile:
- Für jeden primitiven Datentyp muss es eine "Wrapper-Klasse" geben (Im Beispiel: Int)
- Overhead: Falls der Benutzer ein Element einer eigenen Structure hinzufügen will, muss er dafür Structure, Interface, eine New-Methode, und eine Free-Methode schreiben.
=======================
Methode4:
- Structure / Interface und die Funktionen vom Stack werden nicht nur einmal definiert, sondern mit einem Macro für jeden Typ, für den der Benutzer ein Stack braucht
Vorteile:
- Jede Art von Daten können im Stack gespeichert werden
- Falls die Elemente keine Verweise zu weiteren Speicheradressen besitzen, braucht sich der Benutzer um nichts zu kümmern
Nachteile:
- Speicherleckgefahr!
- Siehe Vorteil, falls nicht, muss darauf geachtet werden, und seperat freigegeben werden
- Overhead im kompilierten Code
- Autovervollständigung in der IDE funktioniert nicht
=======================
Meine Frage nun, welche ist die beste?
Falls jemand Fragen zu einer Methode hat, stellt sie bitte. Falls jemand vielleicht sogar noch eine weitere Methode kennt, stellt sie bitte vor.
Ich bedanke mich übrigens bei jedem, der es bis hier hin geschaft hat

lg Kevin