Memory Inhalt löschen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Memory Inhalt löschen?

Beitrag 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
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag 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 :lol:
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

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

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

FreeMemory(*buffer) ?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag 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).
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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. :allright:

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".
Zuletzt geändert von AND51 am 27.06.2008 22:52, insgesamt 1-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Beitrag 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?
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Code: Alles auswählen

ZeroMemory_(*buffer, MemorySize(*buffer))
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

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

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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!
Zuletzt geändert von ts-soft am 27.06.2008 23:01, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten