Hier zusammenfassend einige wichtige Zitate aus dem Hilfe-Kapitel Zeiger und Speicherzugriff:
1. * ist Teil des Variablennamens!
2. Zeiger sind generell mit Strukturen verknüpftPureBasic Hilfe hat geschrieben:Anders als in C/C++ ist in PureBasic der * immer Teil des Variablennamens. Damit sind *ptr und ptr zwei verschiedene Variablen. ptr ist eine (reguläre) Variable zum Speichern eines Werts, *ptr ist eine andere Variable vom Typ Zeiger zum Speichern einer Adresse.
3. Zeiger mit einfachen Datentypen machen keinen SinnPureBasic Hilfe hat geschrieben:Ein Zeiger ist eine Variable, welche eine Speicheradresse beinhaltet und generell mit einer Struktur verknüpft wird.
4. Strings in StrukturenPureBasic Hilfe hat geschrieben:Zeiger und Speichergröße
Da Zeiger als Werte nur Adressen empfangen, ist die Speichergröße eines Zeigers der Platz, der das Speichern einer absoluten Adresse des Prozessors ermöglicht:
- Auf 32 Bit Prozessoren ist der Adressraum auf 32 Bit begrenzt, weshalb ein Zeiger 32 Bit (4 Bytes, wie ein 'Long') im Speicher verbraucht
- Auf neueren 64 Bit Prozessoren benötigt er 64 Bit (8 Bytes, wie ein 'Quad') im Speicher, weil die absolute Adresse in einem 64 Bit Bereich liegt.
Als eine Konsequenz daraus hängt der Typ des Zeigers vom CPU-Adressmodus ab ('Long' auf 32 Bit CPU und 'Quad' auf 64 Bit zum Beispiel), so ist ein Zeiger eine Variable vom Typ Zeiger.
Daraus resultiert, dass das Zuweisen eines Typs zu einem Zeiger (*Pointer.l , *Pointer.b …) keinen Sinn macht.
Daraus folgt, dass *Pointer.String eigentlich ein Zeiger auf einen Zeiger eines Strings ist! Das wird auch durch das Beispiel aus der Hilfe deutlich gemacht:PureBasic Hilfe hat geschrieben:Alle Variablen haben eine permanente Größe im Speicher (2 Byte für Word, 4 Bytes für Long, etc.), außer für Strings, da sich deren Länge verändern kann. Aus diesem Grund werden String-Variablen auch auf eine andere Weise gehandhabt wie sonstige Variablen.
Daher speichert eine Struktur-Feld, welches auf einen String verweist, nur die Speicheradresse des Strings anstelle des Strings selbst: ein solches Struktur-Feld ist ein Zeiger auf einen String.
Code: Alles auswählen
Text$ = "Hello"
*Text = @Text$ ; *Text speichert die Adresse des Strings im Speicher
*Pointer.String = @*Text ; *Pointer verweist auf *Text
Debug *Pointer\s ; Darstellen des Strings, welcher sich an der in *Pointer gespeicherten Adresse befindet (z.B. @Text$)
Das ist etwas, das mit großer Vorsicht zu machen ist! Funktionen Wie PeekS() und PokeS() gehören zu den Memory-Funktion von PureBasic und benutzen nicht das interne String-Management von PureBasic, um Strings zu lesen bzw. Strings zu schreiben. Daher besteht zumindest bei PokeS() die Gefahr, dass man über den vom String-Management reservierten String-Speicher hinaus in einen nicht zulässigen Speicherbereich schreibt.
==> Wer also PureBasic-Strings über Funktionen manipuliert, die nicht das interne String-Management verwenden, muss genau wissen, was er tut!
6. Weitere Informationen
Hier noch zusätzliche Informationen, die ich an andere Stelle dazu geschrieben habe:
- http://purebasic.fr/german/viewtopic.ph ... 07#p290707
- http://purebasic.fr/german/viewtopic.ph ... 86#p290686
- http://purebasic.fr/german/viewtopic.ph ... 96#p290696
Ich hoffe, dass das einiges von dem zusammenfasst und auch mit der PureBasic-Dokumentation belegt, was in letzter Zeit so heftig diskutiert wurde!
lg, guido
Moved to FAQ & Tutorials by NicTheQuick