Zahlen sortieren - External: SIGSEGV« ausgelöst ListBox3.Items.Add

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
texs89
Beiträge: 2
Registriert: Sa 27. Mär 2021, 09:49

Zahlen sortieren - External: SIGSEGV« ausgelöst ListBox3.Items.Add

Beitrag von texs89 »

Hallo,
ich bin absoluter Anfänger in Sachen Lazarus/ Pascal und habe mir gerade ein paar Übungen angeschaut. Ich wollte einmal aus verschiedenen Zahlen die Größte anzeigen lassen und auch eine Prozedur um ein Array von Zahlen zu sortieren.
Mir geht es jetzt garnicht darum, dafür ein fertiges Programm zu bekommen sondern, ich hänge gerade an einer Fehlermeldung:
"External: SIGSEGV« ausgelöst ListBox3.Items.Add"
Die erste Prozedur zeigt die größte Zahl an, in der 2. Prozedur sollen Zahlen sortiert werden, der Code ist wahrscheinlich grütze, verbessere ich noch, aber ich bekomme die Fehlermeldung nicht weg. Warum kann ich in der 2. Prozedur nicht auf die Listbox3 zugreifen und dort Zahlen einfügen?

In der ersten Prozedur gibt es auch einen anderen komischen Fehler: Ich hatte dort ein 2. Array (zahlen_gr) erstellt, was ich in einer for Schleife einmal mit Zahlen fülle, dann aber doch nicht weiterverwendet habe, es könnte im Prinzip gelöscht werden.
Wenn ich es aber drin lasse, wird manchmal nicht die korrekte größte Zahl ausgegeben (z.B. bei array [1..35]). Lösche ich die Zeile

Code: Alles auswählen

zahlen_gr[index]:=index;
dann läuft alles wieder korrekt.

Wie gesagt absoluter Anfänger. :wink:
Vielen Dank für Eure Rückmeldungen.

Lazarus v2.0.12 - Kubuntu 20.04 64bit

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    ListBox2: TListBox;
    ListBox3: TListBox;
    Memo1: TMemo;
    min: TEdit;
    ListBox1: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);

var zahlen: array [1..35] of integer;
    zahlen_gr: array [1..10] of integer;
  index, index2, k: integer;
  gr: boolean;

begin
   K:=Length(zahlen);
   index2:=1;
   gr:=false;
  for index:= 1 to k do
  begin
    zahlen[index]:=random(50);
    ListBox1.Items.Add(IntToStr(zahlen[index]));
    zahlen_gr[index]:=index;   // das verursacht Fehler, warum????? - größte Zahl eig 48, laut Programm 46

  end;


  for index:= 1 to k do
  begin
    gr:=false;
    index2:=1;
    ListBox2.Items.Add('Schleife Nr.' + IntToStr(index));

    repeat

    if index2=k+1 then
          begin
          ShowMessage('größte Zahl ' + IntToStr(zahlen[index]));
          ListBox2.Items.Add('größte Zahl');
          gr:=true;
          exit;
          end;


    ListBox2.Items.Add('Zahl1 Nr.' + IntToStr(zahlen[index]));
    ListBox2.Items.Add('Zahl2 Nr.' + IntToStr(zahlen[index2]));
       if zahlen[index2]>zahlen[index] then
    begin
       gr:=true;
       ListBox2.Items.Add('ja');
    end;


    ListBox2.Items.Add('Schleife2 Nr.' + IntToStr(index2));
    ListBox2.Items.Add('Bool ' + gr.ToString);

    index2:=index2+1;
    until gr=true;



  end;

end;


procedure TForm1.Button2Click(Sender: TObject);
var zahlen: array [1..7] of integer;

  index, index2, k, temp: integer;
  gr: boolean;

