Seite 1 von 5

PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Verfasst: 28.07.2024 11:04
von ChrigiGee
Hallo @all

Ich habe einen sehr alten Code gefunden bei CAV (Codeschnipsel Archiv).
Bevor ich natürlich den ursprünglichen Ersteller belästige und auch CAV
wollte ich mich erkundigen, wie es damit steht.

https://www.purebasic.fr/german/viewtop ... 4&start=20
http://www.purearea.net/pb/CodeArchiv/German.html#15


http://www.purearea.net/pb/CodeArchiv/O ... eateExe.pb
http://www.purearea.net/pb/CodeArchiv/O ... eatePak.pb

Code: Alles auswählen

    CompressedLength = PackMemory(Mem1, Mem2, FileLength,9)
Gibt mir immer einen Fehler aus, und zwar:

Code: Alles auswählen

[10:08:34] [COMPILER] Zeile 47: PackMemory() ist keine Funktion, Array, Makro oder LinkedList.
Zur Ehrenrettung, wie gesagt ist es ein extrem alter Code, den ich dort gefunden habe....
Ursprünglich für PB 3.8 erstellt und wurde dann mal für PB 4 modifiziert.

Seit dieser Zeit hat wohl nie wieder jemand den angeschaut.

Grundsatzfrage besteht schon, wird dies überhaupt noch verwendet "PackMemory()" oder ist das in der Versenkung verschwunden
oder gibt es solch gravierende Differenzen zwischen PB 3 & 4 sowie 6, dass es nicht mehr geht?

Ich fand diese extrem spannend und wollte mal schauen, ob man das evtl. noch wieder gebrauchen könnte.
Bis jetzt scheitere ich leider mit beiden Anwendungsteilen....

Es wird in der zweiten Anwendung: UnPackMemory() verwendet, und dort habe ich einen ähnlichen Effekt.

Herzlichen Dank für die Hilfe bei einer unprofessionellen Frage.

Christian

PS:
Der Source schaut nicht so schön aus aber zum Basteln ganz OK.

Editierte Datei aus PB 4 Source, erstellt pak File:

Code: Alles auswählen

Declare _M(Text$)

; Author: AndyMars  (some modifications by ChrigiGee)
; Date: 28. Juli 2024
; OS: Windows
; Demo: unknow

; Part 1/2 of the ReadmePacker - creates a packed readme file,
; later to be included in the ReadmePacker_CreateExe example

;
; ------------------------------------------------------------
;
;   PureBasic - Compressor example file
;
;    (c) Fantaisie Software 
;
; ------------------------------------------------------------
;erstellt mit für PureBasic 6




Procedure _M(Text$)
  MessageRequester("Readme Packer 3",Text$)
EndProcedure

OpenPreferences("ReadmePacker.ini")
SourceFile.s=ReadPreferenceString("SourceFile","")
TargetFile.s=ReadPreferenceString("TargetFile","")
ClosePreferences()


UseBriefLZPacker() ; Small and fast packer

