[gelöst]SIGSEGV Exception beim beschreiben eines Arrays

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

[gelöst]SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von Dragon »

Hallo liebe Community in den letzten Tagen versuchte ich ein Quiz zu schreiben der erste Prototype hatte auch funktioniert doch der hatte hardcodded Fragen und da ich dies unschön fand versuchte ich die fragen aus einer Text Datei in eine stringlist zu laden und von dieser in ein Array doch beim schreiben in das Array erhalte ich ein SIGSEGV exeption und ich habe keine ahnung wo diese herkommt. Der Fehler steckt in der procedure arraybeladen.
Ich hoffe es kann mir jemand helfen.

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;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
 
  end;
 
var
  Form1: TForm1;
 
implementation
var
  Fragen : Array[1..2, 1..6] of string; //Fragen Datenbank
  RichtigeAntwort : string;             //Enthält richtigenantworten string
  gewaelt : string;                      //enthält deine gewählte frage als vergleichswert
  R, F : integer;                        //counter für anzahl richtiger und falscher antworten              //
  Frage : integer;                      //Enthält zufällige zahl für wievieltefrage
  derzeitigeFrage : integer;             //wievielte frage ist das
 
{$R *.lfm}
procedure Arraybeladen();
var
  i, ii : integer;
  fragenlistenlange : integer;
  fragenliste : Tstringlist;
  zuscannen : string;
  fragenlange : integer;
  item : integer ;
  Frageteil : string;
begin
     fragenliste.create;
     fragenliste.LoadFromFile('/home/Dragon/Dokumente/testfragen/Quiz1');
     fragenlistenlange := fragenliste.count;
     for i:=1 to fragenlistenlange do
     begin
      item := 1;
      zuscannen := fragenliste[i];
      fragenlange := length(zuscannen);
                for ii:=1 to fragenlange do
                begin
                  if zuscannen[ii] = ';' then item += 1
                  else
                    Frageteil := Frageteil + zuscannen[ii];
                    Fragen[i][item] := Frageteil;
                end;
     end;
    fragenliste.Free;
end;
 
procedure nocheinefrage();
begin
 if Richtigeantwort = gewaelt then R += 1 else F += 1;
 derzeitigefrage += 1;
 Form1.Caption := 'Frage ' + (inttostr(derzeitigefrage)) + ' Informatikquiz';
if form1.Caption = 'Frage 11 Informatikquiz' then ShowMessage('Du hattest ' + (inttostr(r)) + ' Richtig und ' + (inttostr(F)) + ' Fragen Falsch beantwortet ');
end;
 
procedure Fragenstellen();
begin
Frage := random(1)+1;
Form1.memo1.Caption := Fragen[Frage, 1];
Form1.Button1.Caption := Fragen[Frage, 2];
Form1.Button2.Caption := Fragen[Frage, 3];
Form1.Button3.Caption := Fragen[Frage, 4];
Form1.Button4.Caption := Fragen[Frage, 5];
RichtigeAntwort := Fragen[Frage, 6];
end;
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  R := 0;
  F := 0;
  derzeitigefrage := 1;
  Form1.Caption := 'Frage 1 Informatikquiz';
  randomize;
  ArrayBeladen();
  Fragenstellen();
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 gewaelt := Button1.Caption;
if RichtigeAntwort = gewaelt then nocheinefrage() else Showmessage('Das war leider die falsche Antwort die richtige waere ' + richtigeAntwort);
if RichtigeAntwort = gewaelt then else nocheinefrage();
Fragenstellen;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  gewaelt := Button2.Caption;
if RichtigeAntwort = gewaelt then nocheinefrage() else Showmessage('Das war leider die falsche Antwort die richtige waere ' + richtigeAntwort);
if RichtigeAntwort = gewaelt then else nocheinefrage();
Fragenstellen;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  gewaelt := Button3.Caption;
if RichtigeAntwort = gewaelt then nocheinefrage() else Showmessage('Das war leider die falsche Antwort die richtige waere ' + richtigeAntwort);
if RichtigeAntwort = gewaelt then else nocheinefrage();
Fragenstellen;
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
 gewaelt := Button4.Caption;
if RichtigeAntwort = gewaelt then nocheinefrage() else Showmessage('Das war leider die falsche Antwort die richtige waere ' + richtigeAntwort);
if RichtigeAntwort = gewaelt then else nocheinefrage();
Fragenstellen;
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
  R := 0;
  F := 0;
  derzeitigeFrage := 0;
  nocheinefrage;
  fragenstellen;
