Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String komprimieren (https://www.delphipraxis.net/18246-string-komprimieren.html)

SleepyMaster 16. Mär 2004 14:51


String komprimieren
 
Hi ihrs!

Kann mir mal jemand helfen diesen Code so umzuschreiben, dass ich damit Strings gepackt bekomme???
Mit Pointer hab ichs echt überhauptnicht!

Delphi-Quellcode:
uses
  ZLib;

procedure CompressStream(inpStream, outStream: TStream);
var
  InpBuf, OutBuf: Pointer;
  InpBytes, OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, inpStream.Size);
    inpStream.Position := 0;
    InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
    CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
    outStream.Write(OutBuf^, OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;
Ich hab folgendes Probiert: (Nur um zu zeigen, dass ich es wenigstens versucht hab :) )

Delphi-Quellcode:
function CompressString(input:string):string;
var
  InpBuf, OutBuf: Pointer;
  OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, Length(input));
    Move(input[1], InpBuf^, Length(input));
    CompressBuf(InpBuf, Length(input), OutBuf, OutBytes);
    SetLength(result,OutBytes);
    Move(OutBuf^, result[1], OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;
[Edit]Zwei Fehler schon mal selber gefunden :) Es läuft!!![/Edit]

Vielen Dank!

Luckie 16. Mär 2004 15:11

Re: String komprimieren
 
Wäre nett, wenn du uns die Fehler mitteilen würdest, dann muss der nächste sie nicht selber in deinem Code suchen.

SleepyMaster 16. Mär 2004 15:14

Re: String komprimieren
 
Ich hatte sie schon im Code korrigiert.

Aber ich hier jetzt mal auch noch die Funktion zum ENTpacken des Strings:

Delphi-Quellcode:
uses
  ZLib;

function CompressString(input:string):string;
var
  InpBuf, OutBuf: Pointer;
  OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, Length(input));
    Move(input[1], InpBuf^, Length(input));
    CompressBuf(InpBuf, Length(input), OutBuf, OutBytes);
    SetLength(result,OutBytes);
    Move(OutBuf^, result[1], OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;

function DeCompressString(input:string):string;
var
  InpBuf, OutBuf: Pointer;
  OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, Length(input));
    Move(input[1], InpBuf^, Length(input));
    DeCompressBuf(InpBuf, Length(input),0,OutBuf, OutBytes);
    SetLength(result,OutBytes);
    Move(OutBuf^, result[1], OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;

Vision 21. Jul 2004 13:39

Re: String komprimieren
 
hallo zusammen,

hab ein "kleines" :wall: problem mit dieser funktion:

Delphi-Quellcode:
function DeCompressString(input:string):string;
var
  InpBuf, OutBuf: Pointer;
  OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, Length(input));
    Move(input[1], InpBuf^, Length(input));
    DeCompressBuf(InpBuf, Length(input),0,OutBuf, OutBytes);
    SetLength(result,OutBytes);
    Move(OutBuf^, result[1], OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;
end;
Unter normalen Umständen funktioniert diese Funktion tadellos.
Falls ich aber nun ein Programm habe, das gleichzeitig ca. 40 Threads am laufen hat
und alle gleichzeitig einen String entpacken gibt es ab und zu (bisher gemessen ca. alle 6500 mal)
einen Fehler bei der Zeile "FreeMem(outBuf)". Und zwar generiert er dort die
Fehlermeldung "Invalid pointer operation".

Was könnte hier das problem sein? Hab langsam echt keine Ahnung mehr... :gruebel:

[edit=sakura] [delphi]Tags Mfg, sakura[/edit]

SleepyMaster 27. Jul 2004 17:56

Re: String komprimieren
 
Könntest du evtl. mal ein bissel Code posten??? Danke


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