Seite 1 von 1

Strings aneinanderhängen

Verfasst: 26.08.2006 14:19
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)

Verfasst: 26.08.2006 14:24
von ts-soft
>> Aber was ist, wenn der Platz da schon benutzt wird?
Dann wird ein neuer Platz reserviert und der alte freigegeben

Verfasst: 26.08.2006 14:27
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?

Verfasst: 26.08.2006 14:36
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

Verfasst: 26.08.2006 14:55
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.

Verfasst: 26.08.2006 14:58
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

Verfasst: 26.08.2006 15:01
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:

Verfasst: 26.08.2006 15:04
von DarkDragon
Nein, da wird schon freier Speicherplatz gesucht ;-) .

Verfasst: 26.08.2006 15:10
von obbba
Denkfehler... :roll:
Danke. Ich hab's kapiert.