end;
 
end.
 
 
Zuletzt geändert von Dragon am Do 20. Mär 2014, 23:00, insgesamt 2-mal geändert.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von gocher »

also Stringlisten starten bei "0"
also nicht

Code: Alles auswählen

for i:=1 to fragenlistenlange do
sondern

Code: Alles auswählen

for i:=0 to fragenlistenlange-1 do
hat die Datei: /home/Dragon/Dokumente/testfragen/Quiz1.txt nur 2 Zeilen?
Zuletzt geändert von gocher am Do 20. Mär 2014, 22:14, insgesamt 1-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
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: SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von m.fuchs »

Das ist völliger Mumpitz:

Code: Alles auswählen

fragenliste.create;
So muss das aussehen:

Code: Alles auswählen

fragenliste := TStringList.Create; 
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von Dragon »

[quote=gorcher]
also Stringlisten starten bei "0"
[/quote]
Die stringliste habe ich bei 1 gestartet weil ich vor habe in einer späteren version frei diffinierbare joker einzubauen
die in der ersten zeil deffiniert werden sollen aber trozdem danke für den hinweis.


[quote=m.fuchs]
So muss das aussehen: fragenliste := TStringList.Create;
[/quote]
ok Danke, also mit den korrekturen die du vorgeschlagen hast ist die SIGSEGV meldung weg aber dafür kriege ich eine neue fehlermeldung "List index (3) out of bounds" ich hoffe du kannst mir auch hier helfen.
Zuletzt geändert von Dragon am Do 20. Mär 2014, 22:34, insgesamt 1-mal geändert.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von gocher »

eher so:

Code: Alles auswählen

     fragenliste := TStringlist.Create;
     fragenliste.LoadFromFile('/home/Dragon/Dokumente/testfragen/Quiz1.txt');
     for i:=0 to fragenliste.count-1 do
     begin
        zuscannen := fragenliste[i];
        fragenlange := length(zuscannen);
        item := 1;
        for ii:=1 to fragenlange do
        begin
           if zuscannen[ii] = ';' then 
              inc(item)
           else
              Fragen[i][item] := Fragen[i][item] + zuscannen[ii];
        end;
     end;
    fragenliste.Free;
aber wenn Du mich fragst würde ich es anders lösen, ich weiß ja nicht wie deine Textdatei aussieht aber das sieht alles andere als schön aus
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von Dragon »

Also zurzeit sieht meine testdatei so aus

Code: Alles auswählen

 
hier sollen die joker diffiniert werden
test Frage;hallo1;hallo2;hallo3;hallo4;hallo1
test Frage2;hallo1;hallo2;hallo3;hallo4;hallo2
 
wobei der teil vor dem ersten simikolon die Frage darstellt dann kommen die vier Antwortmöglihkeiten und das sechste element ist dann die richtige Antwort

ich hab die datei so aufgebaut das ich immer eine Frage mit Antworten in eine Zeile gekriegt habe weil mir kein effektiwerer weg eingefallen ist aber für vorschläge zur verbesserung bin ich natürlih offen.
Zuletzt geändert von Dragon am Do 20. Mär 2014, 22:53, insgesamt 3-mal geändert.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von gocher »

Siehe oben Stringlisten beginnen bei 0 (Dein Joker) und enden bei count-1 (Deine 2 Fragen) dann werden die 2 Zeilen aus Deiner Datei auch richtig gelesen, dann kommt der Zugriff auf count (3. Frage) die ja nicht existiert und da ist Dein Fehler, siehe mein Beispiel.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von gocher »

random(2)
und starte Deinen Stringlistendurchlauf nun doch bei 1 damit Du Deinen Joker nicht als Frage präsentiert bekommst
Zuletzt geändert von gocher am Do 20. Mär 2014, 23:00, insgesamt 1-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Dragon
Beiträge: 162
Registriert: Mi 31. Jul 2013, 15:07
OS, Lazarus, FPC: Ubuntu 16.04, CodeTyphon 5.80

Re: SIGSEGV Exception beim beschreiben eines Arrays

Beitrag von Dragon »

Ok danke für eure hilfe jetzt funktioniert alles wenn ich das quiz fertig habe werde ich sie hier im forum hohladen

ich muss nur noch ein paar modifikationen vornehmen z.b. die Joker einbauen.

Antworten