Seite 1 von 2

Adresse einer benannten String-Konstanten

Verfasst: 20.05.2018 21:10
von Nino
Hallo zusammen!

Die Adresse einer literalen String-Konstanten kann man in PB ja schon länger ermitteln:

Code: Alles auswählen

*ptr = @"abc"
Ich hatte es so verstanden, dass das seit PB 5.50 auch mit benannten String-Konstanten geht, denn
History für PB 5.50 hat geschrieben:Added: #StringConstant$ syntax support, to get the address of a string constant


Wenn ich jetzt aber (unter Windows) mit PB 5.62 (egal ob x86 oder x64) folgenden Code ausführe

Code: Alles auswählen

#Text$ = "abc"
*ptr = @#Text$
dann meldet der Compiler den Fehler
Zeile 2: Konstante nicht gefunden: #.
Die Fehlermeldung ist ja selber kaputt ...

Weiß jemand, wie sich mit PB 5.62 die Adresse einer benannten String-Konstanten ermitteln lässt?

Re: Adresse einer benannten String-Konstanten

Verfasst: 20.05.2018 21:20
von RSBasic
Willkommen zurück. :)

Normalerweise würde beim Kompilieren folgendes passieren: Der Kompiler ersetzt alle Konstanten durch den jeweiligen Wert und der Code sieht am Ende so aus, bevor er assembliert wird:

Code: Alles auswählen

*ptr = @"abc"
Wie es scheint, wurde die Pointer-Verarbeitung bei Konstanten nicht berücksichtigt.

Alternative/Workaround:

Code: Alles auswählen

#Text$ = "abc"
Define Text$ = #Text$
*ptr = @Text$

Re: Adresse einer benannten String-Konstanten

Verfasst: 20.05.2018 21:29
von ts-soft
Ich hatte es so verstanden, dass das seit PB 5.50 auch mit benannten String-Konstanten geht
Es war so vorgesehen, wurde aber von Fred nicht umgesetzt, da es wohl noch andere Probleme gab!

Re: Adresse einer benannten String-Konstanten

Verfasst: 20.05.2018 22:10
von Mijikai
So gehts:

Code: Alles auswählen


#Text$ = "abc";<- first string constant will be _S1
Global dummy.s = #Text$;<- to make sure the constant is in the actual code!
Global *ptr = 0

!mov rax,_S1
!mov [p_ptr],rax

ShowMemoryViewer(*ptr,8)

Re: Adresse einer benannten String-Konstanten

Verfasst: 20.05.2018 22:15
von Nino
ts-soft hat geschrieben:
Ich hatte es so verstanden, dass das seit PB 5.50 auch mit benannten String-Konstanten geht
Es war so vorgesehen, wurde aber von Fred nicht umgesetzt, da es wohl noch andere Probleme gab!
Ahhh ... vielen Dank für die Information :!:
Ich sollte vielleicht lieber nicht so viel in der Hilfe lesen, wenn das am Ende gar nicht stimmt, was ich da finde. :mrgreen:
RSBasic hat geschrieben:Willkommen zurück. :)
Danke!
Hier immer so'n bisschen aus Spaß mitzulesen, dafür fehlt mir im Moment die Zeit. Aber es ist natürlich sehr wertvoll, wenn man weiß wo einem bei Problemen geholfen wird.
RSBasic hat geschrieben:Normalerweise würde beim Kompilieren folgendes passieren: Der Kompiler ersetzt alle Konstanten durch den jeweiligen Wert und der Code sieht am Ende so aus, bevor er assembliert wird:

Code: Alles auswählen

*ptr = @"abc"
Ja, ich weiß.
Inzwischen ist mir wieder eingefallen, dass Makros im Grunde auch nichts anderes machen als Suchen und Ersetzen.
Daher benutze ich jetzt statt einer benannten Konstante ein Makro (funktioniert prima!):

Code: Alles auswählen

Macro Text : "abc" : EndMacro
*ptr = @Text
Debug "*" + PeekS(*ptr) + "*"
Nochmal vielen Dank! :D :allright:

Re: Adresse einer benannten String-Konstanten

Verfasst: 21.05.2018 00:18
von Sicro
Siehe mein Bug-Report von 2016:
PB_5.50: @#StringConstant$ doesn't work

Re: Adresse einer benannten String-Konstanten

Verfasst: 22.05.2018 22:43
von Nino
Hatte den Bug-Report bei meiner Suche nicht gefunden.
Danke dafür, und für die Information!

Re: Adresse einer benannten String-Konstanten

Verfasst: 23.05.2018 15:38
von Josh
Hatte es auch schon ein wenig ironisch in 'Bugs - Documentation' versucht, aber irgendwer hat es dann nach 'General Discussion' verschoben :angry:

http://www.purebasic.fr/english/viewtop ... t=constant

Will wohl keiner, dass diese Verwirrung endlich mal entfernt wird :mrgreen:

Re: Adresse einer benannten String-Konstanten

Verfasst: 27.05.2018 11:21
von Muttonhead
...mich mal als Unwissender hier hineingehangen ...

Wozu ist ein Zeiger auf eine Konstante eigentlich gut?
Wenn eine definierte Konstante noch vor dem Komplilieren quasi dem Replacement "zum Opfer" fällt, worauf verweist dieser Zeiger denn eigentlich?

Mutton

Re: Adresse einer benannten String-Konstanten

Verfasst: 27.05.2018 12:24
von Josh
Muttonhead hat geschrieben:Wozu ist ein Zeiger auf eine Konstante eigentlich gut?
Wird für Api's benötigt. Geh natürlich auch mit einem Zeiger auf einen gleichlautenden String, wäre aber halt mit einem Zeiger auf die Konstante eleganter, wenn diese schon vorhanden ist.
Muttonhead hat geschrieben:Wenn eine definierte Konstante noch vor dem Komplilieren quasi dem Replacement "zum Opfer" fällt, worauf verweist dieser Zeiger denn eigentlich?
Z.B. auf das Replacement. Ist eigentlich egal wohin, muss nur ein Pointer sein, der auf einen gleichlautenden String zeigt.