![]() |
Problem mit CompressBuf
Ich mache folgendes :
Delphi-Quellcode:
... Und bekomme die Fehlermeldung :
type
TData=Array[0..12] of string; TInfo=Array of TData; var Info:TInfo; PROCEDURE CompressInfo; var i,j:integer; s:string; p:pointer; n:cardinal; begin for i:=0 to High(Info) do begin s:=s+Info[i].data[Low(data)]; for j:=Low(TData)+1 to High(TData) do s:=s+#9+Info[i].data[j]; s:=s+#13#10; end; CompressBuf(@s[1],Length(s)*2,p,n); ... FreeMem(p); end; Im Projekt xx ist eine Exception der Klasse ECompressionException mit der Meldung 'ZLib-Fehler (-6)' aufgetreten Was mache ich da falsch? Kann es am Datenvolumen (4.5 MB) liegen? |
AW: Problem mit CompressBuf
Es sieht so aus, als ob du nicht wüsstest, was du da machst:
Delphi-Quellcode:
1. Du kannst per "." nicht auf die Elemente dieses Arrays zugreifen, denn der Typ (= String) beinhaltet keine weiteren Elemente (so wie Data)
// snip
{1} s:=s+Info[i].data[Low(data)]; {2} for j:=Low(TData)+1 to High(TData) // snip 2. Warum nicht direkt das erste Element in derselben Funktion mit einbeziehen (und mit 0 anfangen)? 3. Du hast vergessen, s am Anfang zu initialisieren! Verbesserung: Mach das ".data" weg! Es ist ein (mehr oder weniger) einfaches 2D Array wobei die erste Dimension dnymisch ist und die Zweite statisch -> [i, j]
Delphi-Quellcode:
var
InfoStrStream: String; i, j: Integer; begin InfoStrStream := ''; for i := 0 to High(Info) do begin for j := 0 to High(Info[i]) do InfoStrStream := InfoStrStream + Info[i,j] + #9; // falls du das letzte #9 Element weg haben willst: // Delete(InfoStrStream, Length(InfoStrStream), 1); InfoStrStream := InfoStrStream + #13#10; end; end; |
AW: Problem mit CompressBuf
Zitat:
Zitat:
Du hast natürlich Recht , dass ich auf Info so nicht zugreifen kann. Es ist so, dass ich nicht den Original Code hier reinkopiert habe, weil der sehr viel komplexer ist. Da ich etwas von euch will, wollte ich euch nicht zumuten euch da durchzuarbeiten. Deshalb wollte ich den Code simplifizieren und habe mich dabei vertan. Im Original ist TInfo in etwa so deklariert
Delphi-Quellcode:
Tja, ich hätte das was ich reingetippt habe einfach nur mal ins Programm kopieren müssen und F9 hätte mir das Gleiche gesagt wie du.
type
TInfo=Record data:TData; ... end; Peinlich! Zitat:
Natürlich könnte ich es ab Schluß wieder entfernen, aber das ca. 20000 Mal, weil Info etwa 20000 Records hat, und am Ende jedes Records kein Tab stehen soll sonder ein CRLF. Nicht wie du es vorschlägst nur einmal am Ende aller Daten. Hinzu kommt, dass ich es nicht gut finde etwas in den String reinzuschreiben, um es dann wieder zu löschen, aber das ist Geschmackssache. Zitat:
Vielen Dank, Apton, für die Mühe die du dir (wegen meines Fehlers - Sorry!) machtest, um weiterzuhelfen. Aber s war schon korrekt gefüllt. Mit dem Fehler den ich hier reigetippt habe wäre das gar nicht gelaufen, also wäre ich auch nie bis zum CompressBuf gekommen. Sorry!!! Problem weiter ungelöst. |
AW: Problem mit CompressBuf
Achso joa, man weiß ja nicht, ich schau mir nicht wirklich die Namen an sondern nur die Probleme und da hat das eben deswegen so gewirkt :P
Zitat:
Ja dann liegt ja das ganze Problem beim CompressBuf(); Hast du dir die Hilfe dazu gelesen? Hast du wirklich alle Parameter richtig übergeben? |
AW: Problem mit CompressBuf
|
AW: Problem mit CompressBuf
Achso, probier mal
Delphi-Quellcode:
// einfach ohne @
CompressBuf(s[1],Length(s)*2,p,n); |
AW: Problem mit CompressBuf
Zitat:
Ich hab auch mal geschaut, was die -6 in der Fehlermeldung bedeutet. Z_VERSION_ERROR = -6; Aus einem Beitrag von himitsu lernte ich: Zitat:
Funktionierte ebenfalls nicht. Da kam keine Fehlermeldung, aber das ganze hat sich wohl irgendwie aufgehängt. Nach 2 Minuten bei voller CPU-Leistung hab ich's dann abgeschossen. Das Gleiche passierte, als ich ZCompressStr aus der System.ZLib probierte. |
AW: Problem mit CompressBuf
Zitat:
CompressBuf erwartet einen Pointer. |
AW: Problem mit CompressBuf
Wenn die Fehlermeldung Z_VERSION_ERROR lautet, dann deutet das für mich auf einen Pfad-Konfikt hin. Am Anfang von CompressBuf steht doch
Delphi-Quellcode:
Dort wird also vermutlich die Version geprüft. Wenn da etwas nicht stimmt, dann denke ich, dass die *.obj-Dateien nicht zur verwandten ZLib.pas passen. Also werden die *.obj-Dateien vermutlich aus einem anderen Pfad gelesen (z.B. aus dem Pfad von Indy). Ich würde mal bei der Import-Reihenfolge suchen.
CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)));
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz