Packer: Alles auf einmal entpacken

Für allgemeine Fragen zur Programmierung mit PureBasic.
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Packer: Alles auf einmal entpacken

Beitrag von TheCreepyProgramer »

Hallo,

ich habe heute ein Problem (mal wieder). Ich Speicher eine Liste mit

Code: Alles auswählen

ProcedureDLL SaveGame(List Level.Sprites(), name.s, gamelevel)
	sFile = CreateFile(#PB_Any, "save.tmp")
	WriteLong(sFile, gamelevel)
	ForEach Level()
		WriteStringN(sFile, Level()\Name)
		WriteLong(sFile, Level()\walk)
		WriteLong(sFile, Level()\x)
		WriteLong(sFile, Level()\y)
		If Level()\Name = "teleporter" Or Level()\Name = "pressure_plate"
			WriteLong(sFile, Level()\to_x)
			WriteLong(sFile, Level()\to_x)
		Else
			WriteLong(sFile, -1)
			WriteLong(sFile, -1)
		EndIf
	Next
	CloseFile(sFile)
	CreatePack(GetPathPart(ProgramFilename())+"saves\"+name+".sav")
	AddPackFile("save.tmp")
	ClosePack()
EndProcedure
Das funktioniert auch gut, nur wenn ich die gepackte Datei jetzt wieder entpacken will, wird nicht die ganze Datei ausgelesen, was dann ungefähr so aussieht:
Bild

Uploaded with ImageShack.us

Geladen wird mit:

Code: Alles auswählen

ProcedureDLL LoadGame(List ReturnList.Sprites(), name.s)
	oPack = OpenPack(GetPathPart(ProgramFilename())+"saves\"+name+".sav")
	*Adresse = NextPackFile()
	oFile = CreateFile(#PB_Any, "load.tmp")
	WriteData(oFile, *Adresse, SizeOf(*Adresse))
	gamelevel = ReadLong(oFile)
	While Eof(oFile) = 0
		AddElement(ReturnList())
		ReturnList()\Name = ReadString(oFile)
		ReturnList()\walk = ReadLong(oFile)
		ReturnList()\x = ReadLong(oFile)
		ReturnList()\y = ReadLong(oFile)
		ReturnList()\to_x = ReadLong(oFile)
		ReturnList()\to_y = ReadLong(oFile)
	Wend
	CloseFile(oFile)
	ClosePack()
	ProcedureReturn ReturnList()
EndProcedure
TheCreepyProgramer

PS: Hat jemand den Download-Link für PackerEx_Include für mich? Oder gibt es etwas besseres?
Bild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Packer: Alles auf einmal entpacken

Beitrag von Bisonte »

Is klar das der alles abschneidet...

Du hast beim schreiben des Files :

Code: Alles auswählen

WriteData(oFile, *Adresse, SizeOf(*Adresse))
geschrieben. SizeOf() gibt dir allerdings die Grösse des Pointers zurück (hier Integer)
Du musst dort aber die Grösse des Speicherbereiches haben.
also ein

Code: Alles auswählen

WriteData(oFile, *Adresse, MemorySize(*Adresse))
dann sollte es funktionieren ....

SizeOf() wird zum ermitteln des Speicherbedarfs einer Struktur genommen.
MemorySize() beim ermitteln der Grösse eines Speicherbereiches.

P.S.: Stört dich das gar nicht, das beim kompilieren immer die Warnmeldung kommt, List,Maps,Arrays in DLL blabla ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: Packer: Alles auf einmal entpacken

Beitrag von TheCreepyProgramer »

Jetzt steht leider in der load.tmp nichts mehr drinnen.
Muss ich vielleicht NextPackFile() noch mal aufrufen?
Nein, stört mich nicht <) Hat bisher immer gut geklappt.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Packer: Alles auf einmal entpacken

Beitrag von STARGÅTE »

Code: Alles auswählen

*Adresse = NextPackFile()
WriteData(oFile, *Adresse, PackFileSize())
Bitte nächstes mal die Hilfe lesen:
NextPackFile hat geschrieben:Um die Größe des Speichers (d.h. die Größe der entpackten Datei) zu ermitteln, benutzen Sie PackFileSize().
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
TheCreepyProgramer
Beiträge: 42
Registriert: 11.06.2011 13:22

Re: Packer: Alles auf einmal entpacken

Beitrag von TheCreepyProgramer »

Auf die banalsten Dinge kommt man immer nicht. Werde aber erstmal eine 11-tägige Schweigepflicht machen :)
Bild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Packer: Alles auf einmal entpacken

Beitrag von Bisonte »

STARGÅTE hat geschrieben:

Code: Alles auswählen

*Adresse = NextPackFile()
WriteData(oFile, *Adresse, PackFileSize())
Jetzt wo Du das erwähnst .... Bild
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Antworten