Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Problem mit CompressBuf (https://www.delphipraxis.net/168262-problem-mit-compressbuf.html)

Amateurprofi 11. Mai 2012 17:51

Problem mit CompressBuf
 
Ich mache folgendes :

Delphi-Quellcode:
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;
... Und bekomme die Fehlermeldung :
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?

Aphton 11. Mai 2012 18:14

AW: Problem mit CompressBuf
 
Es sieht so aus, als ob du nicht wüsstest, was du da machst:

Delphi-Quellcode:
// snip
  {1} s:=s+Info[i].data[Low(data)];
  {2} for j:=Low(TData)+1 to High(TData)
// snip
1. Du kannst per "." nicht auf die Elemente dieses Arrays zugreifen, denn der Typ (= String) beinhaltet keine weiteren Elemente (so wie Data)

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;

Amateurprofi 11. Mai 2012 21:30

AW: Problem mit CompressBuf
 
Zitat:

Zitat von Aphton (Beitrag 1166154)
Es sieht so aus, als ob du nicht wüsstest, was du da machst:]

Das scheint nur so!

Zitat:

Zitat von Aphton (Beitrag 1166154)
1. Du kannst per "." nicht auf die Elemente dieses Arrays zugreifen, denn der Typ (= String) beinhaltet keine weiteren Elemente (so wie Data):]


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:
type
   TInfo=Record
      data:TData;
      ...
   end;
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.
Peinlich!

Zitat:

Zitat von Aphton (Beitrag 1166154)
2. Warum nicht direkt das erste Element in derselben Funktion mit einbeziehen (und mit 0 anfangen)?

Eben, weil ich das letzte Tab nicht drinhaben will.
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:

Zitat von Aphton (Beitrag 1166154)
3. Du hast vergessen, s am Anfang zu initialisieren!):]

Nein! Lokale Strings in einer Prozedur sind immer initialisiert = leere Strings.

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.

Aphton 11. Mai 2012 21:37

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:

Eben, weil ich das letzte Tab nicht drinhaben will.
Nun, wenn du es so machst, wie bisher, dann haste wieder (diesmal) vor der Schleife ne extra Zuweisung, bei meinem Code nach der Schleife. Eleganter ists in meinen Augen deswegen, weil ich mit den Indizes nicht rumspielen muss (+1, -1 kann manchmal verwirrend sein). So gesehen - Geschmackssache!

Ja dann liegt ja das ganze Problem beim CompressBuf();
Hast du dir die Hilfe dazu gelesen? Hast du wirklich alle Parameter richtig übergeben?

daywalker9 11. Mai 2012 21:40

AW: Problem mit CompressBuf
 
CompressBuf für String

Das sollte Dir in deinem Fall weiter helfen

Aphton 11. Mai 2012 21:42

AW: Problem mit CompressBuf
 
Achso, probier mal
Delphi-Quellcode:
// einfach ohne @
  CompressBuf(s[1],Length(s)*2,p,n);

Amateurprofi 11. Mai 2012 23:26

AW: Problem mit CompressBuf
 
Zitat:

Zitat von Aphton (Beitrag 1166176)
Ja dann liegt ja das ganze Problem beim CompressBuf();
Hast du dir die Hilfe dazu gelesen? Hast du wirklich alle Parameter richtig übergeben?

Ja, habe ich. Alles so wie es sein soll.

Ich hab auch mal geschaut, was die -6 in der Fehlermeldung bedeutet.
Z_VERSION_ERROR = -6;
Aus einem Beitrag von himitsu lernte ich:
Zitat:

Außerdem ist diese Funktion ist nur auf den AnsiString zugeschnitten, also nur bis Delphi 2006 / Turbo Delphi ordentlich funktionsfähig.?
Ich hab es dann mal mit einem AnsiString versucht.
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.

Amateurprofi 11. Mai 2012 23:27

AW: Problem mit CompressBuf
 
Zitat:

Zitat von Aphton (Beitrag 1166178)
Achso, probier mal
Delphi-Quellcode:
// einfach ohne @
  CompressBuf(s[1],Length(s)*2,p,n);

Nee, das geht nicht.
CompressBuf erwartet einen Pointer.

samso 12. Mai 2012 11:42

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:
CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)));
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz