Sortierverfahren(die dritte)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Eradikator
Beiträge: 33
Registriert: Sa 8. Jun 2013, 19:45

Sortierverfahren(die dritte)

Beitrag von Eradikator »

Hallo,

sorry wenn ich mit meinen Sortierverfahren nerve. Ich habe jetzt eine Prozedur für das Verfahren
Shellsort geschrieben, in der Insertionsort aufgerufen wird.

Code: Alles auswählen

 
procedure shellsort (feld : tstrings);
var
  h, indfeld, indhilfs, n : integer;
  hilfsfeld : tstrings;
begin
  h:=1;
  n:=feld.Count-1;
  while h<n do
  begin
    h:= 3*h + 1;
  end;
  while h>1 do
  begin
    indfeld:=0;
    repeat
      hilfsfeld.Add(feld[indfeld]);
      indfeld:=indfeld+h;
    until indfeld>n;
    insertionsort(hilfsfeld);
    for indhilfs:=hilfsfeld.Count-1 to 0 do
    begin
      feld.Delete(indfeld);
      feld.Insert(indfeld, hilfsfeld[indhilfs]);
      indfeld:=indfeld-h;
    end;
 
    h:=(h-1) div 3
  end;
   insertionsort(feld);
  end;       
 
Kompilieren lässt sich das Programm. Nur beim Ausführen der Prozedur erscheint die Meldung "Projekt hat Exceptionklasse External SIGSEGV ausgelöst"
Warum?

mit freundichen Grüßen

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Sortierverfahren(die dritte)

Beitrag von Socke »

Eradikator hat geschrieben:Kompilieren lässt sich das Programm. Nur beim Ausführen der Prozedur erscheint die Meldung "Projekt hat Exceptionklasse External SIGSEGV ausgelöst"
Warum?
Dieser Fehler tritt auf, wenn dein Programm auf einen Speicherbereich zugreift, der ihm nicht durch das Betriebssystem zugeteilt wurde.

Lösung: Stift und Papier auspacken und die Funktion von Hand durchlaufen. Alternativ kannst du den Debugger verwenden. Spätestens dann sollte dir auffallen, dass du vermutlich ungültige Indizes verwendest.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Eradikator
Beiträge: 33
Registriert: Sa 8. Jun 2013, 19:45

Re: Sortierverfahren(die dritte)

Beitrag von Eradikator »

Moin,

alles klar.
Einfügen von hilfsfeld := tstringlist.create am Anfang und hilfsfeld.free am Ende der Prozedur und es kommt zumindest diese Fehlermeldung nicht mehr.
Aber so richtig rund läuft die Prozedur noch nicht. Muss mir das ganze nochmal anschaun.

Danke schön

Benutzeravatar
theo
Beiträge: 10873
Registriert: Mo 11. Sep 2006, 19:01

Re: Sortierverfahren(die dritte)

Beitrag von theo »

Manchmal liegt es auch am kleinen Pascal Einmaleins.

In einer For-Schleife runterzählen geht mit "downto".

Statt

Code: Alles auswählen

 for indhilfs:=hilfsfeld.Count-1 to 0 do
 

Code: Alles auswählen

 for indhilfs:=hilfsfeld.Count-1 downto 0 do

Eradikator
Beiträge: 33
Registriert: Sa 8. Jun 2013, 19:45

Re: Sortierverfahren(die dritte)

Beitrag von Eradikator »

Hallo theo,

unter anderem lag es auch daran. Mittlerweile hab ich's. So funktioniert es:

Code: Alles auswählen

 
procedure shellsort (feld : tstrings);
var
  h, indfeld, indhilfs, n : integer;
  hilfsfeld : tstrings;
begin
  h:=1;
  indhilfs:=0;
  n:=feld.Count-1;
  hilfsfeld := tstringlist.Create;
  while h<=n  do
  begin
    h:= 3*h + 1;
  end;
  while h>4 do
  begin
    indfeld:=0;
    h:=(h-1) div 3;//nochmal ein h zurück
    hilfsfeld.Clear;
    while indfeld<=n do
    begin
      hilfsfeld.Add(feld[indfeld]);
      indhilfs:=indhilfs+1;
      indfeld:=indfeld+h;
    end;
    indhilfs:=indhilfs-1;
    indfeld:=indfeld-h;
 
    insertionsort(hilfsfeld);
 
    for indhilfs:=hilfsfeld.Count-1 downto 0 do
    begin
      feld.Delete(indfeld);
      feld.Insert(indfeld, hilfsfeld[indhilfs]);
      indfeld:=indfeld-h;
    end;
  end;
   insertionsort(feld);
   hilfsfeld.Free;
  end;                   
 

Antworten