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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

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

Beitrag 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

Zuletzt geändert von ChrigiGee am 28.07.2024 19:53, insgesamt 2-mal geändert.
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

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

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

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

Beitrag 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
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

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

Beitrag 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
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

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

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

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

Beitrag 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
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

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

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
jogo
Beiträge: 118
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint Mate

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

Beitrag 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.
--
Ideen gibt es viele - man muss sie nur haben...
Mint LMDE5+6 // PureBasic 6.12
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

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

Beitrag 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.
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Benutzeravatar
ChrigiGee
Beiträge: 125
Registriert: 18.07.2024 12:14
Computerausstattung: Lenovo ThinkPad i7, 32GB Ram, 1TB SSD
PB 6.11 LTS, proGUI, IceDesigner
Wohnort: Bern

(OPEN) UnCompress File save as

Beitrag 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.
Wer nicht fragt, der nichts lernt.
Wer keine Fehler macht, kann sich nicht verbessern.
Das Mysterium, ein wandelndes Lexikon. :mrgreen:

Wer Fragen zu meinem Textstil hat oder sich wundert über mich,
der darf seelenruhig mich direkt ansprechen. Ich beiße noch nicht.
Antworten