AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi LZW Komprimierung für texte - zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

LZW Komprimierung für texte - zugriffsverletzung

Ein Thema von qwertz543221 · begonnen am 20. Aug 2009 · letzter Beitrag vom 28. Aug 2009
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#11

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 24. Aug 2009, 19:05
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
  Mit Zitat antworten Zitat
qwertz543221
(Gast)

n/a Beiträge
 
#12

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 24. Aug 2009, 21:03
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?
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#13

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 24. Aug 2009, 21:38
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
  Mit Zitat antworten Zitat
qwertz543221
(Gast)

n/a Beiträge
 
#14

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 24. Aug 2009, 21:57
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 24. Aug 2009, 22:23
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
Heiko
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#16

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 24. Aug 2009, 22:23
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 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
  Mit Zitat antworten Zitat
qwertz543221
(Gast)

n/a Beiträge
 
#17

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 25. Aug 2009, 17:59
Hast Du Debugging eingeschaltet ? ja.

Sind blaue Punkte neben den Sourcecodezeilen? ja.

rangecheck? ja.
fehlermeldung in zeile 51:  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.
Angehängte Dateien
Dateityp: zip lzw_151.zip (14,8 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#18

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 25. Aug 2009, 18:41
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).
  Mit Zitat antworten Zitat
qwertz543221
(Gast)

n/a Beiträge
 
#19

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 25. Aug 2009, 18:59
Zitat:
if hsh>length(wb)
then setlength(wb,hsh+1);
müsste ich das voranstellen, vermutete ich mal; - doch das hat auch keine wirkung
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#20

Re: LZW Komprimierung für texte - zugriffsverletzung

  Alt 25. Aug 2009, 20:07
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 18:49 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