begin
   K:=Length(zahlen);
   index2:=1;
   gr:=false;
  for index:= 1 to k do
  begin
    zahlen[index]:=random(50);
    ListBox1.Items.Add(IntToStr(zahlen[index]));

  end;

  for index:= 1 to k do
  begin
    gr:=false;
    index2:=1;

    //ListBox2.Items.Add('Schleife Nr.' + IntToStr(index));

    repeat

    if index2=k+1 then
          begin
          //ShowMessage('größte Zahl ' + IntToStr(zahlen[index]));
          //ListBox2.Items.Add('größte Zahl');
          gr:=true;

          end;


   // ListBox2.Items.Add('Zahl1 Nr.' + IntToStr(zahlen[index]));
    //ListBox2.Items.Add('Zahl2 Nr.' + IntToStr(zahlen[index2]));

       if zahlen[index2]<zahlen[index] then
    begin

       temp:=zahlen[index2];
       zahlen[index2]:=zahlen[index];
       zahlen[index]:=temp;
       //ListBox2.Items.Add('ja');
    end;


    //ListBox2.Items.Add('Schleife2 Nr.' + IntToStr(index2));
    //ListBox2.Items.Add('Bool ' + gr.ToString);

    index2:=index2+1;
    until gr=true;

  end;

  for index:= 1 to k do
  begin

    ListBox3.Items.Add(IntToStr(zahlen[index])); // hier kommt Fehler SIGSEGV
    //Memo1.Lines.Add(IntToStr(temp));

        //ShowMessage(IntToStr(zahlen[index]));

  end;

end;

end.

Linkat
Lazarusforum e. V.
Beiträge: 530
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 21.3; Lazarus 3.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 32
Wohnort: nr Stuttgart

Re: Zahlen sortieren - External: SIGSEGV« ausgelöst ListBox3.Items.Add

Beitrag von Linkat »

Hallo texs89,
zunächst herzlich willkommen im Lazarusforum.

Deinen code habe ich mir gar nicht genau angesehen. Aber auffällig ist, dass deine variable "index" blau dargestellt ist. Ersetze index durch index1 vielleicht funktioniert es dann (wenn sonst kein Fehler ist).
index ist ein Modifier und wird behandelt wie ein reserviertes Wort.
https://wiki.freepascal.org/Reserved_words/de.
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

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

Re: Zahlen sortieren - External: SIGSEGV« ausgelöst ListBox3.Items.Add

Beitrag von theo »

Hab's nur kurz angeschaut.
Du setzt zwar gr:=true, machst aber trotzdem weiter.
Spring aus der Schleife mit break oder mach es so (besser):

Code: Alles auswählen

      if (zahlen[idx2]<zahlen[idx]) and (not gr) then  
Zum zweiten Problem:

Code: Alles auswählen

zahlen: array [1..35] of integer;   
zahlen_gr: array [1..10] of integer; 
Die Arrays sind nicht gleich gross, du greifst aber im Umfang von "zahlen" (1 to k) auf "zahlen_gr" zu.

Es "spinnt" halt nicht immer dort, wo die Ursache des Fehlers ist.
Sorgfältig arbeiten ist besser als Fehler suchen. :wink:

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

Re: Zahlen sortieren - External: SIGSEGV« ausgelöst ListBox3.Items.Add

Beitrag von theo »

P.S. Wenn du bei Projekt -> Projekteinstellungen -> Debuggen einen Haken bei "Bereich" machst, kriegst du direkt einen "Range Check Error" in beiden Fällen

texs89
Beiträge: 2
Registriert: Sa 27. Mär 2021, 09:49

Re: Zahlen sortieren - External: SIGSEGV« ausgelöst ListBox3.Items.Add

Beitrag von texs89 »

Super vielen Dank, tatsächlich waren das die beiden Fehler. Es wurden Operationen außerhalb des Array Bereichs ausgeführt. Lustig nur dass das Programm andere (Max)Zahlen liefert, wenn ich das Array "zahlen_gr" außerhalb des Bereichs mit Zahlen fülle, obowhl das Array "zahlen_gr" sonst im Programm garnicht verwendet wird.

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Zahlen sortieren - External: SIGSEGV« ausgelöst ListBox3.Items.Add

Beitrag von PascalDragon »

texs89 hat geschrieben:
Di 30. Mär 2021, 21:50
Super vielen Dank, tatsächlich waren das die beiden Fehler. Es wurden Operationen außerhalb des Array Bereichs ausgeführt. Lustig nur dass das Programm andere (Max)Zahlen liefert, wenn ich das Array "zahlen_gr" außerhalb des Bereichs mit Zahlen fülle, obowhl das Array "zahlen_gr" sonst im Programm garnicht verwendet wird.
Wenn du es füllst wird es verwendet. Und im Speicher liegen die verschiedenen Arrays auf dem Stack hintereinander, das heißt wenn du den Bereich von zahlen_gr überschreitest, überschreibst du dir zum Beispiel zahlen.
FPC Compiler Entwickler

Antworten