Frage und Entschuldigung

Für Fragen von Einsteigern und Programmieranfängern...

Frage und Entschuldigung

Beitragvon Rawi » 23. Apr 2018, 17:59 Frage und Entschuldigung

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 23. Apr 2018, 18:35, insgesamt 1-mal geändert.
Rawi
 
Beiträge: 14
Registriert: 31. Mär 2018, 16:39

Beitragvon Socke » 23. Apr 2018, 18:22 Re: Frage und Entschuldigung

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
Socke
 
Beiträge: 2546
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon Mathias » 23. Apr 2018, 18:43 Re: Frage und Entschuldigung

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4327
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon m.fuchs » 23. Apr 2018, 19:00 Re: Frage und Entschuldigung

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
m.fuchs
 
Beiträge: 1970
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (L 1.8.4, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried