Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi LZW Komprimierung für texte - zugriffsverletzung (https://www.delphipraxis.net/138964-lzw-komprimierung-fuer-texte-zugriffsverletzung.html)

qwertz543221 20. Aug 2009 16:45


LZW Komprimierung für texte - zugriffsverletzung
 
Liste der Anhänge anzeigen (Anzahl: 2)
ich habe versucht, texte mit dem sequitur-algorithmus zu komprimieren
dafür soll es eine prozedur quicksort und eine proceudre binarysearch für arrays geben.
das array soll als wörterbuch genutz werden.

wenn ich allerdings versuche den normalen quicksort für zahlen (functioniert) auf arrays anzuwenden habe ich speicherzugriffprobleme.

hat jemand eine idee woran das liegen könnte? - zugriffsverletzungen passieren ja meist bei fehlgeleiteten zeigern...

ps.: im moment nutze ich noch arrays, doch ich habe vor, das hganze zu doppelt verketteten listen umzugestalten. hat das vorteile oder ist es prinzipiell egal?


den bisherigen quelltext findet ihr im anhang



danke für jede konstuktive bemerkung, außer dass meine procedure sequitur heißt (das war die kompression die ich zuerst versucht hatte)

gammatester 21. Aug 2009 10:33

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Zitat von qwertz543221
danke für jede konstuktive bemerkung, außer dass meine procedure sequitur heißt (das war die kompression die ich zuerst versucht hatte)

Das sollte sich eigentlich von selbst verstehen: Benutzte den Debugger und schalte alle Checks ein, insbesondere Rangecheck, Overflowcheck.

Ich hätte mindestens drei offensichtliche Bugs/Anmerkungen, aber nach dem CRT/RSA-Desaster warte ich lieber erst mal ab, ob überhaupt Fortschritte sichtbar sind.

Gammatester

Luckie 21. Aug 2009 12:08

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Bist du mit Hansa verwandt? Der hat seine Screenshots auch immer in Word Dokumente verpackt. Was soll diese Unsitte?

Der Fehler wird wohl in deinem Quicksort Algorithmus liegen. Warum postets du ihn nicht?

qwertz543221 21. Aug 2009 14:08

Re: LZW Komprimierung für texte - zugriffsverletzung
 
die quicksort-procedure schicke ich später bin zzt noch nicht daheim.
sie soll später noch geändert werden, damit sie auf doppelt verketteten listen läuft.
bisher hat sie aber keine falschen ergebnisse geliefert.

wie soll ich screenshots denn veröffentlichen? - welche methode gibt es noch?

himitsu 21. Aug 2009 14:16

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Zitat von qwertz543221
wie soll ich screenshots denn veröffentlichen? - welche methode gibt es noch?

vielleicht als Bild? (JPeg, GIF, PNG ...)

qwertz543221 21. Aug 2009 14:52

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
dd=record
zahl:longint;
s:string;
end;
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Edit3: TEdit;
    Label3: TLabel;
    procedure Button6Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Memo1Change(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure write;
    procedure init;
    procedure Quicksort ( l,r: longint);
    function BinSearch(a: array of longint; x: longint): longint;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  ar:array of longint;

implementation

{$R *.dfm}

function tform1.BinSearch(a: array of longint; x: longint): longint;
var
  anfang,ende,pivot:longint;
  fund:Boolean;
begin
if x>a[length(a)-1]
  then
  begin
  result:=-1;
  exit;
  end
  else
  begin
  anfang:= 0;
  ende:= length(a);
  fund:= False;
  Result := -1;

  while anfang<= ende) and (found=false) do
  begin
    Pivot := ((anfang + ende) div 2)mod length(a);
    if a[Pivot] = x then
    begin
      Found := True;
      Result := Pivot+1;
    end
    else if a[Pivot] > x then
      ende := Pivot - 1
    else
      anfang := Pivot + 1;
  end;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i,j,x,max:longint;
begin
memo1.Clear;
max:=strtoint(edit1.text);
i:=strtoint(edit2.Text);
setlength(ar,i);
randomize;
j:=0;
while j<i do
begin
x:=random(max)+1;
ar[j]:=x;
memo1.Lines.Add(inttostr(ar[j]));
j:=j+1;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
memo1.Clear;
edit1.Clear;
edit2.Clear;
end;

procedure tform1.init;
var i:longint;
begin
i:=0;
setlength(ar,strtoint(edit2.text));
while i<length(ar) do
begin
ar[i]:=(strtoint(memo1.Lines[i]));
i:=i+1;
end;
end;


procedure tform1.write;
var i:longint;
 begin
 i:=0;
 memo1.Clear;
while i<length(ar) do
begin
memo1.Lines.add(inttostr(ar[i]));
i:=i+1;
end;
end;

PROCEDURE tform1.Quicksort (l,r: longint);
VAR pivot,b,i,j : longint;

BEGIN
   IF l < r THEN
   BEGIN
      pivot := Ar[random(r-l) + l+1];
      i := l-1;
      j := r+1;
         while i<j do
         begin
      REPEAT i := i+1 UNTIL pivot <= ar[i];
      //while (pivot>ar[i])do i:=i+1;
            REPEAT j := j-1 UNTIL pivot >= ar[j];
            b:=Ar[i];
            Ar[i]:=Ar[j];
            Ar[j]:=b
      //UNTIL i >= j;
      end;

      Ar[j]:=Ar[i];
      Ar[i]:=b;

      Quicksort(l,i-1);
      Quicksort(i,r)
   END;
END;



procedure TForm1.Button2Click(Sender: TObject);
var s,t:cardinal;
begin
s:=gettickcount;
init;
bubblesort;
t:=gettickcount;
showmessage(inttostr(t-s));
end;

procedure TForm1.Memo1Change(Sender: TObject);
begin
edit2.Text:=inttostr(memo1.lines.Count);
end;

procedure TForm1.Button4Click(Sender: TObject);
var s,t:cardinal;
begin
s:=gettickcount;
init;
quicksort(0,length(ar));;
t:=gettickcount;
showmessage(inttostr(t-s));
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
write;
end;

procedure TForm1.Button6Click(Sender: TObject);
var x:longint;
begin
x:=strtoint(edit3.Text);
init;
quicksort(0,length(ar));
showmessage(inttostr(binsearch(ar,x)));
end;

end.

p80286 21. Aug 2009 15:41

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Hallo Qwertz543221,

wenn Du Deinen Source etwas sinnvoll formatiert hättest, wäre es etwas einfacher da durchzusteigen.

Und auch wenn Du den Namen einer globalen Variablen änderst, dann bleibt sie doch eine.
(Und jetzt hab auch ich verstanden warum sie so bäh bäh sind!)

Und viel wichtiger ich hab da erst einmal nichts zu LZW gefunden.
(Naja ich lese auch nicht gerne Basic-Sourcen)

[edit]
das da oben kann gar nicht kompiliert werden!
und das
Delphi-Quellcode:
strtoint(edit1.text);
ist zumindestens sehr optimistisch!
Gruß
K-H

qwertz543221 24. Aug 2009 15:14

Re: LZW Komprimierung für texte - zugriffsverletzung
 
hallo

was meinst du mit sinnvoll formatieren? zwischen den fkts und prods sind abschnitte
deklarationen findest du ganz oben und im wesentlichen sind es nur drei prods - binsearch, quicksort, write - von denen ich ausging, dass die titel sich selbst erklären: binäre suche, quicksort und eine ausgabeprozedur.

Der rest sind die aufrufe dieser durch buttons. das war eigentlich alles was im code steht.


zum inhalt des codes:
luckie:
Zitat:

#3|Verfasst am: 21.08.2009, 13:08 Titel: Re: LZW Komprimierung für texte - zugriffsverletzung

Der Fehler wird wohl in deinem Quicksort Algorithmus liegen. Warum postets du ihn nicht?
dazu habe ich die notwendigen teile eingestellt, denn wie luckie schreibt, ist er der meinung, dass die fehler im qs- algorithmus versteckt seien.



an luckie (und die anderen):
und - habe ich einen gravierenden fehler in den qs- teil eingebaut?, bisher konnte ich keinen entdecken, aber zwei augen sehen meist nicht genug;)

gammatester 24. Aug 2009 15:45

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Zitat von qwertz543221
an luckie (und die anderen):
und - habe ich einen gravierenden fehler in den qs- teil eingebaut?, bisher konnte ich keinen entdecken, aber zwei augen sehen meist nicht genug;)

Vielleicht solltest Du den Code (wie oben schon 'mal frech vorgeschlagen wurde) erst einmal so schreiben, daß man ihn compilieren kann. Wenn Du ihn nur selbst benutzt, mußt Du ihn ja auch nicht vernünftig formatieren (ist nur was für Schwächlinge). Dann kanst Du auch den Debugger benutzen und feststellen, was die Zugriffsverletzungen erzeugt. Kleiner Hinweis: ein Fehler in einer Prozedur kann durch falschen Code oder durch falschen Aufruf erzeugt werden.

Gammatester

qwertz543221 24. Aug 2009 17:43

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Wenn Du ihn nur selbst benutzt, mußt Du ihn ja auch nicht vernünftig formatieren (ist nur was für Schwächlinge).
das hat mir jetzt leider nicht gesagt, was an der formatierung genau falsch ist

und... polemik hilft keinem




hier die angezeigte fehlermeldung(zugriffsverletzung)
"zugriffsverletzung bei adresse 00403F30 im modul 'prj1.exe'. lesen von adresse 0000000A."



ps. was ist an globalen variablen verkehrt?



beim debuggen ist folgendes
[quote]
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
{/quote]


im aufruf stack

00403568 notify nondelphiexception +$1C

p80286 24. Aug 2009 18:05

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Hallo QWERTZ543221,

als Denkanstoß:

(das Original:)

Delphi-Quellcode:
function tform1.BinSearch(a: array of longint; x: longint): longint;
var
  anfang,ende,pivot:longint;
  fund:Boolean;
begin
if x>a[length(a)-1]
  then
  begin
  result:=-1;
  exit;
  end
  else
  begin
  anfang:= 0;
  ende:= length(a);
  fund:= False;
  Result := -1;

  while anfang<= ende) and (found=false) do
  begin
    Pivot := ((anfang + ende) div 2)mod length(a);
    if a[Pivot] = x then
    begin
      Found := True;
      Result := Pivot+1;
    end
    else if a[Pivot] > x then
      ende := Pivot - 1 
    else
      anfang := Pivot + 1;
  end;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i,j,x,max:longint;
