Exeption-Klasse: >>External SIGSEGV<< bei OOP

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Shorty
Beiträge: 1
Registriert: Do 24. Jul 2014, 11:53

Exeption-Klasse: >>External SIGSEGV<< bei OOP

Beitrag von Shorty »

Hallo,
beim starten des Programms erscheint die Fehlermeldung Exeption-Klasse: >>External SIGSEGV<< in der mit dem Pfeil makierten Zeile(2. Quellcode).
Die Fehlermeldung erscheint nur beim Aufrufen von Zettel[ ] obwohl das Objekt vorher erzeugt wurde.
Ich versteh nicht wo das Problem liegt.

Teile des betreffenden Quellcodes:

Code: Alles auswählen

unit unitMain;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  Grids, unitKlasseAbsatz;
 
type
 
  { TFormMain }
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    Abrechnung:CAbsatz;
  end;
 
var
  FormMain: TFormMain;
 
implementation
{$R *.lfm}
 
{ TFormMain }
 
procedure TFormMain.FormCreate(Sender: TObject);
begin
   Abrechnung.erzeuge;
   Abrechnung.hinzuZettel(1);
end;
 
end.

Code: Alles auswählen

  
unit unitKlasseAbsatz;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
Type
     CAbsatz = class
      private
        Zettel: array[1..50]of real;
      public
        constructor erzeuge;
        function gibZettel(Nummer:integer):real;
        procedure hinzuZettel(Betrag:real);
    end;
implementation
 
  Constructor CAbsatz.erzeuge;
    Var
    i:integer;
  begin
    for i:=0 to 49 do
      Zettel[i]:=0;
  end;
 
  Procedure CAbsatz.hinzuZettel(Betrag:real);
    Var
      i:integer;
  begin
    for i:=0 to 49 do
      if Zettel[i] =0 then            <<<===
        Zettel[i]:=Betrag;
  end;
 
end.
Debugger Ausgabe:
<-stack-list-arguments 1 0 4>
^done,stack-args=[frame={level="0",args=[{name="SENDER",value="0x2196e0"},{name="this",value="<error reading variable>"}]},frame={level="1",args=[{name="this",value="<error reading variable>"}]},frame={level="2",args=[{name="this",value="<error reading variable>"}]},frame={level="3",args=[{name="THEOWNER",value="0x1dccb0"},{name="vmt",value="0x1"},{name="this",value="<error reading variable>"}]},frame={level="4",args=[{name="INSTANCECLASS",value="<incomplete type>"},{name="REFERENCE",value="void"},{name="this",value="<error reading variable>"}]}]
(gdb)
<-stack-list-frames 0 4>
^done,stack=[frame={level="0",addr="0x00425f9f",func="TFORMMAIN__FORMCREATE",file="unitmain.pas",fullname="C:/Users/benutzer/Desktop/Abrechnungen_lp_d/unitmain.pas",line="65"},frame={level="1",addr="0x00418150",func="TCUSTOMFORM__DOCREATE",file="./include/customform.inc",line="930"},frame={level="2",addr="0x0041664a",func="TCUSTOMFORM__AFTERCONSTRUCTION",file="./include/customform.inc",line="149"},frame={level="3",addr="0x0041cf76",func="TFORM__CREATE",file="./include/customform.inc",line="3058"},frame={level="4",addr="0x00424538",func="TAPPLICATION__CREATEFORM",file="./include/application.inc",line="2169"}]
(gdb)
<-stack-list-arguments 1 0 0>
^done,stack-args=[frame={level="0",args=[{name="SENDER",value="0x2196e0"},{name="this",value="<error reading variable>"}]}]
(gdb)
<-stack-list-locals 1>
^done,locals=[{name="SENDER",value="0x2196e0"}]
(gdb)

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Exeption-Klasse: >>External SIGSEGV<< bei OOP

Beitrag von mse »

Shorty hat geschrieben: 

Code: Alles auswählen

 
Type
     CAbsatz = class
      private
        Zettel: array[1..50]of real; <<<----
 
  Procedure CAbsatz.hinzuZettel(Betrag:real);
    Var
      i:integer;
  begin
    for i:=0 to 49 do      <<<<<------
      if Zettel[i] =0 then            <<<===
        Zettel[i]:=Betrag;
  end;
 
end.
Zuletzt geändert von mse am Do 24. Jul 2014, 13:36, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3177
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: Exeption-Klasse: >>External SIGSEGV<< bei OOP

Beitrag von Socke »

Code: Alles auswählen

procedure TFormMain.FormCreate(Sender: TObject);
begin
   Abrechnung := CAbsatz.erzeuge;
   Abrechnung.hinzuZettel(1);
end;
 
Wenn du bei deinen Klassen das Schlüsselwort class verwendest, musst du den Konstruktor immer von der Klasse aus aufrufen (wie in meinem Beispiel). Bei dem älteren Schlüsselwort object von Turbo Pascal ist das ein wenig anders.

Wie das bei SIGSEGV so ist, kann die Ursache an einer ganz anderen Stelle liegen ;-)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Exeption-Klasse: >>External SIGSEGV<< bei OOP

Beitrag von Mathias »

Hier geht deine Array von 1-50:

Code: Alles auswählen

Zettel: array[1..50]of real;
Und hier greift du von 0 an auf die Array zu, dies muss eine Schutzverletzung geben.

Code: Alles auswählen

 for i:=0 to 49 do      <<<<<------
      if Zettel[i] =0 then            <<<===
        Zettel[i]:=Betrag;
F
Abhilfe:

Code: Alles auswählen

Zettel: array[0..49]of real; 
Dies was Socke schreibt musst du natürlich auch noch ändern.

Nicht vergessen, zum Schluss noch Abrechnung.Free aufrufen, um den Speicher der Klasse wieder freizugeben. Am bestem bei FormDestroy.

So nebenbei würde ich einen Constructer immer Create nennen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6768
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Exeption-Klasse: >>External SIGSEGV<< bei OOP

Beitrag von af0815 »

Dreht keiner mehr zum Programmieren die ganzen Prüfungen auf?

Damit bekommt man zwar etwas langsameren, größeren Code, dafür aber bessere Aussagen was man verbockt hat.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Exeption-Klasse: >>External SIGSEGV<< bei OOP

Beitrag von Mathias »

Dreht keiner mehr zum Programmieren die ganzen Prüfungen auf?
Zum Fehlersuchen mache ich das auch.

Bei den fertigen Programmen deaktiviere ich es wieder.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten