Anfängerfrage zu Variablen

Anfängerfragen zum Programmieren mit PureBasic.
tebse
Beiträge: 3
Registriert: 14.02.2018 11:32
Computerausstattung: HP Elitebook 8560p mit Windows 7 Enterprise
Diverse Server im Keller.
Wohnort: Fricktal, Schweiz

Anfängerfrage zu Variablen

Beitrag von tebse »

Guten Morgen,

ich bin Einsteiger und stosse bei einem BeispielCode, an dem ich mich entlang hangle, auf folgenden Fehler wärend des Compilierens. Mein Bespiel scheint mit Version 5.1 erstellt worden zu sein, ich arbeite mit Version 5.62 für Windows.

"Native Typen können nicht mit Zeigern verwendet werden".

Eine Lösung dazu habe ich bereits hier im Forum gefunden. Dennoch würde ich das ganze gerne besser verstehen:
Ursache ist eine Variable bzw. deren deklaration. Die frageliche Variable heisst *Name.i
Abhilfe schaffte die Umwandlung der Variable von

*Name.i in *Name
bzw.
*Name.i in Name.i

Beide Varianten funktionieren und die Fehlermeldung erscheint nicht mehr. Dennoch habe ich eine andere Frage: Gemäss Hilfe Datei darf eine Variable keine Operatoren (+, - ...) enthalten. Was bedeutet "*" am Beginn eines Variablennamens? Kann mich jemand auf die zugehörige Hilfe lotsen?

Besten Dank und beste Grüsse
tebse
--
PureBasic 5.62, 64 und 32 bit
Window 7/64 bit Ultimate
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Anfängerfrage zu Variablen

Beitrag von RSBasic »

Herzlich Willkommen im Forum. :allright:

* bedeutet, dass es ein Pointer/Zeiger ist und zeigt auf eine Speicheradresse und enthält keinen Inhalt wie z.B. bei normalen Variablen.
Deshalb ist die Datentypdefinition nicht erforderlich.

Weitere Informationen findest du in der Hilfe unter "Zeiger und Speicherzugriff" oder einfach unter "Index" nach "Pointer" suchen.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Anfängerfrage zu Variablen

Beitrag von NicTheQuick »

Wenn du einem Pointer keine Struktur anhängst, dann funktioniert er eigentlich genauso wie eine Integervariable, d.h. Name.i ist genau das selbe wie *Name. Ich nehme an, dass Name vermutlich einen Text darstellen soll. Da man den nicht in eine Integervariable schreiben kann, ist es vermutlich tatsächlich als Pointer gedacht. Aber wahrscheinlich macht es in deinem Fall tatsächlich keinen Unterschied.
Bild
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Anfängerfrage zu Variablen

Beitrag von DarkSoul »

Vielleicht nochmal zur Erklärung.

Es gibt grundsätzlich zwei Arten von Variablen.

Die erste sind die ganz normalen, die einen Wert enthalten:

Code: Alles auswählen

bla.l = 12345
blablabla.s = "Hallo"
Debug bla  ;gibt "12345" aus.
Debug blabla  ;gibt "Hallo" aus.
Daneben gibt es noch die Zeiger bzw. Pointer, die statt dem eigentlichen Wert die Adresse zum Speicher enthalten, wo der Inhalt gespeichert ist. Da ist sozusagen die "Platznummer" drin. Daher sind diese immer Integer, damit die Speicheradresse hineinpasst. Diese haben, um Vewechselungen mit normalen Variablen (was oft zu Programmierfehlern und Abstürzen führt.) zu vermeiden, ein "*" am Anfang. Eine normale Integer-Variable könnte man dafür genauso gut verwenden.

Solch ein Zeiger kann auf einen Ascii-codierten String im Speicher zeigen, der das Wort "Hallo" enthält:

Code: Alles auswählen

*bla = AllocateMemory(6) ;Wir bitten das Betriebssystem darum, uns etwas Speicher zu reservieren und die Adresse zurückzugeben, die wir in einem Zeiger speichern, um darauf zugreifen zu können. Das Wort "Hallo" hat 5 Buchstaben. Für die sog. "Nullterminierung" (die Markierung, wo ein String zuende ist) wird noch ein weiteres Byte benötigt. Deshalb 6 Bytes.
If *bla <> 0 ;Prüfen, ob wir tatsächlich den gewünschten Speicher bekommen haben.
  PokeS(*bla, "Hallo", #PB_Ascii)  ;Wir schreiben "Hallo" in den Speicher, wofür der Zeiger benötigt wird, damit PokeS() weiß, wo er dies hinschreiben soll. Die Nullterminierung wird automatisch angefügt.
EndIf
Debug PeekS(*bla, #PB_Ascii) ;PeekS() liest den String an der Speicheradresse, wo *bla hinzeigt, so dasst "Hallo" ausgegeben wird.
Debug *bla ;gibt die Speicheradresse aus
FreeMemory(*bla) : *bla = 0 ;Wenn nicht mehr benötigt, den Speicher wieder freigeben und den Zeiger vorsichtshalber auf 0 setzen, damit kein ungültiger Zeiger zurückbleibt. Sofern nichts anderes vorgegeben, gibt der Prozess den Speicher frei, der ihn auch angefordert hat.
Jetzt haben wir *bla, welches ein Zeiger ist, der auf den String "Hallo" zeigt. Dieser kann an einen anderen Befehl übergeben werden, damit dieser mit dem Speicher arbeiten kann. Beachte, dass *bla immer ein Integer ist, auch wenn im Speicher ein String ist.

Mit Zeigern hat man oft viel mehr Möglichkeiten, die man mit normalen Variablen nicht hat. Spätestens, wenn externe Bibliotheken im Spiel sind, die nicht in PB geschrieben worden sind, werden Zeiger unausweichlich.
Bild
Antworten