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

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

Beitrag von ChrigiGee »

Hallo H. Brill
Hall @all,

Ist vielleicht eine dumme Frage für Euch, aber ich bin gerade so richtig verwirrt.
Ich hab die pak jetzt etliche mal neu erstellt und dabei ist mir etwas aufgefallen.

Das wird bei jedem Durchlauf mir angezeigt.
Für den einen oder anderen nichts Spezielles.
Aber es handelt sich hier immer genau um das Gleiche in diversen Durchläufen.
Keine Änderung am Source.

Ausgabe die Größe des Source File resp. TargetFiles bei jedem Durchlauf einen anderen Wert.
Damit ich aber das ganze wieder zurück in ein File bekomme, dürfte doch das NIE ändern, außer
Source File ändert sich was Target auch wieder betrifft.

Es kommt mir vor, als würde noch eine Art von Zeitstempel dabei sein.
Das nur so als Frage in die Runde habe ich hier etwas komplett Falsch verstanden ?


Lieber H. Brill, ich schaue mir Dein Beispiel sehr gerne Morgen an, da ich in Thailand bin ist bei mir
bereits wieder ca. 6 Stunden später und ich mache bald mal Feierabend.

Liebe Grüsse
Christian

Datei länge beim packen:

Code: Alles auswählen

FileLength 5045
3258096224356
source Grösse 3258096224356
3258096229428
source Grösse 3258096229428

FileLength 5045
1952784124004
source Grösse 1952784124004
1952784129076
source Grösse 1952784129076

FileLength 5045
1491980126308
source Grösse 1491980126308
1491980131380
source Grösse 1491980131380

FileLength 5045
2431473223780
source Grösse 2431473223780
2431473228852
source Grösse 2431473228852

FileLength 5045
1637211900004
source Grösse 1637211900004
1637211905076
source Grösse 1637211905076
Datei länge entpacken:

Code: Alles auswählen

FileLength 5045
1598545332324
source Grösse 1598545332324
1598545337396
source Grösse 1598545337396
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() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von ChrigiGee »

Hallo lieber Axolotl,

Ich versuche nach Möglichkeit F1 und das Forum nach dem zu durchforsten, welches Aufschlussgeben könnte.
Wie aber auch bei Google, wenn man nicht weiß, wonach man suchen muss, kann jede Suche ans Ende
der Tage führen.

Nichtsdestotrotz, für Deinen Hinweis Len() und StringByteLength() bin ich sehr dankbar.
Dann dürfte len() nur ASCII formatierter Text beinhalten, wobei StringByteLength() ASCII wie UTF-8 verarbeiten kann.

Würde in dem Fall bedeuten, ist meine ReadMe irrtümlich UTF formatiert gibt es beim Verarbeiten bereits Probleme,
auch wenn sie mir nicht bewusst sind oder nicht angezeigt werden.

Bereits mal wieder sehr Lehrreich, und wäre mir wohl nicht so rasch aufgefallen.
Der Zufall wäre hier mit meiner Vermutung ASCII und UTF also noch nicht mal so abwegig gewesen.
Und nur nach dem Motto, auch ein blindes Huhn findet mal ein Korn.

Herzliche Grüsse
Christian

Axolotl hat geschrieben: 24.12.2024 17:06 Da in PB die Strings UNICODE kodiert sind, könnte es sein, dass hier die Länge je nach Funktion in Bytes oder Characters verwendet werden sollte.
S.a. Unterschied zwischen Len() und StringByteLength()

Ich kann mich (leider) immer nur wiederholen: Die Hilfe (über F1) ist Dein bester Freund. Sie erklärt Dir jede Funktion und seine Parameter!

Frohe Weihnachten.
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() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von ChrigiGee »

Hallo liber H. Brill,

unterdessen hab ich mir Dein Beispiel angeschaut.
Wirkich Interesnt,

Das pak File an und für sich wird nun korrekt erstellt,
konnte ich so testen, als, dass das pak File eine ZIP Datei ist.

Wo ich hingegen komplett falsch lag, war mit der Annahme, dass die
Speichergrößen wichtig wären für den ein resp. auspacken.

Zumindest habe ich es so verstanden,
denn wenn ich bei Deinem Beispiel Debug auf die pufer 1 - 3
mache, bekomme ich bei jedem Start einen anderen Wert.

Also muss der Hase anderswo mir die Eier bemalt und versteckt haben.

