IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Exception de class 'External: SIGSEGV' [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 10
    Par défaut Exception de class 'External: SIGSEGV'
    Bonjour,

    Depuis quelques jours, je rencontre le même problème, malgré mes aménagements de code, à la même ligne.

    Mes variables Globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    var
      Form1          : TForm1;
     
      coordsPionsNX  : array[1..16] of integer; // Coordonnées en X (left) des pions noir
      coordsPionsNY  : array[1..16] of integer; // Coordonnées en Y (top) des pions noir
      nomsPionsN     : array[1..16] of string;
     
      coordsPionsRX  : array[1..16] of integer; // Coordonnées en X (left) des pions rouge
      coordsPionsRY  : array[1..16] of integer;
      nomsPionsR     : array[1..16] of string;
     
      indexInitN     : integer = 1;
      indexInitR     : integer = 1;
     
      coordsCasesX   : array[1..64] of integer;
      coordsCasesY   : array[1..64] of integer;
      nomsCases      : array[1..64] of string;
     
      // Emplacement des pieces sur l'Echiquier : Il y a des cases ayant des Pieces Rouge - Noir - Vide
      emplacementPieces    : array[1..64] of string; 
     
      pionNSelectionner    : array[1..16] of boolean; // Tableau du pion Noir Sélectionner
      pionRSelectionner    : array[1..16] of boolean; // Tableau du pion Rouge Sélectionner
     
      // Cases sur lesquelles la pièce sélectionner peut être déplacer
      deplacementPieces    : array[1..64] of boolean;
    .......
    .......

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
     
    // typePiece : roi, tour, fou, pion etc..
    // posInTab : index 
    procedure typeDeplacementPionN(typePiece : string; posInTab : integer);
    var
       x                         : integer;    // variable pour les boucles
       yTop, yDown               : integer;    // variable pour l'incrémentation positive et négative
       continuer                 : boolean;   // permet de sortir du repeat
       compte, increment         : integer;   // fait un comptage - permet de sauter une ou des 'lignes' dans l'échiquier
     
       coordEnX                  : integer;  // Coordonnée X de la pièce sélectionner
       coordEnY                  : integer;  // Coordonnée Y de la pièce sélectionner
     
    begin
        // Réinitialisation Du Tableau des Déplacements
        for x:= 1 to 64 do
        begin
          deplacementPieces[x]   := false;
        end;
     
        coordEnX                  := coordsPionsNX[posInTab];
        coordEnY                  := coordsPionsNY[posInTab];
     
     
     
        case typePiece of
           {UNE TOUR}
           'uneTour'   : begin
     
                 increment := 48;   // Incrémente de 48 'pixel' (je ne connais pas l'unité dans Lazarus)
                 compte    := 1;     // Effectue un comptage
                 continuer := true; // Permet de sortir du repeat
                 yTop        := 1;    // Variable qui s'incrémente positivement
     
                 repeat
     
                   // Lorsque COMPTE atteind <8>, INCREMENT permet l'ajout d'une ligne
                   if compte > 8 then
                   begin
                        compte       := 1;
                        increment    := increment + 48;
                   end;
     
                   // Si limite des Cases de L'Echéquier n'est pas Dépasser
                   // Si les Coordonnées du Déplacement Correspond à une Case
                   if (coordEnY + increment <= 392) and (coordEnY + increment = coordsCasesY[yTop]) and
                       (coordEnX + increment = coordsCasesX[yTop])  then
                   begin
     
                        // Si à Cet Emplacement est Vide ou Contient une PieceRouge
                        if (emplacementPieces[yTop] = 'vide') or (emplacementPieces[yTop] = 'pieceRouge') then
                        begin
                             deplacementPieces[yTop] := true;
                             if emplacementPieces[yTop] = 'pieceRouge' then
                             continuer := false;
                        end
                        else
                        begin
                             continuer := false;
                        end; 
                   end;
     
                   yTop              := yTop + 1;
                   compte            := compte + 1;
                 until continuer = false;
        end; 
    end;
    L'exception à été signalé à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if (coordEnY + increment <= 392) and (coordEnY + increment = coordsCasesY[yTop]) and
                       (coordEnX + increment = coordsCasesX[yTop])
    Pourtant, mon code pour le déplacement du roi et du pion, UNE CASE, ne pose pas de problème.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 925
    Billets dans le blog
    6
    Par défaut
    Que vaut yTop au moment de l'exception ?

    Si tu n'arrives pas à le voir, essaye de déboguer comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    try
      if (coordEnY + increment <= 392) and (coordEnY + increment = coordsCasesY[yTop]) and
                       (coordEnX + increment = coordsCasesX[yTop]) then
      begin
        //...
      end;
    except 
      ShowMessage('Lors de l''exception, yTop vaut '+IntToStr(yTop));
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 10
    Par défaut
    À moins que je n'ai pas correctement mis le Try
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
          'uneTour'   : begin
     
                 increment := 48;
                 compte    := 1;
                 continuer := true;
                 yTop      := 1;
                 yDown     := 64;
     
                 repeat
     
                   // Lorsque COMPTE atteind <8>, INCREMENT permet l'ajout d'une ligne
                   if compte > 8 then
                   begin
                        compte       := 1;
                        increment    := increment + 48;
                   end;
     
                   // Si limite des Cases de L'Echéquier n'est pas Dépasser
                   // Si les Coordonnées du Déplacement Correspond à une Case
                   try
                   if (coordEnY + increment <= 392) and (coordEnY + increment = coordsCasesY[yTop]) and
                       (coordEnX + increment = coordsCasesX[yTop])  then
                   begin
     
                        // Si à Cet Emplacement est Vide ou Contient une PieceRouge
                        if (emplacementPieces[yTop] = 'vide') or (emplacementPieces[yTop] = 'pieceRouge') then
                        begin
                             deplacementPieces[yTop] := true;
                             if emplacementPieces[yTop] = 'pieceRouge' then
                             continuer := false;
                        end
                        else
                        begin
                             continuer := false;
                        end;
                   end;
                   except
                     showMessage('Lors de l''exception, yTop vaut '+intToStr(yTop));
                   end;
     
                   yTop              := yTop + 1;
                   compte            := compte + 1;
                 until continuer = false;
        end;
    Il n'y a pas eu l'affichage du showMessage.

    Voici un imprime écran

    Nom : error.png
Affichages : 1067
Taille : 7,7 Ko

    Par contre, en remplaçant le 'except' par 'finally', le 'yTop' démarre au nombre '1' pour... j'ai arrêté de cliquer à 600, mais ça continuait.


    En aménagement de nouveau mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
           {UNE TOUR}
           'uneTour'   : begin
     
                 increment := 48;
                 compte    := 1;
                 continuer := true;
                 yTop      := 1;
                 yDown     := 64;
                 memoYto   := 0;     // Mémorise lyTop
                 voirMemo  := false; 
     
                 repeat
                   // Lorsque COMPTE atteind <8>, INCREMENT permet l'ajout d'une ligne
                   if compte > 8 then
                   begin
                        compte       := 1;
                        increment    := increment + 48;
                   end;
     
                   // Si limite des Cases de L'Echéquier n'est pas Dépasser
                   // Si les Coordonnées du Déplacement Correspond à une Case
                   try
                   if (coordEnY + increment <= 392) and (coordEnY + increment = coordsCasesY[yTop]) and
                       (coordEnX + increment = coordsCasesX[yTop]) and voirMemo = false  then
                   begin
     
                       memoYto   := yTop;
                       voirMemo  := true;
     
                   end;
                   finally
                     showMessage('Lors de l''exception, yTop vaut '+intToStr(yTop));
                   end;
     
     
                   if voirMemo = true then
                   begin
                       voirMemo  := false;
     
                         // Si à Cet Emplacement est Vide ou Contient une PieceRouge
                        if (emplacementPieces[memoYto] = 'vide') or (emplacementPieces[memoYto] = 'pieceRouge') then
                        begin
                             deplacementPieces[memoYto] := true;
                             if emplacementPieces[memoYto] = 'pieceRouge' then continuer := false;
                        end
                        else
                        begin
                             continuer := false;
                        end;
     
                   end;
     
     
     
                   yTop              := yTop + 1;
                   if yTop >= 65 then continuer := false;
                   //compte            := compte + 1;
                 until continuer = false;
        end;
    J'ai seulement deux affichage du message donnant la valeur d'yTop, c'est à dire : yTop = 1 puis yTop = 2, mais je n'ai pas le déplacement attendu dans mon IHM.

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 925
    Billets dans le blog
    6
    Par défaut
    Si je comprends le code, tant que la pièce arrive sur une case vide, elle semble continuer son déplacement, et yTop s'incrémente, y compris au-delà de la limite des tableaux (tu as cliqué jusqu'à 600 !) jusqu'à ce qu'on adresse une zone mémoire interdite, où ça crash.

    Il faut sûrement revoir les conditions d'arrêt...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 10
    Par défaut
    Il y a de forte chance, car ce que je ne comprends pas, c'est qu'il y a 2 conditions pour que ce genre d'incident n'arrive pas.

    Voici comment fonctionne mon programme. Mais avant toute chose, lorsqu'une pièce Noir appelle cette procedure, par une clique sur un pièce (TouR, Roi, Reine etc..), elle identifie le type de pièce, puis elle met dans un tableau le type de déplacement de cette dernière.

    Comme vous l'avez deviné, il s'agit d'un jeux d'échec, donc l'échiquier de 64 cases est composé de TShape. La première case à pour 'coordonnées': Top= 56 et Left = 240, tandis que le dernier : Top = 392 et Left = 576, voici donc mes limites pour X et Y(1ère condition d'arrêt).

    Mon algorithme:

    Dans un repeat, jusqu'à continuer = false (2nd condition d'arrêt)
    Pour un déplacement vertical (une tour)
    Si les coordonnées Y de la case de la pièce + 48 <= 392 (coordEnY + increment <= 392) ET
    si les coordonnées Y de la case de la pièce + 48 = aux coordonnées Y d'un Tshape et
    si les coordonnées X de la case de la pièce = aux coordonnées X d'un Tshape ET
    voirMemo = false ALORS

    Je mémorise l'index yTop dans memoYtop
    et je mets voirMemo = true


    Puis Si voirMemo = true ALORS
    Je remet voirMemo = false

    Si en utilisant l'index memoYto, il y a 'vide' ou 'pieceRouge' dans le tableau emplacementPieces
    J'indique par True, dans le tableau deplacementPieces, que le déplacement dans cette case est possible
    Mais si le tableau deplacementPieces contenait une pieceRouge
    condition d'arrêt du repeat : continuer = false
    Autrement, si le emplacementPieces à autre chose que 'vide' ou 'pieceRouge', il y a le condition d'arrêt: continuer = false

  6. #6
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,
    Citation Envoyé par sebBastien Voir le message
    Il y a de forte chance, car ce que je ne comprends pas, c'est qu'il y a 2 conditions pour que ce genre d'incident n'arrive pas.
    Eh non, ce sont des conditions nécessaires mais pas suffisantes !

    Elles permettent de déterminer si un mouvement sur une case est possible, mais elles ne déterminent pas que l'on a parcouru tout l'échiquier (yTop > 64) !

    De plus, si vous aviez compilé votre programme en spécifiant les contrôles d'intervalles dans les infos de débogage (options du projet), vous auriez eu un message plus explicite...

    Il faut rajouter cette condition d'arrêt sur le parcours complet de l'échiquier...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exception: EClassNotFound class TLabel
    Par Pill_S dans le forum Langage
    Réponses: 12
    Dernier message: 25/01/2018, 17h17
  2. Réponses: 1
    Dernier message: 17/12/2010, 20h18
  3. [Lazarus] GetCurrentDir : exception External SIGSEGV
    Par JP.NUAGE dans le forum Lazarus
    Réponses: 2
    Dernier message: 07/06/2009, 06h59
  4. [Info]Classes externe
    Par mrttlemonde dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 09/11/2005, 19h11
  5. [EJB][JONAS] EJB utilisant une classe "externe"
    Par Gregory3000 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/12/2004, 19h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo