Aktuelle Zeit: 24.08.2019 11:12

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 22.05.2011 11:27 
Offline
Benutzeravatar

Registriert: 29.08.2004 13:29
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:
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

_________________
Windows 10 / Windows 7
PB Last Final / Last Beta Testing


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 22.05.2011 16:16 
Offline
Benutzeravatar

Registriert: 25.03.2008 15:07
Wohnort: 's Ländle
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:
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:
Text$ = "Hello"
*Text = @Text$
*Pointer.String = @*Text
Debug *Pointer\s

und nun das ganze mit "Fixed String"
Code:
Structure FixedString
  s.s{20}
EndStructure

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

_________________
PureBasic 5.70b1 x86/x64 | Windows 7 (x64) | Windows XP (x86)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 23.05.2011 06:54 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:59
Und das ganze jetzt auch in der Online Hilfe. Das wäre perfekt. Hier im Forum wird es sicher öfters nicht gleich gefunden.

_________________
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 14.02.2012 16:32 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
: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

_________________
PureBasic 5.70 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
"Die Jugend von heute mit ihren Ballerspielen, hocken nur in der Bude - wir haben früher die Leute noch draußen erschossen!"
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 14.02.2012 16:56 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 14.02.2012 17:28 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
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.

_________________
PureBasic 5.70 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
"Die Jugend von heute mit ihren Ballerspielen, hocken nur in der Bude - wir haben früher die Leute noch draußen erschossen!"
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 14.02.2012 17:53 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 14.02.2012 18:06 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
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

_________________
PureBasic 5.70 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
"Die Jugend von heute mit ihren Ballerspielen, hocken nur in der Bude - wir haben früher die Leute noch draußen erschossen!"
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 14.02.2012 20:42 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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.

Zitat:
Ein Zeiger ist eine Variable, welche eine Speicheradresse beinhaltet
Akzuelles PureBasic Referenz-Handbuch

Zitat:
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


Zitat:
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

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Pointer, einfache Datentypen, Strings, ...
BeitragVerfasst: 14.02.2012 21:06 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
: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

_________________
PureBasic 5.70 | SpiderBasic 2.21 | Windows 10 Pro (x64) | Linux Mint 19.2 (x64)
"Die Jugend von heute mit ihren Ballerspielen, hocken nur in der Bude - wir haben früher die Leute noch draußen erschossen!"
Bild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye