Adresse einer benannten String-Konstanten

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Re: Adresse einer benannten String-Konstanten

Beitrag von Muttonhead »

so ganz hab ichs noch nicht verstanden. Dann ist das so.
Es geht mir mehr um das Verständnis über Konstanten im allgemeinen... Also eher offtopic.

Trotzdem nochmal nur mal zwei Szenarien:
Angenommen ich definiere eine Konstante in meinem Code

Code: Alles auswählen

#foo=3 
und würde diese Konstante, genauer deren Bezeichner, im Code an 10 Stellen benutzen...

Eine zweite Version des Codes enthält auch oben genannte Definition der Konstante, benutzt aber an den selben 10 Stellen den Wert 3.

Was also eh noch vor dem Kompilieren passieren würde
Entsteht das "gleiche" Programm?

Wenn ich es richtig verstanden habe, "schleppt" also das kompilierte Programm, die Binery oder Execute sehrwohl einen resevierten Speicherbereich für eine Konstante mit sich herum, obwohl diese dann eigentlich garnicht mehr benutzt wird.
Nur so kann ich es mir erklären, dass man auf Konstanten referenzieren kann

Ich hoffe man konnte meinen schrägen Gedanken irgendwie folgen... :/

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 »

Ja, es entsteht das 'gleiche' Programm.

Vielleicht einfacher vorzustellen bei einer Programmiersprache mit einem 'echten' Preprozessor. Da wird der gesamte Sourcecode durchlaufen und folgendes würde passieren:
  • eine Zeile wo eine Konstante definiert wird, fliegt komplett raus
  • jedes vorkommen der Konstante wird dann durch den Wert ersetzt
Wenn jetzt der richtige Compiler kommt, dann weiß der von der Konstanten gar nichts mehr, da diese im Sourcecode gar nicht mehr vor kommt. Da wird nichts mitgeschleppt.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Adresse einer benannten String-Konstanten

Beitrag von Sicro »

Beim Ausführen eines Programms wird die Programmdatei teilweise in den Arbeitsspeicher (RAM) geladen.
Jeder konstante String (innerhalb von Anführungszeichen oder definiert über eine Konstante) ist somit auch im Arbeitsspeicher und hat deshalb eine Speicheradresse.

Code: Alles auswählen

; Gebe Speicheradresse vom konstantem String aus"
Debug @"Das ist ein konstanter String"
Debug @"TEST TEST TEST"
Debug @"Das ist ein konstanter String"
Debug @"TEST TEST TEST"
Wie Josh geschrieben hat, wird die Konstante beim Kompilieren überall durch den Konstanten-Wert ersetzt. Die Konstante existiert also später nicht mehr. Überall steht nur noch der Konstanten-Wert.
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
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Re: Adresse einer benannten String-Konstanten

Beitrag von Muttonhead »

Ok... Dann ist das Definieren einer Konstante "lediglich" Syntaxfutter, was nicht bewertend oder abwertend klingen soll.
Da eine Konstante praktisch für den Compiler nicht existiert, sollte und darf eine Referenz darauf nicht funktionieren...

Code: Alles auswählen

#foo=3
*bar = @#foo
  
tut es auch nicht, egal ob nun numerisch oder String.

Darum wundert mich eigentlich das Bemühen im Thread für entsprechende Workarounds. Die liefern sicherlich ne Adresse, aber bestimmt nicht die der Konstante.

sei es drum, wieder was gelernt :)

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:Da eine Konstante praktisch für den Compiler nicht existiert, sollte und darf eine Referenz darauf nicht funktionieren...
Nicht ganz richtig:

Code: Alles auswählen

#foo$="abc"
*bar = @#foo
wird ersetzt durch

Code: Alles auswählen

*bar = @"abc"
und dann sollte es funktionieren.
Benutzeravatar
Muttonhead
Beiträge: 20
Registriert: 25.06.2017 14:06
Computerausstattung: I7

Re: Adresse einer benannten String-Konstanten

Beitrag von Muttonhead »

Hm.... cool :)

aber ich denke ein

Code: Alles auswählen

*bar = @"abc"
kann man wiederum durch ein

Code: Alles auswählen

foo.s="abc" 
*bar=@foo
ersetzen.
Ich denke mal in beiden Fällen passiert ähnliches: Allozieren des Speichers, was reinschreiben... Vermutlich wird dies nicht ein "PB-String" sein.
Aber zumindest näher an einer Variablen denn einer Konstanten. Zumindest wird zur Laufzeit des Programmes etwas im Speicher erzeugt.
Und an dieser Konstante @"abc" lässt sich sehr wohl herum manipulieren.

Ok, belassen wir es einfach dabei. War jedenfalls sehr interessant
Auch ich bedanke mich mal artig :)

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:Und an dieser Konstante @"abc" lässt sich sehr wohl herum manipulieren.
In Pb lassen sich sogar Literale manipulieren :D

Code: Alles auswählen

#xx = "xx"
PokeS (@"xx", "yy")

Debug "xx"
Debug #xx
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Adresse einer benannten String-Konstanten

Beitrag von ccode_new »

Ja gaaanz toll!

So viele tolle Pointer-Spielereien.

Alles aber total logisch.

Wenn man jetzt noch mit Makros anfängt, entwickelt sich hier eine der grausamsten Arten zu programmieren.

Dann muss man nur noch ohne Zeilenumbrüche [nur mit : ] und mit Sprungmarken programmieren und man hat bald einen so genial unlesbaren Programmcode erschaffen auf dem man sehr stolz sein kann.

Wer liefert den grausamsten Code ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten