AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit CompressBuf

Ein Thema von Amateurprofi · begonnen am 11. Mai 2012 · letzter Beitrag vom 12. Mai 2012
Antwort Antwort
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#1

Problem mit CompressBuf

  Alt 11. Mai 2012, 17:51
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?
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: Problem mit CompressBuf

  Alt 11. Mai 2012, 18:14
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;
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (11. Mai 2012 um 18:18 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Problem mit CompressBuf

  Alt 11. Mai 2012, 21:30
Es sieht so aus, als ob du nicht wüsstest, was du da machst:]
Das scheint nur so!

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!

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.

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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Problem mit CompressBuf

  Alt 11. Mai 2012, 21:37
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

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?
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Problem mit CompressBuf

  Alt 11. Mai 2012, 21:40
CompressBuf für String

Das sollte Dir in deinem Fall weiter helfen
Lars
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Problem mit CompressBuf

  Alt 11. Mai 2012, 21:42
Achso, probier mal
Delphi-Quellcode:
// einfach ohne @
  CompressBuf(s[1],Length(s)*2,p,n);
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Problem mit CompressBuf

  Alt 11. Mai 2012, 23:26
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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#8

AW: Problem mit CompressBuf

  Alt 11. Mai 2012, 23:27
Achso, probier mal
Delphi-Quellcode:
// einfach ohne @
  CompressBuf(s[1],Length(s)*2,p,n);
Nee, das geht nicht.
CompressBuf erwartet einen Pointer.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#9

AW: Problem mit CompressBuf

  Alt 12. Mai 2012, 11:42
Wenn die Fehlermeldung Z_VERSION_ERROR lautet, dann deutet das für mich auf einen Pfad-Konfikt hin. Am Anfang von CompressBuf steht doch
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 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