Frage und Entschuldigung

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Rawi
Beiträge: 14
Registriert: Sa 31. Mär 2018, 17:39

Frage und Entschuldigung

Beitrag von Rawi »

Es tut mir leid, dass ich mich wohl ein wenig kindisch verhalten habe, aber (auch wenn es für euch Vllt. unglaubwürdig klingt) habe ich sehr großen Stress gehabt und insgeheim wohl auf eine einfache Lösung gehofft.

Da ihr ja Recht habt, mit der Aussage, dass Selbermachen besser ist, habe ich mich mal hingesetzt und unter für mich großem Aufwand einen Quicksortalgorithmus entworfen.

Leider funktioniert er nicht. Das Programm startet, aber enthält wohl Fehler, da ich ständig die slebe Fehlermeldung an unsteschiedlichen Stellen bekomme...

Exepction class "External SIGSEGV "

sowie

"Out of bounds"


Das ist der Quellcode:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
  private
    procedure quicksort(var arr: array of integer);
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var arr:array[0..5] of integer;
  i:integer;
begin
 
for i:=0 to length(arr) do
  begin
arr[i]:=strtoint(listbox1.items[i]);
   end;
 
 
quicksort(arr);
 
for i:=0 to length(arr) do
       begin
         listbox1.items[i]:=inttostr(arr[i]);
       end;
 
 
end;
 
procedure TForm1.quicksort(var arr: array of integer);
var   pivot,links,rechts:integer;
  x:integer;
  rechterabsch: array[0..5] of integer;
  linkerabsch: array[0..5] of integer;
  stelle:integer;
begin
      if length(arr) > 1    then
        begin
        pivot := random(length(arr));
          links:= arr[0];
          rechts:= length(arr);
          while links <= rechts  do
              begin
              while arr[links] < arr[pivot] do
                  links := links + 1  ;
              while arr[rechts] > arr[pivot]  do
                  rechts:= rechts - 1  ;
              if links <= rechts  then
                begin
                 x:= arr[links]    ;
                 arr[links]:=arr[rechts] ;
                 arr[rechts]:=x;
                  links := links + 1                ;
                  rechts := rechts - 1               ;
                end;
              end;
 
          for stelle:=0 to pivot do
              begin
              linkerabsch[stelle]:=arr[stelle]
               end;
          for stelle:=length(arr) downto pivot do
              begin
              rechterabsch[stelle]:=arr[stelle]
               end;
 
          quicksort(linkerabsch);
          quicksort(rechterabsch);
          end;
end;
 
end.
 




Findet jemand vllt. von euch einen grundlegenden Fehler?

Lg und sorry nochmals
Rawi
Zuletzt geändert von Rawi am Mo 23. Apr 2018, 19:35, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3158
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: Frage und Entschuldigung

Beitrag von Socke »

Hallo Rawi,

Hier zwei Tipps:
  1. Formatiere deinen Quelltext, dann kannst du und andere ihn besser lesen. In Lazarus geht das mit der Tastenkombination Strg+D ganz schnell.
  2. Wenn du die Zeile {$mode objfpc}{$H+} zu {$mode objfpc}{$H+}{$RangeChecks On} änderst, prüft dein Programm bei jedem Array-Zugriff ob der Index innerhalb des Arrays liegt. Die Einstellung findest du auch in den Projekteinstellungen unter Debuggen -> Überprüfungen -> Bereich; dort gilt sie für das gesamte Projekt, nicht nur für eine Datei.

Damit solltest du den Fehler ganz schnell finden. Falls nicht, verweise ich auf deine Frage hier: Schleifen --> verwirrt
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Frage und Entschuldigung

Beitrag von Mathias »

Exepction class "External SIGSEGV "


Ersetze mal folgendes

Code: Alles auswählen

for i:=0 to length(arr) do
durch

Code: Alles auswählen

for i:=0 to length(arr) - 1 do
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Frage und Entschuldigung

Beitrag von m.fuchs »

Mathias hat geschrieben:Ersetze mal folgendes

Code: Alles auswählen

for i:=0 to length(arr) do
durch

Code: Alles auswählen

for i:=0 to length(arr) - 1 do

Nein, bitte nicht. Wir hatten die Diskussion doch gerade. Bei Arrays immer Low und High verwenden.

Also:

Code: Alles auswählen

for i := Low(arr) to High(arr) do
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten