Seite 1 von 1

Adresse eines String ist null

Verfasst: 22.02.2011 17:35
von hjbremer
Ich finde folgendes ganz schön doof

die Adresse einer Stringvariablen ist null, wenn dem String noch kein Wert zugewiesen wurde, im Gegensatz zu Integervariablen etc.

Code: Alles auswählen

Define a.i
Define t.s
Define tt.s = ""
Define v$
Define vv$ = ""

Debug @a
Debug @t
Debug @tt
Debug @v$
Debug @vv$

Re: Adresse eines String ist null

Verfasst: 22.02.2011 17:44
von STARGÅTE
Was ist daran doof ?
Reinschreiben mit PokeS darfst du eh nicht !

Und wenn du den Pointer zum StringPointer willst:

Code: Alles auswählen

Define a.i
Define t.String
Define tt.String\s = ""

Debug @a
Debug @t
Debug @tt
Debug @t\s
Debug @tt\s

Re: Adresse eines String ist null

Verfasst: 22.02.2011 18:25
von hjbremer
Reinschreiben mit PokeS darfst du eh nicht !

Code: Alles auswählen

;dies geht

Define t.s = ""
PokeS(@t, "hallo")
Debug t

;hingegen dies geht nicht

Define tt.s 
PokeS(@tt, "hallo")
Debug tt
und dieses Verhalten finde ich Grrrh
ich muß bei jedem definieren ein Wert zuweisen und sei es nur ""
wenn ich es vergesse, und PokeS benutze, dann Error

Bei Stringfelder ist es genauso :(

Re: Adresse eines String ist null

Verfasst: 22.02.2011 18:29
von ts-soft
Geht und Geht nicht sind so eine Sache :wink:

Schalt mal den Purifier ein, dann siehst Du, das
beides nicht geht, sondern ersteres nur weil sich
dort zufällig leerer Speicher befindet!

Re: Adresse eines String ist null

Verfasst: 22.02.2011 18:36
von STARGÅTE
Wie schon geschreiben, zerlöcherst du dir mit sowas das ganze Programm.

Code: Alles auswählen

Define String1.s = ""
Define String2.s = "Laber"
PokeS(@String1, "Alles kaputt gemacht")
Debug String1
Debug String2
Alles kaputt gemacht
acht
In dem Beispiel, wird der Speicher von "Laber" einfach überschrieben
Passiert das mit etwas "wichtigerem" gibs riesen BUGs

Re: Adresse eines String ist null

Verfasst: 22.02.2011 19:26
von hjbremer
Uuuuuups

das ist ja doof :(

und nu ? aber so geht es wieder oder wieder ein Haken dabei ?

Code: Alles auswählen

Define String1.s = "ggggggggggggggggggggggg"
Define String2.s = "Laber"
PokeS(@String1, "nix kaputt gemacht")
Debug String1
Debug String2
das steht aber so nirgends und ich muß gestehen, ich bin bisher darüber auch nicht gefallen.
irgendwie müßte das geändert werden :mrgreen:

ich finde die Stringverwaltung hat da ne Macke.
schlimmer dein Beispiel geht so durch ohne Gemecker vom Compiler

Re: Adresse eines String ist null

Verfasst: 22.02.2011 19:30
von STARGÅTE
Jo in diesem Fall würde es gehen ... aber du darf eben immer nur gleicher/gleich werden!
Sonst schreibst du wieder in unbekannte Ressourcen.

Wenn du wirklich mit PokeS() auf diese weise arbeten willst, nutze gleich einen FIX-String, deren Adresse sind niemals ändet

Code: Alles auswählen

Define String.s{128}
Debug @String
String = "Hallo"
Debug String
String = ""
Debug String
Debug @String
so kannst du sicherstellen das gleich ein Pointer existiert und immer genau 128 Bytes reserviert sind.
ich finde die Stringverwaltung hat da ne Macke.
Wieso?
Ist doch gut, das PB dynamische Strings anbietet deren Inhalt in einem Pool ist, in dem man eben nicht rumfuschen soll.

Deswegen FIX-Strings!
Bei PokeS() immer schon die max-Länge angeben (hier 127, wegen der End-Null) damit es nie zum overwrite kommt.

Re: Adresse eines String ist null

Verfasst: 22.02.2011 19:33
von ts-soft
>> schlimmer dein Beispiel geht so durch ohne Gemecker vom Compiler
Dafür ist der Purifier da, der meckert dann schon. Wäre der immer an, würde das aber alles
verlangsamen und sowas möchten wir ja auch nicht.

Re: Adresse eines String ist null

Verfasst: 22.02.2011 19:38
von hjbremer
Ja so ist das, aber dann sollte das auch in der Hilfe für PokeS stehen !!!

Re: Adresse eines String ist null

Verfasst: 22.02.2011 19:42
von ts-soft
hjbremer hat geschrieben:Ja so ist das, aber dann sollte das auch in der Hilfe für PokeS stehen !!!
Purebasic.chm hat geschrieben:Für fortgeschrittene Programmierer
Es steht also da :mrgreen: , jeder fortgeschrittene Programmierer weiß, das man nicht in unreservierten
Speicher schreiben darf.