Strings aneinanderhängen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
obbba
Beiträge: 53
Registriert: 06.02.2006 17:33

Strings aneinanderhängen

Beitrag von obbba »

Ich weiß ja wie das geht:

Code: Alles auswählen

string1.s="hallo "
string2.s="welt"

string1=string1+string2
Aber wie sieht das im Arbeitsspeicher aus?

Meine Vorstellung:
In "string1" wird eigentlich nur die Adresse des ersten Bustaben gespeichert und es werden im Arbeitspeicher 7 Bytes gesucht, die noch nicht benutzt werden und da dann in die ersten 6 der jeweilige ASCII-Code für den jeweiligen Buchstaben reingeschrieben und in den letzten eine 0.
Wenn da jetzt der string2 drangehängt wird, wird die 0 durch ein 'w' ersetzt und der Rest in die Bytes danach reingeschrieben.

Aber was ist, wenn der Platz da schon benutzt wird?
[23056][23057][23058][23059][23060][23061][23062][23063]
'h'-------'a'---------'l'--------'l'------'o'-------' '------'w'----(hier steht schon was-das müsste überschrieben werden)
PureBasic v3.94 (Windows - x86) (Demo)
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

Beitrag von ts-soft »

>> Aber was ist, wenn der Platz da schon benutzt wird?
Dann wird ein neuer Platz reserviert und der alte freigegeben
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
obbba
Beiträge: 53
Registriert: 06.02.2006 17:33

Beitrag von obbba »

Kann das irgendwie Probleme geben, wenn man mit zeigern arbeitet?

Z.B.: Wenn jetzt ein zeiger auf [23063] (in meinem Beispiel) zeigt, oder würde der dann auch umgeändert?
PureBasic v3.94 (Windows - x86) (Demo)
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

Beitrag von ts-soft »

Du verwendest ja nicht den Wert, sondern die Adresse der Variablen (Pointer, Zeiger).

Code: Alles auswählen

a.s = "Hallo"
b.l = @a
a.s + ", PureBasic Rulez"
Debug b ;adresse davor
Debug @a ;adresse danach
Debug a.s
Der Zeiger wird sich wahrscheinlich geändert haben, aber @a stimmt
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
obbba
Beiträge: 53
Registriert: 06.02.2006 17:33

Beitrag von obbba »

Ist zwar jetzt Erbsenzählerei, aber:
Debugger hat geschrieben:8724112
8724128
Hallo, PureBasic Rulez
Wenn es aber noch einen "*c" gegeben hätte und der zufälligerweise auf 8724128 gezeigt hätte und ich hätte in dem Byte z.B. das Alter meiner Mutter gespeichert, also:

Code: Alles auswählen

*c=AllocateMemory(1)
AlterMutter.b=45
PokeB(*c,AlterMutter)
a.s = "Hallo" 
b.l = @a 
a.s + ", PureBasic Rulez" 
Debug b ;adresse davor 
Debug @a ;adresse danach 
Debug a.s
Debug "deine Mutter ist "+Str(PeekB(*c))+" Jahre alt."
Und jetzt wäre meine Mutter asc("H") Jahre alt, weil ja in 8724128 der ASCII-Code von dem H stehen würde.
PureBasic v3.94 (Windows - x86) (Demo)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

irgendwie verwechselst du da was...

> Wenn es aber noch einen "*c" gegeben hätte und der zufälligerweise auf 8724128 gezeigt hätte

dann wäre der dort geblieben, und der neue *a hätte noch später begonnen.

Code: Alles auswählen

a.s = "Hallo" 
b.l = @a
c.b = 45 
a.s + ", PureBasic Rulez" 
Debug b ;adresse davor 
Debug @a ;adresse danach 
Debug @b ;adresse des pointer-zwischenspeichers
Debug @c ;adresse des bytes mit dem inhalt 45
Debug a.s
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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

Beitrag von ts-soft »

>> Wenn es aber noch einen "*c" gegeben hätte und der zufälligerweise auf 8724128 gezeigt hätte
Der kann nicht zufälligerweise auf dieselbe Adresse verweisen. Wenn es so
sein sollte, haste nen Fehler gemacht oder einen PB-Bug entdeckt, wobei das
erstere Wahrscheinlicher ist :wink:
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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Nein, da wird schon freier Speicherplatz gesucht ;-) .
Benutzeravatar
obbba
Beiträge: 53
Registriert: 06.02.2006 17:33

Beitrag von obbba »

Denkfehler... :roll:
Danke. Ich hab's kapiert.
PureBasic v3.94 (Windows - x86) (Demo)
Antworten