External:SIGSEGV

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Nitrom30
Beiträge: 3
Registriert: Mi 27. Jan 2021, 12:40

External:SIGSEGV

Beitrag von Nitrom30 »

Moin ich bin gerade dabei für die Schule ein Poker zu Programmieren.
jedoch bekomme ich einen Fehler bei dem mir selbst meine Lehrerin nicht helfen kann.
Jetzt mal schauen ob ihr schlauer seid xD

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    btn_start: TButton;
    btn_passen: TButton;
    btn_erhoehen: TButton;
    btn_Mitgehen: TButton;
    btn_hilf2: TButton;
    btn_hilf1: TButton;
    img_Karte1: TImage;
    Img_Karte2: TImage;
    Img_Karte3: TImage;
    Img_Karte4: TImage;
    Img_Karte5: TImage;
    Img_Karte6: TImage;
    Img_Karte7: TImage;
    img:TImage;
    lbl_aPlayer: TLabel;
    procedure Aufdecken(Sender: TObject);
    procedure Spiel(Sender: TObject);
    procedure Spielzug(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
  Spielerdaten:Array[1..4,1..9]  of Integer;
  Karten:      Array[1..4,1..13] of integer;
  Tischkarten: Array[1..5,1..2]  of Integer;
  Spielkarten: Array[1..7]       of String;
  B,I,j,x,y,Player_Anzahl,T,T2,T3,o,AktiverSpiel,highPott,Pott,q,btnAbfrage,KartenAufgedeckt,Karo,Herz,pik,Kreuz,RF:Integer;



implementation

{$R *.lfm}


{ TForm1 }

procedure Austeilen();
begin
randomize;
  For i:=1 to 4 do
      begin
        For j:=1 to 13 do
          begin
             Karten[i,j]:= 1;             //Alle Karten bekommen den Wert 1
             end;
        end;

    For i:=1 to 4 do
      begin
        Spielerdaten[i,1]:= 1;            //Player Value wird auf 1 gesetzt
        end;

    For i := 1  to 4 do
     begin                                       //Karte 1 1 ist z.B. Kreuz 2
        For j := 1 to 2 do                       //Karte 1 1 ist z.B. Kreuz 3 usw
           begin
           o:=0;
           while o =0 do
              begin
              x:=random(3)+1;
              Y:=random(12)+1;
              If  Karten[x,y] = 1 then        //Jede Karte hat anfangs den wert 1, wenn die Karte benutz wird wird dieser auf 0 gesetzt was bedeutet das die karte bereits im spiel ist
                 begin
                    Spielerdaten[j,2]:=x;     //jedem spieler werden 2 Karten zugewisen
                    Spielerdaten[j,3]:=y;
                    Karten[x,y]:= 0;
                    o:=1;
                 end;
              end;
           end;
     end;

  For i := 1 to 5 do
     begin
     o:=0;
     while o =0 do
        begin
        x:=random(3)+1;
        Y:=random(12)+1;
        If  Karten[x,y] = 1 then
           begin
              Tischkarten[i,1]:=x;             //Tischkarten werden zugeteilt
              Tischkarten[i,2]:=y;
              Karten[x,y]:=0;
              o:=1;
           end;

        end;
     end;
end;
procedure TForm1.Aufdecken(Sender: TObject);
begin
     Spielkarten[KartenAufgedeckt]:=inttostr(Tischkarten[1,1])+inttostr(Tischkarten[1,2]);  //Spielkarte wird als string definiert
     img:=(FindComponent('img_karte'+inttostr(KartenAufgedeckt))as TImage);
    [color=#FF0000] img.Picture.LoadFromFile('../Bilder/'+Spielkarten[KartenAufgedeckt]+'.jpg');[/color]           //TImage(KartenAufgedeckt) bekommt den entsprechenden wert zugewisen
end;
procedure Auswertung();
begin
end;[color=#FF0000][/color]
procedure TForm1.Spielzug(Sender: TObject);
begin
  showMessage('Spieler '+inttostr(AktiverSpiel)+' ist dran!');
  Spielkarten[1]:=inttostr(Spielerdaten[AktiverSpiel,2])+inttostr(Spielerdaten[AktiverSpiel,3]);  //Auslesen der Karten aus dem Spielerprofiel
  Spielkarten[2]:=inttostr(Spielerdaten[AktiverSpiel,4])+inttostr(Spielerdaten[AktiverSpiel,5]);
  img_Karte1.Picture.LoadFromFile('../Bilder/'+Spielkarten[1]+'.jpg');
  img_karte2.picture.loadfromfile('../Bilder/'+Spielkarten[2]+'.jpg');
  showMessage('TTTEst');
  If Spielerdaten[AktiverSpiel,8] < highPott then    //Pott höher als das was gesetzt wurde
     begin
      btn_mitgehen.Visible:=true;
      btn_passen.Visible:=true;
      btn_erhoehen.visible:=true;
     end;
  If Spielerdaten[AktiverSpiel,7] = 1 then          //Spieler hat bereits erhöt
     begin
       btn_mitgehen.Visible:=true;
       btn_passen.Visible:=true;
     end;
  while btnAbfrage=0 do
     begin
       case btnAbfrage of                            //Aktion des Spieler
       1:begin //passen
           If highPott > Spielerdaten[AktiverSpiel,7] then
           begin
              Spielerdaten[AktiverSpiel,1]:=0
           end; //else nächster Spieler
         end;
       2:begin
         //pop up ok ?
         Pott:=(highPott-Spielerdaten[AktiverSpiel,8])+Pott;    //mitgehen
         Spielerdaten[AktiverSpiel,1]:=highpott;
         end;
       3:;                                           //erhöhen

     end;

     end;
end;
procedure TForm1.Spiel(Sender: TObject);
begin
    Austeilen();
    Player_Anzahl:=4;
    For KartenAufgedeckt:=3 to 7 do
       begin
           If Player_Anzahl > 1 then
            begin
               For AktiverSpiel:=q to 4 do //wenn spieler erhöt wird wieder auf 2 gesetz
                  begin
                     If  Spielerdaten[AktiverSpiel,1] =1 then
                     Spielzug(nil);
                  end;
            end;
           Aufdecken(nil);
       end;
    If Player_Anzahl= 1 then
       //letzer spieler bekommt den Pott
       else
       Auswertung()
end;
end.
Bei dem Rot Markierten bekomme ich nach erfolgreichem compilieren den Fehler
Project project1 hat Exception-Klasse >External:SIGSEGV<ausgelöst
untendrunter steht die Zeile die ich euch markiert habe.
Zuletzt geändert von Nitrom30 am Mi 27. Jan 2021, 21:32, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: External:SIGSEGV

Beitrag von fliegermichl »

In dieser Schleife

Code: Alles auswählen

  For i := 1 to 5 do
  ...
 
greifst du auf Spielerdaten[i, ...] zu. Der erste Index geht aber nur bis 4.

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: External:SIGSEGV

Beitrag von Linkat »

Hallo Nitrom30,
zunächst herzlich willkommen im Lazarusforum.

Was mir gerade so ins Auge sticht (hat nichts mit deinem eigentlichen Problem zu tun):

Code: Alles auswählen

randomize; 
hat nichts in der Schleife zu suchen. 'randomize' soll nur einmal z.B. im OnCreate-Ereignis aufgerufen werden.

Die Klammern () ohne Inhalt einfach weglassen.

Viel Spaß und Erfolg bei deinem Projekt.
Zuletzt geändert von Linkat am Mi 27. Jan 2021, 14:43, insgesamt 1-mal geändert.
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

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: External:SIGSEGV

Beitrag von Linkat »

Code: Alles auswählen

end;[color=#FF0000][/color]
Dies macht auch keinen Sinn. Falls es ein Kommentar sein soll, dann { } oder (* *) benutzen.
Linux Mint 21; Lazarus 2.2.4 FPC 3.2.2; RaspiOS

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

Re: External:SIGSEGV

Beitrag von theo »

Linkat hat geschrieben:
Mi 27. Jan 2021, 14:40

Code: Alles auswählen

end;[color=#FF0000][/color]
Dies macht auch keinen Sinn. Falls es ein Kommentar sein soll, dann { } oder (* *) benutzen.
Dafür kann er nichts, das macht die Forensoftware, wenn man gleichzeitig den Highlighter benutzt und manuell einfärben will.

Socke
Lazarusforum e. V.
Beiträge: 3158
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: External:SIGSEGV

Beitrag von Socke »

Du kannst das Einhalten der Array-Grenzen auch ganz einfach dem Compiler überlassen:

Code: Alles auswählen

  For i:=low(Karten) to high(Karten) do
      begin
        For j:=low(Karten[i]) to high(Karten[i]) do
          begin
             Karten[i,j]:= 1;             //Alle Karten bekommen den Wert 1
             end;
        end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Nitrom30
Beiträge: 3
Registriert: Mi 27. Jan 2021, 12:40

Re: External:SIGSEGV

Beitrag von Nitrom30 »

fliegermichl hat geschrieben:
Mi 27. Jan 2021, 14:10
In dieser Schleife

Code: Alles auswählen

  For i := 1 to 5 do
  ...
 
greifst du auf Spielerdaten[i, ...] zu. Der erste Index geht aber nur bis 4.
Vielen Dank das Problem habe ich behoben, ich habe anscheinen einmal die Tisch- mit den Spieler-Karten Vertauscht,
jedoch behebt die das Problem nicht....
P.S Falls du zum EDFB gehörst, dann habt ihr eine sehr schöne Gegend zum Fliegen

Nitrom30
Beiträge: 3
Registriert: Mi 27. Jan 2021, 12:40

Re: External:SIGSEGV

Beitrag von Nitrom30 »

Linkat hat geschrieben:
Mi 27. Jan 2021, 14:33
Hallo Nitrom30,
zunächst herzlich willkommen im Lazarusforum.

Was mir gerade so ins Auge sticht (hat nichts mit deinem eigentlichen Problem zu tun):

Code: Alles auswählen

randomize; 
hat nichts in der Schleife zu suchen. 'randomize' soll nur einmal z.B. im OnCreate-Ereignis aufgerufen werden.

Die Klammern () ohne Inhalt einfach weglassen.

Viel Spaß und Erfolg bei deinem Projekt.
Danke für den Tipp, und danke für die Willkommensgrüße!

Antworten