Adresse einer Konstanten

Anfängerfragen zum Programmieren mit PureBasic.
Little John

Adresse einer Konstanten

Beitrag von Little John »

Hallo zusammen,

kann man die Adresse einer Konstanten wie z.B.

Code: Alles auswählen

#Blah = "Hallo"
ermitteln? Wenn ja, wie? Mit @ wie bei Variablen scheint es nicht zu gehen.

Gruß, Little John
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Das geht gar nicht, weil Konstanten keine Adressen haben.
Während des Kompilierens werden einfach alle festgelegten Konstanten durch
ihren Wert im Code ersetzt.
Du kannst ja auch nicht die Adresse von der Zahl 4 ermitteln.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Der Bug wurde schon im englischen Forum vor kurzem diskutiert soweit ich noch weiß.

Code: Alles auswählen

#Konstante = "Hallo"

Debug @"Hallo"
; Debug @#Konstante
Beides sind Konstanten. Wieso geht das eine nicht, aber das andere?

Normalerweise würde aus Debug @#Konstante doch auch nur Debug @"Hallo" werden ;-) .

Und Konstanten haben sehr wohl eine Adresse, sonst ginge ja Debug @"Hallo" auch nicht. Die werden nur alle in einer section '.data' blah blah gespeichert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Eine Stringkonstante ist anders als andere Konstanten, weil ein String natürlich immer eine Adresse haben muss, denn das ist ja kein primitiver Datentyp. Bei einer Zahlkonstante wird aber nur der Wert Precompilermäßig ersetzt.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Zaphod hat geschrieben:Eine Stringkonstante ist anders als andere Konstanten, weil ein String natürlich immer eine Adresse haben muss, denn das ist ja kein primitiver Datentyp. Bei einer Zahlkonstante wird aber nur der Wert Precompilermäßig ersetzt.
Ja, aber #Konstante = "Hallo" ist immernoch eine String Konstante (Bei Zahlen geb ich dir recht). Wieso geht dann aber nicht @#Konstante wenn #Konstante = "Hallo"?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Little John

Beitrag von Little John »

Meine Frage ist mehr als beantwortet. Danke!

Gruß, Little John
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Na weil #MEIN_STRING ="Hallo" natürlich eine Adresse haben muss, ein String ist ja kein String sondern ein Pointer auf eine Speicherbereich von bestimmter länge.

#MEINE_LONGKONSTANTE = 4711 hat keine Adresse, weil das nach der Ersetzung einfach eine Zahl ist. Ich vermute (ich weiß es nicht) das Zahlkonstanten in PB nicht wie schreibgeschützte Variable wie zb in Java gespeichert sind, sondern wie Zahlliterale die du auch so in deinen Quelltext schreibst. Die haben dann ja nur eine Position in der Executable, aber keinen Bezeichner den man einfach so dereferenzieren kann.

Das wäre also genauso sinnvoll wie die Adresse von "5".
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

@DarkDragon, Zaphod:
Warum redet ihr aneinander vorbei? Ihr meint doch beide das selbe...?
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Zaphod hat geschrieben:Na weil #MEIN_STRING ="Hallo" natürlich eine Adresse haben muss
Eben das sag ich doch. Nur leider geht ja @#MEIN_STRING nicht, @"Hallo" aber schon!

@#MEIN_STRING (Wenn #MEIN_STRING = "Ein String" wie du sagst) führt zu einem Syntaxerror, @"Hallo" aber nicht.

#MEINE_LONGKONSTANTE = 4711 <- Da ist es mir doch klar warum es keine Adresse davon geben kann (Davon rede ich doch auch nicht, hab ich schon oben erwähnt). Aber bei #MEIN_STRING = "Ein String" muss es eine geben.

@NicTheQuick: Jo. :?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

Jetzt kapier ich was du meinst...
Antworten