begin
memo1.Clear;
max:=strtoint(edit1.text);
i:=strtoint(edit2.Text);
setlength(ar,i);
randomize;
j:=0;
while j<i do
begin
x:=random(max)+1;
ar[j]:=x;
memo1.Lines.Add(inttostr(ar[j]));
j:=j+1;
end;
end;
(und etwas hübscher:)
Delphi-Quellcode:
function tform1.BinSearch(a: array of longint; x: longint): longint;
var
  anfang,ende,pivot:longint;
  fund:Boolean;
begin
  if x>a[length(a)-1] then
  begin
    result:=-1;
    exit;
  end
  else
  begin
    anfang:= 0;
    ende:= length(a);
    fund:= False;
    Result := -1;
    while anfang<= ende) and (found=false) do
    begin
      Pivot := ((anfang + ende) div 2)mod length(a);
      if a[Pivot] = x then
      begin
        [b]Found [/b] := True;
        Result := Pivot+1;
      end
      else
        if a[Pivot] > x then
          ende := Pivot - 1 
        else
          anfang := Pivot + 1;
    end;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  i,j,x,max:longint;
begin
  memo1.Clear;
  max:=strtoint(edit1.text); // Was ist wenn hier Buchstaben drin sind??
  i:=strtoint(edit2.Text);   // Was ist wenn hier Buchstaben drin sind??
  setlength(ar,i);
  randomize;
  j:=0;
  while j<i do
  begin
    x:=random(max)+1;
    ar[j]:=x;                // ar ist globale var in dieser Unit
    memo1.Lines.Add(inttostr(ar[j]));
    j:=j+1;
  end;
end;
Wo kommt, dieses Found her? Definiert hast Du Fund !!
Da gibt es keine Fehlermeldung????

Gruß
K-H

qwertz543221 24. Aug 2009 20:03

Re: LZW Komprimierung für texte - zugriffsverletzung
 
danke für den tip
das mit der variable found ist ein schreibfehler gewesen beim abtippen


da ich im momen nur zahlen sortieren will, benötige ich zzt noch keine exception dafür dass buchstaben eingegeben wurden. trotzdem danke für den hinweis.

beim nächsten mal will ich auf formatierung achten - habe damit eigentlich selbst kein problem


nun zu der fehlermeldung, die ich angesproceh hatte ( zugriffsverletzung....) - hast du / habt ihr eine idee woran das liegen könnte?

gammatester 24. Aug 2009 20:38

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Polemik beiseite: Wenn man den nicht übersetzbaren Code entfernt, die StrToInt-Problematik mit fixen Werten (zB 1000 für max, und setlength(ar,10) umschifft, RangeCheck und Debugging einschaltet und compiliert, gibt's als ersten eine Warnung:

[Warning] Unit1.pas: Variable 'b' might not have been initialized
ar[j]:=ar[i];
ar[i]:=b;

Was soll das? Willst Du da noch mal tauschen und hast eine Zeile vergessen? Lassen wird uns also nicht ablenken und drücken Run. Und bumm!

Range Check error in Zeile
repeat j := j-1 until pivot >= ar[j];

Was kann das wohl sein. Und wieso tritt das auf?

So, jetzt noch was zur Formatierung und zu globalen Variablen.

Wie schon gesagt (und nicht nur ironisch): Wenn Du Code nur für Dich schreibst, ist es relativ wurscht wie er aussieht. Nur darfst Du nicht erwarten, daß andere Leute sich an ihm erfreuen und gern damit arbeiten. Falls Du ernsthaft vorhast, besser lesbaren Quellcode zu schreiben, such mal nach Style-Guide (als erste Näherung, nicht daß das unbedingt perfekt wäre).

Globale Variable - Hier: Was nützt Dir eine Quicksort-Routine, die nur ein bestimmtes (Longint-)Array sortieren kann? Was machst Du, wenn Du zwei Arrays sortieren willst? Zwei Quicksort-Routinen schreiben?


Gammatester

qwertz543221 24. Aug 2009 20:57

Re: LZW Komprimierung für texte - zugriffsverletzung
 
die variable b ist nur lokal für bubblesort - den hab cih einfach so geschireben, brauche ich durch qs jedoch nicht
Delphi-Quellcode:
procedure tform1.bubblesort;

var i,a,b,c:longint; //hier ist b doch deklariert
begin

i:=0;
while i<length(ar) do

begin
a:=ar[i];
b:=ar[i+1]; //und bekommt hier einen wert zugewiesen, um den tausch zu vollziehen

if a<=b
  then i:=i+1
    else
    begin
{tauschen}
    c:=a;
    a:=b;
    b:=c;
//neu zuweisen
    ar[i]:=a;
    ar[i+1]:=b;
    i:=i+1;
    end;

end;
i:=1;
while i<length(ar) do

begin
if ar[i-1]<=ar[i]
  then i:=i+1
    else bubblesort;
 end;

 i:=0;      
 memo1.Clear;
 end;

im moment reicht die funtion mit dem array - ich hatte bereits versucht das array als parameter zu übergeben, damit ich beliebige array sortieren könnte, doch das hat die funtkion (umgeschirben) nicht gemocht. ich denke jedoch dass das nicht unbedingt notwendig ist - vlt später einmal


Zitat:

Was soll das? Willst Du da noch mal tauschen und hast eine Zeile vergessen? Lassen wird uns also nicht ablenken und drücken Run. Und bumm!

Range Check error in Zeile
repeat j := j-1 until pivot >= ar[j];

Was kann das wohl sein. Und wieso tritt das auf
wenn ich den code jetzt ausführe passiert nichts besonderes - er gibt das sortierte array ordnungsgemäß aus - geändert habe ich nichts

hoika 24. Aug 2009 21:23

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Hallo,

viel Code is in der Zwischenzeit rumgeändert worden.

Hänge bitte mal den geänderten Code in einem neuen Posting (ZIP, ohne Exe)
noch mal an.


Heiko

gammatester 24. Aug 2009 21:23

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Zitat von qwertz543221
die variable b ist nur lokal für bubblesort - den hab cih einfach so geschireben, brauche ich durch qs jedoch nicht

Nein! Der ist in auch Quicksort:
Delphi-Quellcode:
PROCEDURE tform1.Quicksort (l,r: longint);
VAR pivot,b,i,j : longint;
sowie in der von mit gezeigten Zeile. Und vermutlich völlig falsch - kein Wunder wenn er 'einfach so' von Bubblesort herrührt!

Zitat:

Zitat von qwertz543221
wenn ich den code jetzt ausführe passiert nichts besonderes - er gibt das sortierte array ordnungsgemäß aus - geändert habe ich nichts

Nein! Hast Du Debugging eingeschaltet? Sind blaue Punkte neben den Sourcecodezeilen? Hast Du Rangecheck eingeschaltet? Hast "Stop on Delphi Execptions" in den Debuggeroptionen eingeschaltet? Wenn Du alles mit ja beantwortest, benutzt Du eine andere Fassung des Quellcodes - was nicht verwunderlich wäre, da Du ja offensichtlich auch fehlerhaft vorgestellten Quellcode übersetzen konntest (vgl Fund/Found).

Gammatester

qwertz543221 25. Aug 2009 16:59

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hast Du Debugging eingeschaltet ? ja.

Sind blaue Punkte neben den Sourcecodezeilen? ja.

rangecheck? ja.
fehlermeldung in zeile 51:
Delphi-Quellcode:
 REPEAT j := j-1 UNTIL pivot >= wb[j].index;
"Fehler bei der bereichsprüfung"


stop on delphi exceptions? - weiß ich nicht wo das geht...


den jetzigen code im anhang, wie von heiko gewünscht.

p80286 25. Aug 2009 17:41

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Hallo QWERTZ543221,

ich hab mir Deinen code angetan,
er wird unter D7 compiliert
wenn ich Button2 clicke passiert nichts( erst recht kein Fehler!)
wenn ich Button1 clicke, bekomme ich einen Fewhler in Zeile 166:

Delphi-Quellcode:
...
 else
    begin
    //ersetzen
      x:=wb[hsh].text+x; {-- Bumm!!}
      hsh:=hash(x);
      if hsh>length(wb)
        then setlength(wb,hsh+1);
      wb[hsh].text:=x;
      end;
i:=i+1;
end;
....
---------------------------
Project1
---------------------------
Zugriffsverletzung bei Adresse 00450209 in Modul 'Project1.exe'. Lesen von Adresse 0097E718.
---------------------------
OK
---------------------------

Da hsh den wert 21045 hat wundert mich das nicht!

Gruß
K-H

Zitat:

Zitat:
Wenn Du ihn nur selbst benutzt, mußt Du ihn ja auch nicht vernünftig formatieren (ist nur was für Schwächlinge).

qwertz543221 25. Aug 2009 17:59

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

if hsh>length(wb)
then setlength(wb,hsh+1);
müsste ich das voranstellen, vermutete ich mal; - doch das hat auch keine wirkung

gammatester 25. Aug 2009 19:07

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Zitat von qwertz543221
Zitat:

if hsh>length(wb)
then setlength(wb,hsh+1);
müsste ich das voranstellen, vermutete ich mal; - doch das hat auch keine wirkung

Hast Du eigentlich irgendeinen Plan? Oder 'ne Ahnung, was das bedeuten würde? (Siehe Punkt 2 unten).

So langsam fühle ich mich verarscht! Das ist doch fast wieder der gleiche Unsinnscode wie aus Deinem ersten Beitrag. Was hast Du uns denn in der Zwischenzeit gezeigt?

Und selbstverständlich erhalte ich einen Rangecheckfehler beim Aufruf von quicksort(1,length(wb)) in Zeile 113.

Wie in meinem ersten Beitrag leider richtig vermutet, scheint auch dieser Thread im Desaster zu enden. Und ehe ich mich darauf einlasse, hier noch mindestens vier Fehler, und das war's dann wahrscheinlich für mich:

1. Wie schon gesagt, das ELF-Hash ist 31-Bit-Vorzeichen behaftet, also benutzt Du Indizes von -2147483648 bis 2147483647, was geradezu um eine Accessviolation bettelt.

2. Binsearch liefert -1 falls nicht gefunden, Du vermutest wohl allerdings weiter unten das Binsearch=0 nicht gefunden bedeutet. Die nächste Katastrophe ist also vorprogrammiert. Leider scheinst Du immer noch nicht zu begreifen, daß es sich lohnt Parameter und Rückgabewerte von Funktionen (kurz) zu dokumentieren.

3. In Quicksort steht immer noch der Schrott
wb[j]:=wb[i];
wb[i]:=b;
nach der while Schleife.

4. Der Rangecheck-Fehler: Quicksort sortiert von wb[l] bis wb[r], bei Deinem Aufruf von wb[1] bis wb[length(wb)]. Bumm! Richtig wäre quicksort(Low(wb),High(wb)) oder gerade noch akzeptabel quicksort(0,length(wb)-1);

Gammatester

p80286 26. Aug 2009 16:56

Re: LZW Komprimierung für texte - zugriffsverletzung
 
@gammatester

Auch wenn Du recht hast, jetzt hast Du ihn verscheucht.
(Irgendwie hab ich das Gefühl, das ist alles wild zusammenkopiert)

Gruß
K-H

gammatester 26. Aug 2009 17:28

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Zitat von p80286
@gammatester

Auch wenn Du recht hast, jetzt hast Du ihn verscheucht.
(Irgendwie hab ich das Gefühl, das ist alles wild zusammenkopiert)

Gruß
K-H

Das glaube ich nicht. Diese Art von "Diskussion" haben wir schon in mindestens zwei weiteren Threads gehabt. Außerdem sind ja jetzt auch konkrete Hinweise auf die Bugs vorhanden. Leider erhält man manchmal kein Rückmeldung, ob die Probleme beseitigt sind, obwohl ich das in diesem Fall bezweifele.

Gruß Gammatester

qwertz543221 26. Aug 2009 20:56

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich denke jetzt sollte es funktionieren - probiert es mal aus

auch mit selbst erstellten arrays

gammatester 26. Aug 2009 22:00

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Zitat von qwertz543221
ich denke jetzt sollte es funktionieren - probiert es mal aus

auch mit selbst erstellten arrays

Hallo, gut daß Du Dich gemeldet hast. p80286's Beitrag hat bei mir schon fast ein schlechtes Gewissen erzeugt :wink:

Allerdings hat sich Dein Programmier- und Posting-Stil nicht geändert. Was ist so schwierig daran, .pas + .dfm + .dpr in ein ZIP zu packen :?: Ich befürchte fast, daß das wieder mal nicht der eigentliche Code ist. Aber um etwas guten Willen zu zeigen, gleich ohne Umschweife einige Fehler:

1. Unkompilierbar also gibt's nix auszuprobieren. Es fehlen
- Units.dfm
- in TForm1 = class(TForm): Edit1, Edit2, Edit3, memo1, Button2...Button8

2. Bubblesort greift auf ar[length(ar)] zu also BUMM!

3. In Quicksort steht immer noch der Schrott
wb[j]:=wb[i];
wb[i]:=b;
nach der while Schleife.

Gruß Gammatester

qwertz543221 27. Aug 2009 17:59

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die Rückmeldung. Doch möchte ich folgendes anmerken:

1)
Zitat:

