PokeS() PeekS() sicher mit Null-Ende oder Länge angeben

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

PokeS() PeekS() sicher mit Null-Ende oder Länge angeben

Beitrag von STARGÅTE »

Tachchen,

ja ich muss nun mal eine sehr anfängermäsige Frage stellen :lol:

In der hilfe zu PeekS() steht ja:
Der String sollte mit einem '0' Zeichen enden (Null-terminierter String), andernfalls wird der Speicher solange ausgelesen, bis ein '0' Zeichen auftritt.
Kann ich also sicher sein, dass wenn ich meherere Strings hintereinander in einen Speicher schreibe (PokeS) welche immer mit einer Null getrent sind (PokeC(*Buffer, 0)), dass dann später beim auslesen wirklich wieder der exakte Strins ausgelesen wird ?

Denn bei ReadString() im bei Files ist das ja ledier nicht der fall.
Liest einen String aus der '#Datei', bis ein 'End Of Line' (deutsch: "Ende der Zeile") Zeichen gefunden wird
Dort kann ich also durchaus einen String schreiben, er würde dann aber mehrere ReadStrings brauchen wenn der String dieses EoL hat (LF, CR, irgendwas davon ^^)

Sollte man nun lieber gleich einheitlich auf Nummer sicher gehen und auf die String sachen verzichten, und statt dessen mit
CopyMemory() bzw WriteData arbeiten und im Speicher/Datei immer zuerst eine Long schreiben mit der Länge in Bytes des Strings und dann "per Hand" den StringInhalt kopieren, sodass beim lesen wirklich 100% sicher gegangen werden kann dass alles wieder so wird wie es war ?
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
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: PokeS() PeekS() sicher mit Null-Ende oder Länge angeben

Beitrag von 7x7 »

PB-Hilfe hat geschrieben:Der String sollte mit einem '0' Zeichen enden (Null-terminierter String), andernfalls wird der Speicher solange ausgelesen, bis ein '0' Zeichen auftritt.
Tja, wenns so da steht, dann wird es wohl so sein. :mrgreen:

Aber wenn du sowieso ein eigenes Stringmanagment verwenden möchtest, ist die gespeicherte Länge auf jeden Fall mal hilfreich für evtl. andere Stringoperationen
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
NoUser

Re: PokeS() PeekS() sicher mit Null-Ende oder Länge angeben

Beitrag von NoUser »

STARGÅTE hat geschrieben:Kann ich also sicher sein, dass wenn ich meherere Strings hintereinander in einen Speicher schreibe (PokeS) welche immer mit einer Null getrent sind (PokeC(*Buffer, 0)), dass dann später beim auslesen wirklich wieder der exakte Strins ausgelesen wird ?
Ich würde mal sagen Ja. Bei Unicode sollten es aber glaube ich zwei Nullen am ende des Strings sein. Angabe ohne Gewähr. :mrgreen:
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: PokeS() PeekS() sicher mit Null-Ende oder Länge angeben

Beitrag von STARGÅTE »

@marroh
Jo, klar deswegen ja PokeC(*Buffer, 0), das ist ja je nach Art 1 oder 2 Bytes :wink:
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
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: PokeS() PeekS() sicher mit Null-Ende oder Länge angeben

Beitrag von Josh »

STARGÅTE hat geschrieben:Kann ich also sicher sein, dass wenn ich meherere Strings hintereinander in einen Speicher schreibe (PokeS) welche immer mit einer Null getrent sind (PokeC(*Buffer, 0)), dass dann später beim auslesen wirklich wieder der exakte Strins ausgelesen wird ?
wenn du zu wenig speicher allociert hast, dann kann deine null überschrieben werden. ansonsten würde ich sagen, dass du dir sicher sein kannst. ich würde nichts eigenes machen, da der aufwand nicht dafür steht.

solltest du es aber doch machen wollen, würde ich gleich auf basis von bstrings machen, wo der long wert vor dem gespeicherten pointer steht. bstrings würden ja theoretisch keine null zum terminieren brauchen, so einen fall habe ich aber bis jetzt noch nie gefunden.
Zuletzt geändert von Josh am 27.06.2010 14:32, insgesamt 1-mal geändert.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: PokeS() PeekS() sicher mit Null-Ende oder Länge angeben

Beitrag von Fluid Byte »

STARGÅTE hat geschrieben:Tachchen,Kann ich also sicher sein, dass wenn ich meherere Strings hintereinander in einen Speicher schreibe (PokeS) welche immer mit einer Null getrent sind (PokeC(*Buffer, 0)), dass dann später beim auslesen wirklich wieder der exakte Strins ausgelesen wird ?
Ja.
STARGÅTE hat geschrieben:Denn bei ReadString() im bei Files ist das ja ledier nicht der fall.
Doch, doch :mrgreen:

Code: Alles auswählen

CreateFile(0,GetTemporaryDirectory() + "test.txt")
WriteString(0,"GUTEN") : WriteByte(0,0)
WriteString(0,"TAG") : WriteByte(0,0)
WriteString(0,"!") : WriteByte(0,0)
CloseFile(0)

ReadFile(0,GetTemporaryDirectory() + "test.txt")
Debug ReadString(0)
Debug ReadString(0)
Debug ReadString(0)
CloseFile(0)
Windows 10 Pro, 64-Bit / Outtakes | Derek
NoUser

Re: PokeS() PeekS() sicher mit Null-Ende oder Länge angeben

Beitrag von NoUser »

STARGÅTE hat geschrieben:@marroh
Jo, klar deswegen ja PokeC(*Buffer, 0), das ist ja je nach Art 1 oder 2 Bytes :wink:
Wo Du recht hast, hast Du recht. Habe das PokeC(*Buffer, 0) (also Char) überlesen.
Antworten