If ReadFile(0, SourceFile)
  FileLength = Lof(0)
  
  ; Allocate the 2 memory buffers needed for compression..
  ;
  *Source = AllocateMemory(FileLength)
  *Target = AllocateMemory(FileLength)
  If FileLength And *Source And *Target
    ReadData(0, *Source, FileLength) ; Read the whole file in the memory buffer
  CloseFile(0)  
    ; Compress the file, which is in memory
    ;
    CompressedLength = CompressMemory(*Source, FileLength, *Target, FileLength)
    If CompressedLength

      DecompressedLength = UncompressMemory(*Target, CompressedLength, *Source, FileLength)
      If DecompressedLength = FileLength
        
            If CreateFile(0,TargetFile)
        WriteData(0, *Target, CompressedLength)
        
 ;       MessageRequester("Info", "De/Compression succeded:"+#LF$+#LF$+"Old size: "+Str(FileLength)+#LF$+"New size: "+Str(CompressedLength))
        CloseFile(0)
        
 
    Else
      ;     MessageRequester("Error", "Can't compress the file")
      _M("Error - cannot create file: "+TargetFile)
      
    EndIf
  Else
          _M("Error - compressing failed!")
    
    EndIf
    FreeMemory(*Source)
    FreeMemory(*Target)
    
  EndIf
Else
    _M("Error - cannot open file: "+SourceFile)
;  CloseFile(0)
EndIf
EndIf
End


Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check

Verfasst: 28.07.2024 11:36
von DarkDragon
Ich hab grad nur mal schnell die Dokumentation am Handy überflogen und vermutlich heißt der Befehl nun CompressMemory:

https://www.purebasic.com/documentation ... emory.html

Das hier sind alle Packer Befehle:

https://www.purebasic.com/documentation ... index.html

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check

Verfasst: 28.07.2024 11:55
von ChrigiGee
Hallo DarkDragon,

Vielen Herzlichen Dank für Deine Antwort,

Da kann ich natürlich auch lange in der Hilfe suchen gehen, nach PackMemory() und entsprechend nichts finden.
Dann bastle ich da mal so weiter, ich erlaube mir, Dir und Euch allen meine Erkenntnisse hier zu hinterlegen,
wenn ich weiter gekommen bin.

Vielleicht wird jemand anderes auch noch wieder einmal auf genau gleiches Problem stossen....

Ich wünsche Dir und Euch allen ein ganz tolles Wochenende.

Christian
DarkDragon hat geschrieben: 28.07.2024 11:36 Ich hab grad nur mal schnell die Dokumentation am Handy überflogen und vermutlich heißt der Befehl nun CompressMemory:

https://www.purebasic.com/documentation ... emory.html

Das hier sind alle Packer Befehle:

https://www.purebasic.com/documentation ... index.html

Re: PackMemory() oder CompressMemory() + Error Meldungen PB 6

Verfasst: 28.07.2024 12:57
von ChrigiGee
Hallo DarkDragon,
Hallo @all,

Danke an Dich, DarkDragon. Ich habe nun mal den Versuch genommen CompressMemory()
Compilieren geht, ausführen, Fehlermeldung; "Error - Compressing Faild"

Original gemäss PB 4 & PB 3:

Code: Alles auswählen

CompressedLength =PackMemory(Mem1, Mem2, FileLength,9)
Originaler Teil geändert (PB 6):

Code: Alles auswählen

CompressedLength = CompressMemory(Mem1, Mem2, FileLength,9)
Gemäss Hilfe:

Code: Alles auswählen

CompressMemory(*Puffer, Größe, *Ausgabe, AusgabeGröße [, Plugin [, Level]])
Sorry, wenn ich Nerven sollte, ich bin mir noch nicht ganz sicher, ob ich eine Fehlüberlegung mache,
auf jeden Fall bastle und versuche ich weiter.

Ich möchte nicht eine schlüsselfertige Lösung, ich möchte selber auch wieder etwas dazu lernen können.
Kann es gemäss der "neuen" Syntax bei CompressMemory genau diesen Fehler verursachen, wenn ich die alte Struktur übernehme?

Sprich muss ich bei CompressMemory zwingend *Puffer und *Ausgabe mit deklarieren oder reicht es, wenn ich nach der alten Struktur vorgehe
wo einfach Grösse und AusgabeGrösse angegeben wurde sowie Kompressionslevel ?

Das zu packende Original File ist eine 2kb TXT Datei, bin mir also auch nicht sicher, ob mein Gedankengang hinkt
und es NUR an der Grösse der zu packenden TXT Datei ligt, welche gemäss einzelnen Beiträgen, hatte PackMemory einen Fehler
bei kleinen Dateien, wenn ich das so richtig interpretiere.

Mit besten Wochenendesswünschen
Christian

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check

Verfasst: 28.07.2024 14:24
von DarkDragon
Die Parameter haben sich geändert. Vielleicht ist dieses Beispiel besser geeignet als das alte Zeug vom Code Archiv:

https://www.purebasic.com/documentation ... er.pb.html

PureBasic kommt mit ettlichen Beispielen wie man etwas verwendet. Die sind entweder in der Hilfe oder eben in dem Examples Ordner in der PureBasic Installation. Schau dir das einfach mal an, da hat es sehr viele und gute Beispiele mit drin.

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Verfasst: 29.07.2024 14:42
von ChrigiGee
Hallo DarkDragon,
Hallo @all,

Ich wünsche einen schönen Start in die neue Woche.
Das Beispiel mit dem Packen klappt recht gut, ich verstehe nicht so ganz wie ich OHNE die Source Datei das ganze wieder rekonstruieren kann.
Gemäss der Hife benötige ich wiederum 4 Werte, welche ich zum Teil habe resp. erhalten kann.

Code: Alles auswählen

Ergebnis = UncompressMemory(*Puffer, Größe, *Ausgabe, AusgabeGröße [, PluginID])

Code: Alles auswählen

DecompressedLength = UncompressMemory(*Target, CompressedLength, *Source, FileLength)
Logisch für mich Ursprungsdatei & Grösse, aber wie soll ich jetzt die Source herausbekommen resp. Grösse.
Wird etwas schwierig, das gesamte 180° zu drehen.

Oder habe ich doch etwas übersehen?
Sehr gut möglich, momentan komme ich leider nur nicht auf die Lösung, da ich mir selber wahrscheinlich
im Weg stehe.


Liebe Grüsse beim basteln....

Christian

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Verfasst: 29.07.2024 15:21
von DarkDragon
Jo das einzige was du tun kannst ist den puffer zu verdoppeln bis es passt. Der Parameter AusgabeGröße ist dazu da damit uncompressmemory nicht aus dem *Ausgabe Puffer hinausläuft. Warum man die Größe nicht vorher ermitteln kann ist seltsam, aber vermutlich benötigt man den gesamten Inhalt jederzeit zum dekomprimieren.

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Verfasst: 29.07.2024 21:31
von jogo
bevor du den gepackten Paket-Inhalt in den Speicher lädst, kannst du ja die unkomprimierte Größe mit PackEntrySize(#Pack, #PB_Packer_UncompressedSize) ermitteln.

Re: PackMemory() + Error Meldungen PB 6 oder Syntax Check (1/2 gelöst)

Verfasst: 29.07.2024 21:57
von ChrigiGee
Hallo DarkDragon,

Dann habe ich mich nicht falsch in diese Materie eingelesen.

Ich finde den gesamten Aspekt sehr spannend. Die Routine zum Erstellen ist
recht problemlos und übersichtlich mittels eines Beispiels Dokumentiert, jedoch
die Problematik beginnt dann beim Umkehr-Prozess, welcher leider ohne
Dokumentation recht schwer verdaulich ist.

Ich hoffe, ich komme doch noch dahinter....

Liebe Grüsse und einen angenehmen Abend..
Christian
DarkDragon hat geschrieben: 29.07.2024 15:21 Jo das einzige was du tun kannst ist den puffer zu verdoppeln bis es passt. Der Parameter AusgabeGröße ist dazu da damit uncompressmemory nicht aus dem *Ausgabe Puffer hinausläuft. Warum man die Größe nicht vorher ermitteln kann ist seltsam, aber vermutlich benötigt man den gesamten Inhalt jederzeit zum dekomprimieren.

(OPEN) UnCompress File save as

Verfasst: 29.07.2024 22:37
von ChrigiGee
Hallo jogo,

Vielen Dank für Deinen Hinweis.
Du meinst, dass ich dann zuerst öffne:

Code: Alles auswählen

If OpenPack(0, "./ReadmePacker_Liesmich.pak") 
   PackEntrySize(0, #PB_Packer_UncompressedSize)
   ClosePack(0)
Ja, bis jetzt klappt es noch gar nicht, da bei Zeile 40
ein String erwartet wird.

Zeile 40 & 41:

Code: Alles auswählen

            If CreateFile(0,TargetFile)
        WriteData(0, *Target, PackEntrySize)
Das wäre meine Beispielanwendung:

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - UnCompressor example file
;
;    (c) 2024 by ChrigiGee
;
; ------------------------------------------------------------
;

UseBriefLZPacker() ; Small and fast packer

If OpenPack(0, "./ReadmePacker_Liesmich.pak") 
   PackEntrySize(0, #PB_Packer_UncompressedSize)

   ClosePack(0)
   
   
If ReadFile(0, "./ReadmePacker_Liesmich.pak")
  FileLength = Lof(0)
  
  ; Allocate the 2 memory buffers needed for compression..
  ;
  *Source = AllocateMemory(CompressedLength)
  *Target = AllocateMemory(PackEntrySize)
  

  
    ReadData(0, *Source, CompressedLength) ; Read the whole file in the memory buffer
    
    ; UnCompress the file, which is in memory
    ;
    
     DecompressedLength = UncompressMemory(*Source, CompressedLength, *Target, PackEntrySize)
       If DecompressedLength = PackEntrySize
         
         

         
            If CreateFile(0,TargetFile)
        WriteData(0, *Target, PackEntrySize)

      
    ;   MessageRequester("Info", "De/Compression succeded:"+#LF$+#LF$+"Old size: "+Str(FileLength)+#LF$+"New size: "+Str(CompressedLength))
        CloseFile(0)


     
    FreeMemory(*Source)
    FreeMemory(*Target)
    
  EndIf
  
;  CloseFile(0)
;EndIf

End

jogo hat geschrieben: 29.07.2024 21:31 bevor du den gepackten Paket-Inhalt in den Speicher lädst, kannst du ja die unkomprimierte Größe mit PackEntrySize(#Pack, #PB_Packer_UncompressedSize) ermitteln.