Aktuelle Zeit: 21.02.2018 02:54

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Anfängerfrage zu Variablen
BeitragVerfasst: 14.02.2018 11:42 
Offline

Registriert: 14.02.2018 11:32
Wohnort: Fricktal, Schweiz
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfängerfrage zu Variablen
BeitragVerfasst: 14.02.2018 11:47 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
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.

_________________
BildBildBildBildBild
Bild | EnableExplicit ist kostenlos und vermeidet Fehler | Gib Goto keine Chance | Schneller als die Telekom erlaubt | Avira? Nein Danke
WinAPI forever | Bei Problemen bitte Beispielcode posten | Mit Adblock werbefrei, schneller und sicherer surfen | brain.exe ist der beste Schutz | Userlibrary ohne Source = NoGo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfängerfrage zu Variablen
BeitragVerfasst: 14.02.2018 12:07 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
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.

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Creality 3D CR-10 Review und erste Druckergebnisse
Ubuntu Gnome 16.04.3 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfängerfrage zu Variablen
BeitragVerfasst: 14.02.2018 17:46 
Offline
Benutzeravatar

Registriert: 19.10.2006 12:51
Vielleicht nochmal zur Erklärung.

Es gibt grundsätzlich zwei Arten von Variablen.

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

Code:
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:
*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.

_________________
return;


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

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 7 Gäste


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