Seite 1 von 1
String mit PokeC() kürzen OK?
Verfasst: 23.06.2010 04:36
von Regenduft
Hallo liebe Freunde des digitalen Zeitvertreibs,
ist es eigentlich "zulässig" einen String zu kürzen, indem man an einer beliebigen Stelle des Strings ein Null-Byte (ASCII) oder Null-Word (Unicode) mittels
PokeC() schreibt oder macht das Probleme?
(Mir ist klar, dass das auch mit Left() geht…)
Beispiel:
Code: Alles auswählen
String$ = "BlaBlaBla"
x = 3
If #PB_Compiler_Unicode
x * 2
Endif
PokeC(@String$ + x, 0)
Re: String mit PokeC() kürzen OK?
Verfasst: 23.06.2010 13:03
von 7x7
Würde ich mal eher lassen. Möglicherweise fragmentierst oder oder blockierst du damit Teile des Stringspeichers, weil u.U.der Speicher des Reststrings nicht mehr korrekt freigegeben wird. Weiss es aber nicht.
Ausserdem: Warum sollte man sich auf solche unsichere Spielereien einlassen? Hinterher sucht man sich wieder einen Wolf nach irgendeinem "Bug" der Kopfzerbrechen bereitet.
Re: String mit PokeC() kürzen OK?
Verfasst: 23.06.2010 13:11
von STARGÅTE
Bin mir auch gerade unsicher, ob das oke ist.
zumindest alle PB Funktionen arbeiten nach eine manipulation richtig.
Code: Alles auswählen
String$ = RSet("",10000,"+")
Debug @String$
PokeC(@String$+2,0)
Debug MemoryStringLength(@String$)
Debug Len(String$)
Debug StringByteLength(String$)
Debug String$
Allerdings weiß ich zu wenig, wie das OS oder PB die String verwaltet.
Somit ist ungewiss, ob die restlichen 9997 Bytes immer noch blockiert sind, oder ob das OS sie als "Frei" einstuft, und später wieder überschreibt.
Dein Beispiel ist so einfacher:
Code: Alles auswählen
String$ = "BlaBlaBla"
x = 3
PokeC(@String$ + x*SizeOf(Character), 0)
Re: String mit PokeC() kürzen OK?
Verfasst: 23.06.2010 14:17
von Dark
STARGÅTE hat geschrieben:
zumindest alle PB Funktionen arbeiten nach eine manipulation richtig.
Das hat damit zu tun, das PureBasic die Länge des Strings nicht speichert. Er denkt also der String ist wirklich danach vorbei. PureBasic verwendet eine so gennante StirngBase in der, der String reinkopiert wird zum bearbeiten. Dies ist nichts anderes als ein riesiger Speicherblock. Da er denkt das der String danach zu ende ist wird Rest also nicht mal mitkopiert.
STARGÅTE hat geschrieben:
Allerdings weiß ich zu wenig, wie das OS oder PB die String verwaltet.
Somit ist ungewiss, ob die restlichen 9997 Bytes immer noch blockiert sind, oder ob das OS sie als "Frei" einstuft, und später wieder überschreibt.
Also erstmal werden Strings von PureBasic verwaltet, das OS hat nur in soweit was damit zu tun, das es Befehle zum Allocaten von Speicher zur verfügung stellt. Aber du hast recht, wenn man keine Stringbefehle auf diesen String anwedet, wird der zusätliche Speicher nicht freigegeben. Nach dem anwenden eines String Befehls würde jedoch der Speicher freigegeben. (PureBasic kopiert den String in die StringBase, gibt den alten Speicher frei, allocated neuen und kopiert den bearbeiten String da herein). Dies funktioniert einfach dadurch, das man zum Freigeben des Strings nur die Startadresse wissen muss, aber nicht seine Länge.
Und zum Abschluss denke ich hat 7x7 schon alles gesagt:
7x7 hat geschrieben:Ausserdem: Warum sollte man sich auf solche unsichere Spielereien einlassen? Hinterher sucht man sich wieder einen Wolf nach irgendeinem "Bug" der Kopfzerbrechen bereitet.
mfg,
DarkPlayer
Re: String mit PokeC() kürzen OK?
Verfasst: 23.06.2010 14:51
von Regenduft
Danke für die Antworten!
@Dark: Sehr ausfühlich!
7x7 hat geschrieben:Warum sollte man sich auf solche unsichere Spielereien einlassen? Hinterher sucht man sich wieder einen Wolf nach irgendeinem "Bug" der Kopfzerbrechen bereitet.
Darum hatte ich vor der Spielerei gefragt. Jetzt weiß ich sogar warum ich die Finger davon lasse. *freu-und-schlau-vorkomm*
(ich hoffe die Selbstironie kommt rüber!)
BTW: Es ging mir darum ein wenig Geschwindigkeit bei intensivem "Zerstückeln" von Strings rauszukitzeln. Spätesten nach der Erklärung von DarkPlayer ist mir jetzt aber klar, dass da nix mit tricksen ist. Eine Möglichkeit wäre höchstens von vornherein einen Speicherblock zu reservieren und dann darin "herumzupfuschen".
Aber: Auch das klingt nach einem idealen Bug-Habitat!
Re: String mit PokeC() kürzen OK?
Verfasst: 23.06.2010 17:01
von edel
Du kannst soviele Nullen in deinen String pusten wie du lustig bist. Wird der String freigegeben, wird auch der ganze allozierte Speicher mit freigegeben.
Re: String mit PokeC() kürzen OK?
Verfasst: 23.06.2010 23:34
von AND51
Wenn du den String sowieso immer auf die gleiche Länge kürzen willst, wäre eine andere elegante Methode auch die, den String temporär in einem fixed String zu speichern. Folgendes Beispiel kürzt einen String auf 5 Zeichen:
Code: Alles auswählen
EnableExplicit
Define text.s="Hallo Welt"
Define kuerzen.s{5}
kuerzen=text
text=kuerzen
Debug text
Debug "Len: "+str(Len(text))
Debug "StringByteLength: "+str(StringByteLength(text))
Debug "MemoryStringLength: "+str(MemoryStringLength(@text))
Re: String mit PokeC() kürzen OK?
Verfasst: 24.06.2010 00:10
von freak
AND51 hat geschrieben:Wenn du den String sowieso immer auf die gleiche Länge kürzen willst, wäre eine andere elegante Methode auch die, den String temporär in einem fixed String zu speichern. Folgendes Beispiel kürzt einen String auf 5 Zeichen:
Code: Alles auswählen
EnableExplicit
Define text.s="Hallo Welt"
Define kuerzen.s{5}
kuerzen=text
text=kuerzen
Debug text
Debug "Len: "+str(Len(text))
Debug "StringByteLength: "+str(StringByteLength(text))
Debug "MemoryStringLength: "+str(MemoryStringLength(@text))
Und inwiefern ist das besser als einfach Left() zu benutzen? Warum einfach wenn's auch umständlich geht.
Strings mit einem 0-char kürzen ist kein Problem. Nur verlängern würde ich nicht empfehlen
