Seite 1 von 3
Memory Inhalt löschen?
Verfasst: 27.06.2008 22:25
von GreyEnt
Hallo Jungs.
Wenn ich bei diesem Beispiel ReAllocateMemory nicht ausführe bleibt der Inhalt im Speicher und recstring$ kann beim nächsten durchgang den alten Inhalt enthalten.
....
ReceiveNetworkData(ClientID, *Buffer, 1000)
recstring$=PeekS(*Buffer)
PrintN("String: "+recstring$+"*")
ReAllocateMemory(*Buffer,1)
ReAllocateMemory(*Buffer,1000)
....
Kann man den Inhalt vom *Buffer eleganter löschen?
Ich hab nix gefunden. Aber das heisst ja nix.
MfG
Dieter
Verfasst: 27.06.2008 22:30
von milan1612
Mir fällt dazu spontan eine Kombination aus ZeroMemory_() und StringByteLength()
ein, kann aber auch sein dass ich deine Frage nicht verstanden hab

Verfasst: 27.06.2008 22:33
von AND51
Versuchs mal hiermit:
Code: Alles auswählen
PokeC(*Buffer, 0)
; Alternativ mit PokeS
PokeS(*Buffer, "")
Hintergrund: Das Zeichen Chr(0) bedeutet in PureBasic "Ende des Strings". Wenn also eine Null auftaucht, hört PureBasic auf, den String zu lesen.
Indem du das erste zeichen mit einer Null überschreibst, hört PureBasic auf mit dem lesen, bevor es überhaupt anfängt.
Im Prinzip bleibt (bis auf das erste Zeichen) der Inhalt des Buffers bestehen. Mann kann nach dieser Art der Löschung auch weiterhin auf den alten Inhalt zugreifen.
Wenn du wirklich ALLE Daten löschen möchtest, müsstest du jedes Byte mit Nullen überschreiben, aber es ist meiner Meinung nach sicher genug und vor allem schneller, nur das erste Zeichen zu überschreiben.
Verfasst: 27.06.2008 22:46
von ts-soft
FreeMemory(*buffer) ?
Verfasst: 27.06.2008 22:47
von GreyEnt
danke AND51,
ich glaube das klappt nicht.
Weil beim nächsten durchgang das erste Zeichen ja wieder mit einem String überschrieben wird. Um dem Neuen String fehlt dann das Chr(0).
Verfasst: 27.06.2008 22:51
von AND51
GreyEnt hat geschrieben:Um dem Neuen String fehlt dann das Chr(0).
Prima, dass du das schon mal verstanden hast, wie das mit den Nullen funktioniert.
Das dem neuen String die abschließende Null fehlt, liegt an der Arbeitsweise von
receivenetworkString(). Er setzt bei jeder Ausführung da wieder an, wo er aufgehört hat. Aber soviel dazu.
In der Zwischenzeit habe ich dir 2 Codes gebastelt:
Code: Alles auswählen
Macro LoeschMethode1(Buffer)
PokeC(Buffer, 0)
EndMacro
Procedure LoeschMethode2(*Buffer.Character)
Protected *stopPosition=*Buffer+MemorySize(*buffer)
While *Buffer <> *stopPosition
*Buffer\c=0
*Buffer+1
Wend
EndProcedure
Methode 1 ist sehr schnell, es überschreibt nur das erste Zeichen. Da es ein Macro ist, ist es nur ein anderer Befehl.
Methode 2 Überschreibt wirklich jedes Byte mit Nullen und sollte somit "sicherer" sein (auch vor Überschreibungen mit fehlender Null).
Der 2. Code soll nicht nur dein Problem lösen, sondern dir auch zeigen "wie man sowas macht".
Verfasst: 27.06.2008 22:51
von GreyEnt
@TS-Soft
FreeMemory(*MemoryID)
Beschreibung
Gibt den zuvor mittels AllocateMemory() oder ReAllocateMemory() reservierten Speicher frei.
das versteh ich so das ich *Buffer komplett lösche. und dann nicht mehr zur verfügung steht. oder vertu ich mich?
Verfasst: 27.06.2008 22:54
von ts-soft
Verfasst: 27.06.2008 22:55
von AND51
GreyEnt hat geschrieben:das versteh ich so das ich *Buffer komplett lösche. und dann nicht mehr zur verfügung steht. oder vertu ich mich?
Richtig.
TS-Soft will andeuten, das du statt den Buffer manuell zu löschen, lieber einen neuen anlegen sollst.
Jeder neu angelegte Buffer mit
AllocateMemory() ist automatisch genullt, es stehen überall nur Nullen drin.
Es lässt sich drüber streiten, was sinnvoller ist. Ich denke jedoch, dass ein manuelles löschen schneller sein dürfte, als jedes Mal einen neuen Buffer anzulegen und ihn zu löschen.
Besonders, wenn der Buffer häufig und in sehr kurzen Zeitabständen gelöscht werden muss, dürfte das ständige neuallokieren eine ziemliche Bremse sein.
Verfasst: 27.06.2008 22:56
von ts-soft
GreyEnt hat geschrieben:das versteh ich so das ich *Buffer komplett lösche. und dann nicht mehr zur verfügung steht. oder vertu ich mich?
Nein, tust Du nicht. Mir ist der Sinn des löschens sowieso nicht klar, wenn er
sowieso wieder überschrieben wird.
// edit:
> recstring$ kann beim nächsten durchgang den alten Inhalt enthalten.
Nur wenn ReceiveNetworkData(ClientID, *Buffer, 1000)
0 als Ergebnis hat, ansonsten sollte es nicht möglich sein, deshalb ist das löschen also auch sinnlos, lediglich ein Check auf 0 fehlt!