Adresse einer benannten String-Konstanten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Adresse einer benannten String-Konstanten

Beitrag 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?
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Adresse einer benannten String-Konstanten

Beitrag 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$
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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: Adresse einer benannten String-Konstanten

Beitrag 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!
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
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Adresse einer benannten String-Konstanten

Beitrag 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)
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Adresse einer benannten String-Konstanten

Beitrag 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:
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Adresse einer benannten String-Konstanten

Beitrag von Sicro »

Siehe mein Bug-Report von 2016:
PB_5.50: @#StringConstant$ doesn't work
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Adresse einer benannten String-Konstanten

Beitrag von Nino »

Hatte den Bug-Report bei meiner Suche nicht gefunden.
Danke dafür, und für die Information!
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Adresse einer benannten String-Konstanten

Beitrag 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:
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Re: Adresse einer benannten String-Konstanten

Beitrag 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
PureBasic 5.62 (Windows 10 Home - x64) | i7 7700HQ | 32GB | HD Graphics 630 / GeForce GTX 1060 Max-Q
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Adresse einer benannten String-Konstanten

Beitrag 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.
Antworten