Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Debugging Hilfe bei Hagens DEC, hier LHSZ.pas (https://www.delphipraxis.net/120382-debugging-hilfe-bei-hagens-dec-hier-lhsz-pas.html)

Assertor 10. Sep 2008 09:34


Debugging Hilfe bei Hagens DEC, hier LHSZ.pas
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DPler,

ich arbeite gerade etwas an der DEC. Aktuell Sitze ich vor der LHSZ.pas. Für alle, die es nicht wissen: Es ist eine schlanke, effektive Unit für Hufmann-Kompression mit optionaler Verschlüsselung.

Die original Unit läuft nur bis ~ D7, darüber knallt es mit AVs, die ich soweit beheben konnte: Im Vergleich zu Hagens Original habe ich die Chars-Deklaration auch im Inflate Record hinzugefügt, da dieser hier fehlte.

Das Problem ist nun, daß die Inflate-Funktion scheinbar einen Bug hat, der nur > D7 zum Tragen kommt. Im Debugger sehe ich schon mal, daß in LH.Data nie ein Wert geschrieben wird. Die Frage ist, warum?

Kann das bitte mal jemand Testen?

Code zum Testen der LHSZ.pas:
Delphi-Quellcode:
procedure Test;
var
  Key, PlainText: String;
  CipherText: String;
  Data: Pointer;
  Res: Integer;
begin
  PlainText := 'יהורם גאון test test test test test test test test test test test test';
  Key := 'testpw';

  try
    Res := LHCheck(LHEncodeBuffer(Key, PlainText , Length(PlainText) * SizeOf(PlainText[1]), Data));
    try
      SetString(CipherText, PChar(Data), Res);
      ShowMessage(CipherText);
    finally
      FreeMem(Data);
    end;
  except
    on E: Exception do
      ShowMessage('Error: ' + E.Message);
  end;

  try
    Res := LHCheck(LHDecodeBuffer(Key, CipherText , Length(CipherText) * SizeOf(CipherText[1]), Data));
    try
      SetString(PlainText, PChar(Data), Res);
      ShowMessage(PlainText); // hier wird nur ein sehr großer ~ 1400/6000 Char großer Leertext ausgegeben, da Data leer ist
    finally
      FreeMem(Data);
    end;
  except
    on E: Exception do
      ShowMessage('Error: ' + E.Message);
  end;

end;
Anbei auch meine Testversion der LHSZ.pas.

Gruß Assertor

Assertor 11. Sep 2008 09:51

Re: Debugging Hilfe bei Hagens DEC, hier LHSZ.pas
 
Hallo,

nächster Tag. Mal der Hintergrund: Ich möchte gerne DEC D2009 lauffähig bekommen und will gewissenhaft alle Sourceteile prüfen. LHSZ.pas läuft nicht unter D2006, also stecke ich hier fest.

Ist jemand bereit zu helfen?

Gruß Assertor

toms 11. Sep 2008 09:58

Re: Debugging Hilfe bei Hagens DEC, hier LHSZ.pas
 
Hallo Assertor

Ich habe die Test Prozedur kurz unter D6 getestet. Auch dort wird nur ein Leertext ausgegeben.

Delphi-Quellcode:
ShowMessage(PlainText); // hier wird nur ein sehr großer ~ 1400/6000 Char großer Leertext ausgegeben, da Data leer ist

Assertor 11. Sep 2008 10:07

Re: Debugging Hilfe bei Hagens DEC, hier LHSZ.pas
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo toms,

Zitat:

Zitat von toms
Ich habe die Test Prozedur kurz unter D6 getestet. Auch dort wird nur ein Leertext ausgegeben.

Ok, dann steckt in der Version schon ein Fehler...

Vielen Dank fürs Testen!

Anbei mal die "original" LHSZ.pas von Hagen. Kannst Du die bitte kurz einsetzen und das Projekt neuerstellen (oder die .dcu vorher löschen)?

Gruß Assertor

toms 11. Sep 2008 10:09

Re: Debugging Hilfe bei Hagens DEC, hier LHSZ.pas
 
Bei der original kommt dieser Fehler:

Zitat:

---------------------------
Project1
---------------------------
Error: Error in LHSZ library
---------------------------
OK
---------------------------

Assertor 11. Sep 2008 10:11

Re: Debugging Hilfe bei Hagens DEC, hier LHSZ.pas
 
Hi Toms,

ok, vielen Dank fürs Testen! Zurück ans Zeichenbrett also ;)

Gruß Assertor

negaH 11. Sep 2008 16:37

Re: Debugging Hilfe bei Hagens DEC, hier LHSZ.pas
 
Ok, in TLHInflate fehlt wirklich die Deklaration von Chars.

Mache mal folgendes:

1. schmeiße PLHInflate/TLHInflate komplett aus dem Source raus
2. in LHDecode benutzt du nun SizeOf(TLHData) statt TLHInflate

so kostet es bei LHDecode() nur par zusätzlich allozierte Bytes im dynamischen Speicher die dann ungenutzt wären, also alle Felder in TLLHData ab .Head[].
Ich hätte gleich Abstand von der Idee nehmen sollen mit zwei fast identischen Records zu arbeiten und statt dessen mit einer Union arbeiten sollen.


Und dann noch

Delphi-Quellcode:
{$IFOPT O+}
  {$DEFINE UseASM}
{$ENDIF}
abändern in

Delphi-Quellcode:
{$IFOPT O+}
  {$DEFINE _UseASM}
{$ENDIF}
Das deaktiviert permanet die Verwendung des Assembler Codes und stattdessen wird pure PASCAL Source compiliert. Hat natürlich den Nachteil das der Compiler ineffizienteren Code erzeugt, also mehr Code verbraucht und langsammer ist.

Gruß Hagen

Assertor 11. Sep 2008 18:27

Re: Debugging Hilfe bei Hagens DEC, hier LHSZ.pas
 
Hi Hagen,

Zitat:

Zitat von negaH
Mache mal folgendes:

1. schmeiße PLHInflate/TLHInflate komplett aus dem Source raus
2. in LHDecode benutzt du nun SizeOf(TLHData) statt TLHInflate

Wir verstehen uns beide ;) Hatte ich schon im jetzigen Test hier genau so ausprobiert, auch UseAsm war bei mir schon aus.

Nur hab ich:
Delphi-Quellcode:
{$IFOPT O+}
  {.$DEFINE UseASM}
{$ENDIF}
gemacht.

Gleiches Ergebnis: Leerer Outputstring...

Gruß Assertor


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 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