Seite 1 von 3
Pointer dereferenzieren
Verfasst: 28.07.2010 21:13
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.
Re: Pointer dereferenzieren
Verfasst: 28.07.2010 21:25
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 ^^
Re: Pointer dereferenzieren
Verfasst: 28.07.2010 21:35
von Mok
Ich hab das 1. Beispiel viel umständlicher gemacht... und scheinbar auch falsch
Danke

Re: Pointer dereferenzieren
Verfasst: 28.07.2010 21:36
von ts-soft
Und die mehr Basic like Variante (die lahmste

)
Code: Alles auswählen
Define foo.i = 4
Define *bar = @foo
Define baz = PeekI(*bar)
Debug baz
Re: Pointer dereferenzieren
Verfasst: 28.07.2010 21:39
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
Re: Pointer dereferenzieren
Verfasst: 28.07.2010 21:52
von STARGÅTE
Das war auch für mich am anfang unverständlich, warum einerseits:
nterschiedliche Variablen sind.
Bei Structuren aber das * "einfach weggelassen wird" und es somit nicht möglich ist:
Klar stört das vllt die Lesbarkeit wenn man dass sowas hätte:
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])

Re: Pointer dereferenzieren
Verfasst: 28.07.2010 21:57
von Mok
@STARGÅTE: Jetzt weiß ich, wie die Sprache BrainFuck entstanden ist

Re: Pointer dereferenzieren
Verfasst: 28.07.2010 22:10
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.
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.
Re: Pointer dereferenzieren
Verfasst: 28.07.2010 23:04
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
Re: Pointer dereferenzieren
Verfasst: 29.07.2010 21:33
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))