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 :mrgreen:
Danke :)

Re: Pointer dereferenzieren

Verfasst: 28.07.2010 21:36
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

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:

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:

Re: Pointer dereferenzieren

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

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.

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.

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))