Seite 1 von 1

Pointer, einfache Datentypen, Strings, ...

Verfasst: 22.05.2011 11:27
von helpy
Da die Themen, wo ich das eigentlich schreiben wollte, gesperrt sind, schreibe ich diese Information nochmal hier in die Fragen/Allgemeines Abteilung dieses Forums.

Hier zusammenfassend einige wichtige Zitate aus dem Hilfe-Kapitel Zeiger und Speicherzugriff:

1. * ist Teil des Variablennamens!
PureBasic 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.
2. Zeiger sind generell mit Strukturen verknüpft
PureBasic Hilfe hat geschrieben:Ein Zeiger ist eine Variable, welche eine Speicheradresse beinhaltet und generell mit einer Struktur verknüpft wird.
3. Zeiger mit einfachen Datentypen machen keinen Sinn
PureBasic 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.
4. Strings in Strukturen
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.
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:

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$)
5. Manipulation von PureBasic-Strings über deren Zeiger
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:
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

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 22.05.2011 16:16
von Regenduft
Sehr schön zusammengefasst! :allright:

Nur eins fehlt mir: fixe Strings!


Fixe Strings haben anders als "normale" Strings eine permantente Größe im Speicher:

Code: Alles auswählen

Define FixedString.s{3}
Debug SizeOf(FixedString)
; Rückgabe bei ASCII = 3
; Rückgabe bei Unicode = 6
Daraus folgt, dass man bei Fixed Strings kein "Zeiger auf einen Zeiger" Problem hat.

nochmal das Original mit "normalem" String

Code: Alles auswählen

Text$ = "Hello"
*Text = @Text$
*Pointer.String = @*Text
Debug *Pointer\s
und nun das ganze mit "Fixed String"

Code: Alles auswählen

Structure FixedString
  s.s{20}
EndStructure

Text$ = "Hello"
*Pointer.FixedString = @Text$
Debug *Pointer\s

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 23.05.2011 06:54
von DrShrek
Und das ganze jetzt auch in der Online Hilfe. Das wäre perfekt. Hier im Forum wird es sicher öfters nicht gleich gefunden.

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 14.02.2012 16:32
von ts-soft
:allright:

Das einzige was mich ein bissel stört ist die Bezeichnung: Variable für einen Pointer.
Ein Pointer ist keine Variable, er kann aber auf eine Zeigen. Es ist ein eigener Typ!
Wikepedia - Zeiger (Informatik) hat geschrieben: Mit Zeiger (auch engl. Pointer) wird in der Informatik ein spezieller Wert bezeichnet,
dessen Bedeutung eine Speicheradresse ist. An dieser Adresse können entweder Daten,
wie Variablen oder Objekte, aber auch Programmcode, stehen. Durch Dereferenzierung
des Zeigers ist es möglich, auf die Daten oder den Code zuzugreifen.
http://de.wikipedia.org/wiki/Zeiger_%28Informatik%29

yust my 2 korinthen

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 14.02.2012 16:56
von Nino
ts-soft hat geschrieben:Das einzige was mich ein bissel stört ist die Bezeichnung: Variable für einen Pointer.
Ein Pointer ist keine Variable, er kann aber auf eine Zeigen. Es ist ein eigener Typ!
Ein Pointer ist schon eine Variable. Und ja, er ist ein eigener Variablentyp.
Ein Pointer ist eine Variable, deren Wert eine Speicheradresse ist (z.B. die Adresse einer anderen Variablen [die auch ein Pointer sein kann :)] oder z.B. die Adresse von Programmcode).
Auch wenn der Wert eines Pointers definitionsgemäß nicht irgendwas sein kann, sondern immer eine Adresse ist, so bleibt er trotzdem eine Variable.

Grüße, Nino

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 14.02.2012 17:28
von ts-soft
Der Wert einer Variable wird im Speicher gespeichert!
Ein Zeiger wird nirgends gespeichert, er wird direkt genutzt!
Ein Zeiger oder Pointer ist genau so wenig eine Variable, wie eine Konstante eine Variable ist.

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 14.02.2012 17:53
von Nino
ts-soft hat geschrieben:Der Wert einer Variable wird im Speicher gespeichert!
Ein Zeiger wird nirgends gespeichert, er wird direkt genutzt!
:?:

Ich zitiere mal aus Deinem eigenen Wikipedia-Zitat:
ts-soft hat geschrieben:
Wikepedia - Zeiger (Informatik) hat geschrieben: Mit Zeiger (auch engl. Pointer) wird in der Informatik ein spezieller Wert bezeichnet,
dessen Bedeutung eine Speicheradresse ist.
Wie soll denn wohl ein Programm überhaupt mit diesen Werten arbeiten, wenn sie nirgends gespeichert sind?
Wieso belegen dann 32-Bit-Pointer je 4 Byte im Arbeitsspeicher, und 64-Bit-Pointer je 8 Byte im Arbeitsspeicher, wenn sie nirgends gespeichert sind?
ts-soft hat geschrieben:Ein Zeiger oder Pointer ist genau so wenig eine Variable, wie eine Konstante eine Variable ist.
Ein Pointer ist keine Konstante, da sein Wert sich zur Laufzeit eines Programms ändern kann. Platzhalter (z.B. im Arbeitsspeicher eines Computers) deren Werte veränderbar ("variabel") sind, nennt man "Variablen".

Grüße, Nino

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 14.02.2012 18:06
von ts-soft
Eine Variable hat eine Speicheradresse, in der sich der Inhalt befindet. Ein Pointer ist eine Speicheradresse.
Ein nativer Compiler, wie in PureBasic, benutzt diese Adresse direkt und speichert sie nirgends ab.
Es mag ähnlich sein, ist aber nicht gleich.

Gruß
Thomas

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 14.02.2012 20:42
von Nino
ts-soft hat geschrieben:Es mag ähnlich sein, ist aber nicht gleich.
Das spielt keine Rolle. Beispielsweise sind Integer-Variablen auch anders in PB implementiert als String-Variablen. Trotzem sind beides Variablen; es handelt sich um verschiedene Variablen-Typen. Pointer sind wiederum ein anderer Variablen-Typ. Selbstgemachte Begriffsdefinitionen öffentich zu verwenden ergibt einfach keinen Sinn.
Ein Zeiger ist eine Variable, welche eine Speicheradresse beinhaltet
Akzuelles PureBasic Referenz-Handbuch
Ein Zeiger ist eine Variable, in der sich die Adresse eines Datenobjektes oder einer Funktion befindet.
Louis, Dirk (1998):
C und C++: Programmierung und Referenz.
Haar bei München: Markt & Technik Verlag, S. 67

Eine Variable vom Datentyp "Zeiger" kann als Werte Bezeichner annehmen
[...]
In einer Assembler-Sprache sind die Bezeicher der Variablen Adressen des Speichers, sie stehen daher dem Programmierer in Form von Zahlen zur Verfügung.
Claus, Volker; Schwill, Andreas (2006):
Duden Informatik A-Z. Fachlexikon für Studium, Ausbildung und Beruf.
4. Aufl. Mannheim: Dudenverlag, S. 742


Grüße, Nino

Re: Pointer, einfache Datentypen, Strings, ...

Verfasst: 14.02.2012 21:06
von ts-soft
:allright: Danke für Deine Mühe,
trotzdem werde ich einen Pointer nicht mit einer Variable gleichsetzen, eher mit einer Sprungmarke.
Es wird aber tatsächlich oft so genutzt, dann belassen wir es erst mal dabei.

Gruß
Thomas