Auch verwendest Du PeekS und PokeS
dort der Len() in Textform vorhanden ist.

Bei meinem Beispiel Len() der ungepackte PackEntrySize() ausgibt.
resp. beim Packen FileLength aus geöffneter und gelesenem SourceFile

Ich mache jetzt eine Annahme dadurch, dass das Packen funktioniert
Liegt das Problem nicht daran.

EDIT:
Unterdessen muss ich bei meinen Erkentnissen etwas Revidieren.
Ich war der Annahme dass der Code Teil:

Code: Alles auswählen

UnPackErg = UncompressMemory(ReadMePak, MHndl1,ReadMePakEnd, unkompress_puffer) 
Korrekt ist.

Was er wahrscheinlich doch nicht ist.

Da ich aus dem Original Code:

Code: Alles auswählen

UnPackErg = UnpackMemory(?ReadMePak, MHndl1
Die Anpassung auf UncompressMemory übertragen habe ist wohl dort der Fehler nehme ich momentan an.
Beim Spielen mit demm Code, Debug Funktion ist herausgekommen UnPackErg ergibt wie ich es kehre wende
und mache Versuche immer -1

Oder

Code: Alles auswählen

UnPackErg = UncompressMemory(Speicher_1, Speicher_2, Speicher_3, Speicher_4)
Nehme ich hingegen die Hilfe zu Rate ergibt sich ein gänzlich anderes Szenario:

Code: Alles auswählen

Ergebnis = UncompressMemory(*Puffer, Größe, *Ausgabe, AusgabeGröße [, PluginID])
Zu beachten bei mir KEIN Verweis auf die Pak resp, das File.
Anschliessend bedeutet das,

Code: Alles auswählen

Ergebnis = UncompressMemory(*SourceFile_TXT,  Speichergröße 1, Puffer_1, Dateiname_pak[, PluginID])
Oder

Code: Alles auswählen

UncompressMemory(Readme.txt, 123456789, 1024, ReadMMe.pak)
Somit das übertragen auf das UncompressMemory() Falsch bewerstelligt.
Wahrscheinlich habe ich genau dies bereits einmal früher Diskutiert.
Ich muss mal schauen, ob ich schlau werde.... Hilfe Fragen ohne zu wissen was ergibt -1.
EDIT ende:


Sicherlich, Axolotl wird mit großer Bestimmtheit, so auch Du, mir einwenden, Suche F1 verwenden, wo ich momentan noch
keinen Plan habe, wonach ich, den hier suchen müsste.

Wahrscheinlich liege ich auch völlig daneben mit meinen Vermutungen.
Doch das wäre so meine Flickwerk aus CompressMemory und UncompressMemory Verständnins

Unter Umständen habe ich noch einen klitzekleinen Gedankenfehler, wo dieses dumme
Ding MHndl1 doch noch benötigt wird oder ich falsch isoliert habe bei meiner Recherche.

In der Hoffnung ich kriege es raus, ohne dass Ihr mir die Lösung bereitstellt
mache ich mich wieder ans Werk.

Liebe Grüsse
Christian
H.Brill hat geschrieben: 24.12.2024 09:30
Denn unter LZMA wurde besagte Datei mit 0 Byte erstellt oder überhaupt nicht.
Bei mir geht LZMA auch nicht, nur ZIP. Ich haber aber auch kein entsprechendes PlugIn installiert.
Da kommt aber auch eine entsprechende Fehlermeldung, daß das Plugin nicht installiert ist.
Ich würde den ZIP-Packer bevorzugen. Der ist ja seit ein paar Windowsversionen standardmäßig
dabei. Bei LZMA muß dein Anwender ja auch den entsprechenden Packer installiert haben.
Damit nötigst du ihn, diesen auch zu installieren.

Hast du nur eine einzelne Datei zu packen oder sind das mehrere ?
Eine einzelne Datei geht auch so :

Code: Alles auswählen

textdatei.s = "F:\text.txt"  ; Pfade anpassen
packdatei.s = "F:\text.pak"

If OpenFile(0, textdatei)
	length = Lof(0)
	*Buffer1 = AllocateMemory(length)
  *Buffer2 = AllocateMemory(length)
  ReadData(0, *Buffer1, length)
  CloseFile(0)
EndIf  
UseZipPacker()

Debug PeekS(*Buffer1, length, #PB_Ascii)


CompressMemory(*Buffer1, MemorySize(*Buffer1), *Buffer2, MemorySize(*Buffer2), #PB_PackerPlugin_Zip )

If CreateFile(1, packdatei)
	WriteData(1, *Buffer2, MemorySize(*Buffer2))
	CloseFile(1)
EndIf	
FillMemory(*Buffer2, length) ; *Buffer2 leeren zum späteren Befüllen mit UnCompressMemory()
FillMemory(*Buffer1, length)

If OpenFile(2, packdatei)
	length = Lof(2)
	ReadData(2, *Buffer1, length)
  UncompressMemory(*Buffer1, MemorySize(*Buffer1), *Buffer2, MemorySize(*Buffer2), #PB_PackerPlugin_Zip )
  Debug "der entkomprimierte Text : " + Chr(13) + PeekS(*Buffer2, MemorySize(*Buffer2), #PB_Ascii)
EndIf

FreeMemory(*Buffer1)
FreeMemory(*Buffer2)
In der Debug-Ausgabe siehst du, daß der Text zweimal da ist.
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
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

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

Beitrag von H.Brill »

Hast du mal die Varianten bei PeekS(.., #PB_Ascii oder #PB_UTF8) durchgespielt ?
Bei UncompressMemory() muß halt der Ausgabepuffer mindestens so groß sein, wie
der originale, was ja auch logisch ist.
Wenn *buf1 der unepackte, original Speicher ist, so muß auch der Ausgabepuffer mind. so groß sein.
*buf2 soll der gepackte speicher sein. Ich würde alle Speicher, die damit zu tun haben, auf Originalgröße
setzen. Etwas mehr macht ja nichts.

Code: Alles auswählen

 
length = StringByteLength(text) 
*buff1 = AllocateMemory(length)
*buff2 = AllocateMemory(length)
*buff3 = AllocateMemory(length)
CompressMemory(*buff1, length, *buff2, length, #PB_PackerPlugin_Zip)
UncompressMemory(*buff2, length, *buff3, length, #PB_PackerPlugin_Zip)
Da dürfte eigentlich nichts mehr schief laufen.
PB 6.10
Axolotl
Beiträge: 265
Registriert: 31.12.2008 16:34

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

Beitrag von Axolotl »

ChrigiGee hat geschrieben: 25.12.2024 08:56 .....
Dann dürfte len() nur ASCII formatierter Text beinhalten, wobei StringByteLength() ASCII wie UTF-8 verarbeiten kann.
.....
Hallo ChrigiGee,
so würde ich das nicht zusammenfassen.
Es ist vielmehr wie folgt:
PureBasic verwendet (seit geraumer Zeit) intern UNICODE bei Strings. Das bedeutet, dass jedes Zeichen aus einem CHARACTER bzw. zwei Bytes besteht.
Jetzt kommt es darauf an, welche Art von Parameter die nächsten Proceduren haben wollen.
Z.B. möchte AllocMemory(Size) immer Size in Bytes, d.h. wenn Du einen String in einen Speicherbereich kopieren möchtest, muss der Speicher also auch Bytes groß sein. (Welches im übrigen CHARACTER * 2 oder CHARACTER << 1 entspricht)

Code: Alles auswählen

Debug SizeOf(Character)  ; == 2 
Debug SizeOf(Byte)  ; == 1 
Debug SizeOf(Ascii)  ; == 1
Die Peek* und Poke* Proceduren sind dazu geeignet dieses umkopieren in beide Richtungen korrekt durchzuführen, wenn man sie mit den richtigen Parametern aufruft.

Nur zur Vollständigkeit:
Beim Abspeichern kann man die Dateien auch als UTF-8 mit oder ohne BOM (Byte Order Marker) abspeichern. Bei UTF-8 werden die Zeichen allerdings in unterschiedlicher Länge abgespeichert, während UNICODE immer Zwei-Byte Zeichen enthält. Da helfen dann die FileSystem Proceduren, wie bspw.

Code: Alles auswählen

Result = ReadFile(#File, Filename$ [, Flags])
Ich hoffe, die Erklärung sorgt jetzt nicht für noch mehr Verwirrung. Ansonsten die verschiedenen Proceduren, die Du schon verwendest in kleinen Testprogrammen ausprobieren. So mache ich das immer.
Und wenn ich Beispiele ausprobiere und Proceduren sehe, die ich noch nicht so gut kenne, dann drücke ich auf F1 oder (bei API) suche ich bei MSDN (Microsoft learn....) nach den Parameter, verwendeten Strukturen und (ganz wichtig) nach den Rückgabewerten.
Hier noch ein kleines Beispiel zum eben gesagten.

Code: Alles auswählen

Global Test1$ = "Test1234" 

Global length1 = Len(Test1$)
Global bytes1  = StringByteLength(Test1$)

Debug Test1$
Debug " chars == " + length1
Debug " bytes == " + bytes1 

Global *Buffer 
Global BufferSize = 80 ; bytes --- INFO: dont use 40 bytes in this example 

*Buffer = AllocateMemory(BufferSize)  
If *Buffer 
  PokeS(*Buffer, Test1$)                      ; optional parameter := Length = -1, #PB_Unicode 
  PokeS(*Buffer + bytes1, "Noch ein Test ")   ; *Buffer + length!!! 
  ; here: see CopyMemoryString() instead. 
EndIf 

ShowMemoryViewer(*Buffer, BufferSize)   ; show BufferSize bytes of memory 

FreeMemory(*Buffer) 
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

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

Beitrag von H.Brill »

ChrigiGee :
Wie sind denn deine Einstellungen (Datei-Einstellungen) ?
Also, ich habe da bei mir bewußt unter Compiler - Standards - Text-Kodierung des Quelltextes :
Reiner Text gewählt. Manchmal hat man auch hart codierte Stringliterale im Quelltext.
Jedenfalls sollte man sich eines auswählen und dann entsprechend handeln.
PB 6.10
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 H. Brill,

Manchmal läuft mir die Zeit etwas zu rasch während dem Tag.
Ich müsste wirklich eine Stundenbremse einbauen können.

Als sich der Tag dem Ende entgegen bewegte, war ich zur Erkenntnis gekommen,
Ich könnte Dein Beispiel mittels PeekS und PokeS mal versuchen, vielleicht würde
sich die Problematik in Luft auflösen, welche beim Originalen Source mit Übernahme
versuche auf PB 6 ergeben bei mir.

PeekS and PokeS habe ich mal angeschaut, aber noch nicht großartig weiterverfolgt,
was wohl ein Fehler gewesen ist.

Das mit dem Speicherpuffer habe ich so annähernd begriffen.
Die Logik hatte ich noch nicht gesehen, dass er nicht direkt Relevanz hat,
für das Erstellen des pak Files resp. das entpacken. Musste ich wohl wirklich viel Zeit
aufwenden, bis ich es erkannte. Puffer als Konstante....

Anstelle eines Tages Versuches mit dem alten Source werde ich den Versuch wagen,
das über PeekS and PokeS zu lösen, könnte die etwas einfachere Variante ergeben,
stelle ich mir so vor.

Und mit dem Str(), mit ASCII und Unicode könnte so sich evtl. auch etwas ergeben.
Zumal ich davon absehen muss, dass ich es als Str() versuche und dafür die Unicode-Variante
StringByteLength() zu Rate ziehen werde.

Das habe ich so auch mit dem Hinweis von Axolotl erst einigermaßen verstehen können.
Da ich den StringByteLength() noch nicht mal gesehen hatte oder über die Hilfe nicht
weiter schaute.

Das wird nun das Projekt für heute werden.

Vielen Dank für die wirklich genialen Einwände, vor lauter Bäume sehe ich den Wald manchmal nicht.

Liebe Grüsse
Christian

H.Brill hat geschrieben: 25.12.2024 12:16 Hast du mal die Varianten bei PeekS(.., #PB_Ascii oder #PB_UTF8) durchgespielt ?
Bei UncompressMemory() muß halt der Ausgabepuffer mindestens so groß sein, wie
der originale, was ja auch logisch ist.
Wenn *buf1 der unepackte, original Speicher ist, so muß auch der Ausgabepuffer mind. so groß sein.
*buf2 soll der gepackte speicher sein. Ich würde alle Speicher, die damit zu tun haben, auf Originalgröße
setzen. Etwas mehr macht ja nichts.

Code: Alles auswählen

 
length = StringByteLength(text) 
*buff1 = AllocateMemory(length)
*buff2 = AllocateMemory(length)
*buff3 = AllocateMemory(length)
CompressMemory(*buff1, length, *buff2, length, #PB_PackerPlugin_Zip)
UncompressMemory(*buff2, length, *buff3, length, #PB_PackerPlugin_Zip)
Da dürfte eigentlich nichts mehr schief laufen.
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() + Error Meldungen PB 6 oder Syntax Check (gelöst)

Beitrag von ChrigiGee »

Hallo Axolotl,

Vielen Dank für Deine weiterführende Informationen.
Ich hoffe das mit Str() habe ich so richtig kapiert,
Wenn ich Str() richtig Formatieren würde, wären Fehler weniger Gravierend.

StringByteLength() würden Fehler etwas besser kalkulierbar machen.

PeekS und PokeS würde meine Fehler des hin und her zusätzlich ausmerzen.
Da genau das automatisiert ist, was ich sonst von Hand muss und auch bedenken.

Ich hoffe dieses Mal etwas besser versucht zu verstehen und Rekapitulieren.

Nach dem Beispiel von H. Brill und dem Tagesende, war ich zum Einfall und Überzeugung gekommen,
ich könnte das ganze über die PeekS und PokeS versuchen, was die Gefahr etwas entschärft, die sich
beim Versuch des alten Codes zu übernehmen eingeschlichen hatte durch Unwissenheit.

Was genau dazu führte, meine Torheit wurde bestraft, indem das ganze nicht funktioniert und weil ich noch viel
weniger richtig gemacht habe, nicht mal sehen konnte.

Deine zusätzlichen Informationen, muss ich Schritt für Schritt anschauen, sodass mir das ganze verständlich wird und bleibt.
Alles auf einmal würde wohl den Sinn verfehlen.

Über die Win-API habe ich noch nicht so viel nachgedacht, der Grund war darin, dass ich den verdacht hegte, dass ich so
wieder mehr Gefahren, mit Missverständnissen hineinkommen.

Zuerst das eine besser verstehen lernen, bevor ich mit dem mischen beginne.

Werde versuchen, doch Win-API und PB Hilfe doch etwas mehr zu kombinieren für Verständnisfragen.
Vielleicht werden auch meine eigenen Fragestellungen etwas weniger konfus daher kommen.

Heute mal das Konstrukt versuchen aufzugleisen über PeekS und PokeS,
vielleicht komme ich etwas besser vorwärts.

Und dass ich dann doch eher mal Testen sollte, resp. in Teilpakete Testen,
ist zusätzlich ein Input, den ich mir viel öfter zu Herzen nehmen sollte und umsetzen.

Ich bin zu oft mit dem kleinen am Werkeln, dass sowas vergessen geht und das große - Ganze anschließend nicht geht.
Sollte ich mir wirklich auf die Stirn tätowieren lassen....

Liebe Grüsse
Christian
Axolotl hat geschrieben: 25.12.2024 13:28
ChrigiGee hat geschrieben: 25.12.2024 08:56 .....
Dann dürfte len() nur ASCII formatierter Text beinhalten, wobei StringByteLength() ASCII wie UTF-8 verarbeiten kann.
.....
Hallo ChrigiGee,
so würde ich das nicht zusammenfassen.
Es ist vielmehr wie folgt:
PureBasic verwendet (seit geraumer Zeit) intern UNICODE bei Strings. Das bedeutet, dass jedes Zeichen aus einem CHARACTER bzw. zwei Bytes besteht.
Jetzt kommt es darauf an, welche Art von Parameter die nächsten Proceduren haben wollen.
Z.B. möchte AllocMemory(Size) immer Size in Bytes, d.h. wenn Du einen String in einen Speicherbereich kopieren möchtest, muss der Speicher also auch Bytes groß sein. (Welches im übrigen CHARACTER * 2 oder CHARACTER << 1 entspricht)

Code: Alles auswählen

Debug SizeOf(Character)  ; == 2 
Debug SizeOf(Byte)  ; == 1 
Debug SizeOf(Ascii)  ; == 1
Die Peek* und Poke* Proceduren sind dazu geeignet dieses umkopieren in beide Richtungen korrekt durchzuführen, wenn man sie mit den richtigen Parametern aufruft.

Nur zur Vollständigkeit:
Beim Abspeichern kann man die Dateien auch als UTF-8 mit oder ohne BOM (Byte Order Marker) abspeichern. Bei UTF-8 werden die Zeichen allerdings in unterschiedlicher Länge abgespeichert, während UNICODE immer Zwei-Byte Zeichen enthält. Da helfen dann die FileSystem Proceduren, wie bspw.

Code: Alles auswählen

Result = ReadFile(#File, Filename$ [, Flags])
Ich hoffe, die Erklärung sorgt jetzt nicht für noch mehr Verwirrung. Ansonsten die verschiedenen Proceduren, die Du schon verwendest in kleinen Testprogrammen ausprobieren. So mache ich das immer.
Und wenn ich Beispiele ausprobiere und Proceduren sehe, die ich noch nicht so gut kenne, dann drücke ich auf F1 oder (bei API) suche ich bei MSDN (Microsoft learn....) nach den Parameter, verwendeten Strukturen und (ganz wichtig) nach den Rückgabewerten.
Hier noch ein kleines Beispiel zum eben gesagten.

Code: Alles auswählen

Global Test1$ = "Test1234" 

Global length1 = Len(Test1$)
Global bytes1  = StringByteLength(Test1$)

Debug Test1$
Debug " chars == " + length1
Debug " bytes == " + bytes1 

Global *Buffer 
Global BufferSize = 80 ; bytes --- INFO: dont use 40 bytes in this example 

*Buffer = AllocateMemory(BufferSize)  
If *Buffer 
  PokeS(*Buffer, Test1$)                      ; optional parameter := Length = -1, #PB_Unicode 
  PokeS(*Buffer + bytes1, "Noch ein Test ")   ; *Buffer + length!!! 
  ; here: see CopyMemoryString() instead. 
EndIf 

ShowMemoryViewer(*Buffer, BufferSize)   ; show BufferSize bytes of memory 

FreeMemory(*Buffer) 
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
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

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

Beitrag von H.Brill »

ChrigiGee hat geschrieben: 26.12.2024 07:57 Das mit dem Speicherpuffer habe ich so annähernd begriffen.
Die Logik hatte ich noch nicht gesehen, dass er nicht direkt Relevanz hat,
für das Erstellen des pak Files resp. das entpacken. Musste ich wohl wirklich viel Zeit
aufwenden, bis ich es erkannte. Puffer als Konstante....
Betrachte mal so einen Speicherpuffer wie eine Universal - Variable, wo man praktisch alles
(Zahlen, Strings, sonst.Bytes) reinschreiben kann. Es ist halt ein Stück lineares RAM. Anders,
als bei Stringvariablen, die durch Anhängen (+) erweitert werden kann, muß so eine Speichervariable
ReAllociert werden, da man sonst über die Speichergrenze hinweg schreiben würde, was wieder
unvorhergesehene Reaktionen seitens des Betriebssystems hervorrufen kann.

Was die Herangehensweise betrifft, machst du das ja richtig. Ich selber schaue oft in die Hilfe,
probiere die kleinen Beispiele darin aus und integriere es anschließend in meinen eigenen
Quellcode. Nur Mut, kaputtmachen kannst du da nichts. Höchstens mal eine Datendatei, von
der man aber eine Kopie machen und damit arbeiten sollte.
PB 6.10
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 und guten Abend @all,
Hallo Axolotl,
Hallo H. Brill,

Eine unfertige Version, welche ich noch am Erarbeiten bin, was ich noch alles anpassen muss.
Es ist eine vorläufig noch nicht funktionierende Version.

Das Auslesen des Textes klappt noch nicht.
Bin am mit Debug noch nicht überall durch, um zu erkennen was oder wie Falsch geht.

Aber dass Ihr seht, wo ich momentan so stecke mit der Arbeit.
Und wieder mal rennt mir die Zeit davon und ich hab erst einen Beginn der Arbeit.

Liebe Grüsse
Christian

Code: Alles auswählen

; German forum: http://www.purebasic.fr/german/archive/viewtopic.php?t=3038&highlight=
; Author: AndyMars  (some slightly modifications by Andre for the CodeArchiv, updated for PB3.93 by ts-soft, updated for PB 4.00 by Andre)
; Date: 06. December 2003
; OS: Windows
; Demo: No


; Part 2/2 of the ReadmePacker - includes the packed readme file,
; formerly created with the ReadmePacker_CreatePak source


;Andy Marschner - Switzerland 
;RPacks entpacken 
;erstellt mit/für PureBasic 3.8 

Declare puffer()
Declare _M(Text.s)
Declare _Info()

#Window_FormInfo=1 
#Gadget_FormInfo_ButtonOK=1 
#Gadget_FormInfo_EditorInfo=2 

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

Global ReadMeFile$
Global ReadMePak
Global ReadMePakEnd
Global FileLength


ReadMeFile$ = TargetFile
;Debug "Target File Name" + " " +  TargetFile
;Debug "ReadMe File Name" + " "+ ReadMeFile$


UseBriefLZPacker() ; Small and fast packer
UseZipPacker()
UseLZMAPacker()
  
Procedure.l Window_FormInfo() 
  If OpenWindow(#Window_FormInfo,100,100,367,218,"Info",#PB_Window_ScreenCentered) 

      ButtonGadget(#Gadget_FormInfo_ButtonOK,145,195,60,20,"OK") 
      EditorGadget(#Gadget_FormInfo_EditorInfo,0,0,365,190) 
      HideWindow(#Window_FormInfo,0) 
      ProcedureReturn WindowID(#Window_FormInfo) 
    EndIf 
;  EndIf 
EndProcedure 

Procedure puffer()

  ; Öffnet die gepackte Datei
;  If OpenPack(0, ReadMeFile$, #PB_PackerPlugin_BriefLZ) 
  If OpenPack(0, ReadMeFile$, #PB_PackerPlugin_Zip) 
;  If OpenPack(0, ReadMeFile$, #PB_PackerPlugin_Lzma) 
    
    ; Listet alle Einträge auf
    If ExaminePack(0)
      While NextPackEntry(0)
      
  FileLength = PackEntrySize(0, #PB_Packer_UncompressedSize)
;  FileLength_2 = PackEntrySize(0, #PB_Packer_CompressedSize)
    
;        Debug "Name: " + PackEntryName(0) + ", Size: " + PackEntrySize(0)
;                Debug FileLength_1
;        Debug FileLength_2
      Wend
    EndIf
    
;    ClosePack(0)
  EndIf
    
  EndProcedure
;-ASM Prozeduren ---------------------------------------------------------------------------- 
Procedure _M(Text.s) 
  MessageRequester(" Meldung", Text, #PB_MessageRequester_Ok);$ 
EndProcedure 

Procedure _Info() 
  If Window_FormInfo() 

    laenge = ?ReadMePakEnd - ?ReadMePak

  
*buff1 = AllocateMemory(laenge*3)
*buff2 = AllocateMemory(FileLength+5)

    
If UncompressMemory(*buff1, laenge, *buff2, FileLength, #PB_PackerPlugin_Zip)

If PeekS(*buff2, FileLength, #PB_Ascii)
       
;      If buff2
;Debug UncompressMemory(*buff1, FileLength, *buff2, FileLength, #PB_PackerPlugin_Zip)
;Debug PeekS(*buff2, FileLength, #PB_Ascii)

        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo),#EM_SETREADONLY , 1, 0) 
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo),#EM_SETTARGETDEVICE, #Null, 0);Wordwrap 
        SendMessage_(GadgetID(#Gadget_FormInfo_EditorInfo), #EM_LIMITTEXT, -1, 0) 
         SetGadgetText(#Gadget_FormInfo_EditorInfo,PeekS(*buff2,FileLength,#PB_Ascii)) 
      Else
        _M("Fehler in _Info() beim Entpacken der Infodaten!") 
      EndIf 
      FreeMemory(*buff1)
      FreeMemory(*buff2) 
      
    Else
      _M("Fehler in _Info(): Konnte Speicher nicht anfordern!") 
    EndIf 
    
    
    While InfoEnde=0 
      EventID = WaitWindowEvent() 
      If EventWindow()=#Window_FormInfo 
        If EventID = #PB_Event_CloseWindow 
          InfoEnde=1 
        ElseIf EventID = #PB_Event_Gadget 
          Gadget = EventGadget() 
          If Gadget = #Gadget_FormInfo_ButtonOK 
            InfoEnde=1 
          EndIf 
        EndIf 
      Else 
        SetForegroundWindow_(WindowID(#Window_FormInfo)) 
      EndIf 
    Wend 
    CloseWindow(#Window_FormInfo) 
  Else 
    _M("Fehler in _Info(): Konnte Fenster Window_FormInfo() nicht öffnen!") 
  EndIf 
  
      
 ClosePack(0)

EndProcedure 

;-MAIN -------------------------------------------------------------------------------------- 
puffer()
_Info() 

End 

ReadMePak:
IncludeBinary "ReadmePacker_Liesmich.pak" 
ReadMePakEnd:


; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableXP
; Executable = C:\Programming\Examples.exe
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