String mit PokeC() kürzen OK?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

String mit PokeC() kürzen OK?

Beitrag 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)
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: String mit PokeC() kürzen OK?

Beitrag 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.
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: String mit PokeC() kürzen OK?

Beitrag 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) 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: String mit PokeC() kürzen OK?

Beitrag 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
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: String mit PokeC() kürzen OK?

Beitrag von Regenduft »

Danke für die Antworten!
@Dark: Sehr ausfühlich! :allright:
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* :wink: (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!
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: String mit PokeC() kürzen OK?

Beitrag 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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: String mit PokeC() kürzen OK?

Beitrag 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))
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Re: String mit PokeC() kürzen OK?

Beitrag 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 ;)
Antworten