Fehler: Exception-Klasse External: SIGSEGV (gelöst)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Fehler: Exception-Klasse External: SIGSEGV (gelöst)

Beitrag von idefix »

Hallo!

Ich baue mir ein Vokabelprogramm.

Ich habe ein record Datensatz : TDatensatz
TDatenArray = array of TDatensatz;

Da klappt auch alles: Übergabe von Daten eines Stringgrids, speichern, laden, abfragen.

Jetzt wollte ich die Daten mittels eines zweiten Arrays alphabetisch sortieren lassen. Um dann die Datensätze im Stringrid sortiert auszugeben. Dort habe ich u.a. die Spalten Fach, Frage, Antwort.

-------------------

Nun zu meinem Problem:
In der procedure TForm1.Button1Click steigt der Debugger in der folgenden zweiten Zeile aus

Code: Alles auswählen

Daten[i].Frage := StringGrid1.Cells[1,i];
DatenDummy[i].FachDummy := StringGrid1.Cells[1,i] ;
Folgende Fehlermeldung erscheint:
Project project0024.exe hat Exception-Klasse >>External: SIGSEGV<< ausgelöst.

Was ich gefunden habe:
Das scheint ein Sammelbegriff für viele Fehler zu sein.
Und
Das ist einfach eine Speicherzugriffsverletzung, die vom Betriebssystem gemeldet wird.

---------------

Wichtig ist, das der Fehler nicht beim Start des Programms auftritt, sondern nur wenn der Button angecklickt wird.

Ich habe schon hin und her probiert, komme aber alleine nicht weiter.

Code: Alles auswählen

procedure TForm1.Button1FachClick(Sender: TObject);
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  StdCtrls, {Unit0024_1,} Unit0024_2, cscsv_785, windows;
 
type
  TDatensatz = record
    Fach   : String;
    Frage  : String;
    Antwort: String;
  end;
  TDatenArray = array of TDatensatz;
 
  TDatensatzDummy = record
    FachDummy   : String;
    FrageDummy  : String;
    AntwortDummy: String;
  end;
  TDatenDummyArray = array of TDatensatzDummy;      
 
  TForm1 = class(TForm)
    Beenden: TButton;
    Button1: TButton;
    // etc.
 
  private
    { private declarations }
  public
    { public declarations }
  end; 
  // Original
 
  //Original
var
  Form1 : TForm1; 
 
var
  AnzahlVokabeln: integer;
  Daten: TDatenArray;
  DatenDummy : TDatenDummyArray;
 
implementation 
{$R *.lfm} 
 
procedure TForm1.Button1Click(Sender: TObject); 
var
  i : integer;
begin
  For i := 1 to AnzahlVokabeln -1 do
  begin
    Daten[i].Fach:= StringGrid1.Cells[1,i];
    DatenDummy[i].FachDummy := StringGrid1.Cells[0,i] ;
  end;
end;
Help needed!

Danke!

Gruß!
idefix
Zuletzt geändert von idefix am Sa 29. Okt 2011, 21:30, insgesamt 2-mal geändert.

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Fehler: Exception-Klasse External: SIGSEGV ausgelöst

Beitrag von idefix »

Hallo!

Es war ein dynamisches Array

Code: Alles auswählen

SetLength(DatenDummy, AnzahlVokabeln);
Gelöst.

Danke!

Gruß!
idefix

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Fehler: Exception-Klasse External: SIGSEGV ausgelöst

Beitrag von Scotty »

Du hast den dynamischen Feldern Daten und DatenDummy, die als array of <record> definiert sind, wahrscheinlich keine Länge zugewiesen (setlength()).
Übrigens: Wenn man sich in Listen eingearbeitet hat, ist die Arbeit mit einer TList und der Methode Add() sehr angenehm.

Code: Alles auswählen

type
TDatensatz=class
    Fach   : String;
    Frage  : String;
    Antwort: String;
  end;
 
private
  FData:Tlist;
 
constructor Create()
begin
  inherited;
  FData:=TList.Create;
end;
 
procedure...
var aData:TDatensatz;
begin
  aData:=TDatensatz.Create;
  aData.Fach:='ABC';
  FData.Add(aData);
  //kein aData.Free hier! FData merkt sich nur die Zeiger auf die Objekte
end;
 
procedure ...(aNumber:integer);
var aData:TDatensatz;
begin
  aData:=TDatensatz(FData[aNumber]);
  if aData.Fach='ABC' then...
end;
 
destructor Destroy;
begin
  for i:=0 to FData.Count-1 do
    TDatensatz(FData[i]).Free; //hier werden die Objekte gefreet
  FData.Free;
end;
PS: 1min zu spät ;-)

idefix
Beiträge: 61
Registriert: So 21. Aug 2011, 20:37
OS, Lazarus, FPC: WIN7 /Laz 1,0,8 / FPC 2.6.2/ SVN 40573
CPU-Target: xxBit

Re: Fehler: Exception-Klasse External: SIGSEGV: Gelöst

Beitrag von idefix »

Hallo!

Danke!

Gruß!
idefix

Antworten