Bubblesort greift auf ar[length(ar)] zu also BUMM!
im qt steht doch folgende schleife:
Delphi-Quellcode:
while i<length(ar) do //hier
begin
a:=ar[i];
b:=ar[i+1];
if a<=b
  then i:=i+1
    else
    begin
    c:=a;
    a:=b;
    b:=c;
    ar[i]:=a;
    ar[i+1]:=b;
    i:=i+1;
    end;
end;
dadurch, dass in der while schleife nicht "<=" steht, läuft sie bis length(ar)-1. Es macht auch nicht "BUMM!" - sondern es gibt die korrekte Reihenfolge aus.


2)
Zitat:

In Quicksort steht immer noch der Schrott
wb[j]:=wb[i];
wb[i]:=b;
nach der while Schleife.
=>hab ich rausgeworfen. - hat aber keine Auswirkung??

3) im anhang jetze eine zip mit dpr, dcu, pas, exe,dfm,dcu,cfg etc

gammatester 27. Aug 2009 20:23

Re: LZW Komprimierung für texte - zugriffsverletzung
 
Zitat:

Zitat von qwertz543221
Danke für die Rückmeldung. Doch möchte ich folgendes anmerken:

1)
Zitat:

Bubblesort greift auf ar[length(ar)] zu also BUMM!
im qt steht doch folgende schleife:
Delphi-Quellcode:
while i<length(ar) do //hier
begin
a:=ar[i];
b:=ar[i+1]; // ja und hier wird i+1 = length(ar) und BUMM!
dadurch, dass in der while schleife nicht "<=" steht, läuft sie bis length(ar)-1. Es macht auch nicht "BUMM!" - sondern es gibt die korrekte Reihenfolge aus.

Die Bedingung der While-Schleife lautet nicht "<=" sondern "<" und es macht BUMM! wie in meinem Kommentar beschrieben. Aber natürlich nur wenn Rangecheck eingeschaltet ist (was bei der leider mal wieder nicht der Fall ist).

Gammatester

PS: Scheint so, als wenn der "Schrott in Quicksort" notwendig ist, weil Du eine ungewöhnliche Implementation hats, die vor der While-Schleife i := l-1; und j := r+1; setzt und nach den repeats immer tauscht. Also lass Ar[j]:=Ar[i]; Ar[i]:=b; drin.

qwertz543221 28. Aug 2009 20:28

Re: LZW Komprimierung für texte - zugriffsverletzung
 
wie ist es denn möglich, doppelte einträge nach dem sortieren zu eliminieren?
habe es wie folgt versucht, doch leider ohne erfolg:
Delphi-Quellcode:

function tform1.clean(ar:sy):sy;
var i,j:int64;

begin
i:=0;
setlength(result.zahl,length(ar.zahl));
init(strtoint(edit1.Text));
quicksort(ar,low(ar.zahl),high(ar.zahl));

while i<high(ar.zahl) do
begin
if ar.zahl[i]<>ar.zahl[i+1]
  then
  begin
  result.zahl[i]:=ar.zahl[i];
  end
    else
    begin
    result.zahl[i]:=ar.zahl[i+1];
    end;
i:=i+1;
end;

write(result);
end;


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