Pointer dereferenzieren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Pointer dereferenzieren

Beitrag von Mok »

Hallo.
Ist es möglich, dass man Pointer dereferenziert, also an den Ursprungswert zurückkommt (à la C)?
z.B.

Code: Alles auswählen

Define foo = 4
Define *bar = @foo
Define baz = ;Wert von foo, über bar ermitteln?
bei Strings gehts immerhin (siehe Hilfe), aber wahrscheinlich auch nur, weil es kein primitiver Datentyp ist.

Gruß, Mok.
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Pointer dereferenzieren

Beitrag von STARGÅTE »

natürlich geht das:

Code: Alles auswählen

Define Integer = 4
Define *Pointer.Integer = @Integer
Define Value = *Pointer\i
Debug Value
du kannst das sogar noch weiter treiben:

Code: Alles auswählen

Structure AllTypes
 StructureUnion
  *p.AllTypes
  i.i
 EndStructureUnion
EndStructure
Define Integer = 4
Define *Pointer.Integer = @Integer
Define *Pointer2.AllTypes = @*Pointer
Define *Pointer3.AllTypes = @*Pointer2
;                     *Pointer2
;                        | Integer
;                        |   |
Define Value = *Pointer3\p\p\i
;                          |
;                       *Pointer
Debug Value
Ich denke du siehst wie es gemeint ist ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Pointer dereferenzieren

Beitrag von Mok »

Ich hab das 1. Beispiel viel umständlicher gemacht... und scheinbar auch falsch :mrgreen:
Danke :)
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Pointer dereferenzieren

Beitrag von ts-soft »

Und die mehr Basic like Variante (die lahmste :mrgreen: )

Code: Alles auswählen

Define foo.i = 4
Define *bar = @foo
Define baz = PeekI(*bar)
Debug baz
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Pointer dereferenzieren

Beitrag von Josh »

was ich mir schon öfter überlegt habe, warum der pb-syntax nicht mehrere "*" zuläßt. vom programmablauf müßte pb ja gar nichts anderes tun als bis jetzt. bei apis kommt ja öfter ein pointer auf einen pointer vor und da wäre es übersichtlicher, wenn man im variablennamen ein "**" verwenden könnte. wie hier im beispiel von stargate

Code: Alles auswählen

Structure AllTypes
StructureUnion
  *p.AllTypes
  i.i
EndStructureUnion
EndStructure
Define Integer = 4
Define *Pointer.Integer = @Integer
Define **Pointer.AllTypes = @*Pointer
Define ***Pointer.AllTypes = @**Pointer
Define Value = ***Pointer\p\p\i
Debug Value
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Pointer dereferenzieren

Beitrag von STARGÅTE »

Das war auch für mich am anfang unverständlich, warum einerseits:

Code: Alles auswählen

*Test = 1
Test = 2
nterschiedliche Variablen sind.
Bei Structuren aber das * "einfach weggelassen wird" und es somit nicht möglich ist:

Code: Alles auswählen

Structure Uii
 *Test
 Test.i
EndStructure
Klar stört das vllt die Lesbarkeit wenn man dass sowas hätte:

Code: Alles auswählen

Uii.Uii\*Test = 2
aber "logischer" wäre es.

wegen den *** ... , jo wäre schön,
Aber derzeit kann man sich ja auch mit __ zufrieden geben:

Code: Alles auswählen

Define *Pointer.Integer = @Integer
Define *_Pointer.AllTypes = @*Pointer
Define *__Pointer.AllTypes = @*_Pointer
Es geht vermutlich nicht, weil das * genauso wir das $ bei Strings nicht im eigentlichen Sinne zum Variablennamen gehört, also kein zugeassenes Zeichen ist wie zb der Unterstrich.
wie ich ja schon mal zeigte, wie unsauber man code könnte:

Code: Alles auswählen

Structure _
 _.i
 __.i[5]
EndStructure

Procedure ____(_.i)
 ProcedureReturn _*4
EndProcedure

___._
___\_ = 1
___\__[2] = 3
___\__[1] = ___\_+___\__[2]
*____._ = @___

Debug ____(*____\__[1])
:allright:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Mok
BotHunter
Beiträge: 1484
Registriert: 26.12.2005 14:14
Computerausstattung: MSI GX780R
Intel Core i5-2410M
Nvidia GT 555M
Windows 7 Home Premium 64 bit
Wohnort:   

Re: Pointer dereferenzieren

Beitrag von Mok »

@STARGÅTE: Jetzt weiß ich, wie die Sprache BrainFuck entstanden ist :D
Win 7 Home Premium 64 bit | PureBasic 5.20 - x86 und x86-64 | Firefox [aktuelle stable-Version hier einfügen]
"Jeder macht irgendwann mal Fehler, darum gibt's auch Bleistifte mit Radiergummi." --Carl
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Pointer dereferenzieren

Beitrag von Josh »

STARGÅTE hat geschrieben:Es geht vermutlich nicht, weil das * genauso wir das $ bei Strings nicht im eigentlichen Sinne zum Variablennamen gehört, also kein zugeassenes Zeichen ist wie zb der Unterstrich.
ich habe jetzt zu wenig ahnung, was intern im kompilierten programm überbleibt, aber ich denke, vom ursprünglichen variablennamen bleibt ja gar nichts mehr über. vieleicht denke ich da jetzt ein wenig zu einfach, aber meine überlegung ist halt, dass pb bei der syntaxüberprüfung das "**" nur nicht anmeckern müsste.

Code: Alles auswählen

Structure Uii
*Test
Test.i
EndStructure
das ist ja schon ein bischen wirr, also sollte es bei einem möglichen "**" auch keinen abbruch mehr tun, wenn es bei einer structure noch ein bischen wirrer ist und auch nicht funktioniert. es wäre ja keiner gezwungen, ein "**" zu verwenden.

ich schreibs einfach mal in die wishlist, vieleicht lässt es sich ja mit geringen aufwand realisieren.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Pointer dereferenzieren

Beitrag von CSHW89 »

das problem ist, der assembler macht nicht mit.
assembler kennt halt keine * im variablennamen. purebasic übersetzt variablen folgendermaßen:

"variable" ist im assembler "v_variable"
"*variable" ist im assembler "p_variable"

ja gut, man könnte jetzt sagen "**variable" ist dann im assembler "pp_variable". aber naja, ein bissl unschön, find ich.

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Pointer dereferenzieren

Beitrag von mk-soft »

Ich finde wie es in PB ist voll logisch...

Code: Alles auswählen

; Pointer
Define *pValue, *ppValue
; Value
Define Value.i = 100

; Adresse von Value
*pValue = @Value

; Adresse von Pointer auf Adresse von Value
*ppValue = @*pValue

Debug Value
Debug PeekI(*pValue)
Debug PeekI(PeekI(*ppValue))
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten