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

  1. #1
    Futur Membre du Club
    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
    Points : 7
    Points
    7
    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 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 403
    Points
    11 403
    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;

  3. #3
    Futur Membre du Club
    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
    Points : 7
    Points
    7
    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 : 1052
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 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 403
    Points
    11 403
    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...

  5. #5
    Futur Membre du Club
    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
    Points : 7
    Points
    7
    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 : 58
    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
    Points : 5 918
    Points
    5 918
    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...

  7. #7
    Futur Membre du Club
    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
    Points : 7
    Points
    7
    Par défaut
    Bonsoir à tous

    Citation Envoyé par Ph. B. Voir le message
    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...
    Ca fait 1 semaine que je me suis mis au Pascal sur Lazarus, je ne connais pas encore certaines astuces . Autrement, j'ai remplacé le repeat par un for x := 1 to 64, ça empêchera les boucles sans fin.

    J'ignore si je suis sur la bonne voie, car j'ai plus d'une procedure en parallèle qui s'appellent, mais j'ai un début de résultat. En effet, en faisant d'innombrable tests, j'ai remarqué que les IF ne peuvent traité que 2 'Boolean', pas d'avantage (à moins que je ne sache pas m'y prendre).

    Exemple :
    if (unNbrA = unNbrB) and (unNbrC = unNbrD) => Ok
    Qu'il semble être considéré : if TRUE and FALSE

    if (unNbrA = unNbrB) and (unNbrC = unNbrD) and (unNbrE = unNbrF) => not Ok
    Qu'il semble être considéré : if True and FALSE and TRUE

    En enlevant les parenthèses, j'ai remarqué un beug
    'On obtient un Boolean, un LongInt était attendu', après un sommaire traduction.

  8. #8
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Concernant ton premier message : l'erreur vient de la non vérification de la valeur de YTop.
    Comme tu fais une incrémentation de YTop en fin de boucle, si Continuer est toujours true, le test "...coordsCasesY[yTop]" peut provoque une erreur si YTop a une valeur supérieure à 64, car tu sors des limites de ton array (1..64).
    Si tu remplaces ton Until par : until (Continuer = false) or (yTop > 64) , tu ne devrais plus avoir de problèmes.

    Concernant ton dernier message, un IF peut contenir une "panoplie" de and ou or , à condition de bien utiliser les parenthèses !

    Thierry

  9. #9
    Futur Membre du Club
    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
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous !!

    Vraiment un grand grand merci pour votre aide, suite à vos conseils j'ai pu trouvé les erreurs de mon code. Sans entré dans les détails, car ça risque d'être long, j'avais des erreurs au niveau de l'enregistrement de certains tableaux et variables.

    C'était long de vérifier la valeur de chaque variables, par leurs affichages, mais c'était pour la bonne cause. Actuellement toutes mes pièces se déplacent en respectant leur 'type': pion, cavalier, fou etc.

    Encore merci et dorénavant je serais adepte des showMessage et des Try

+ 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, 18h17
  2. Réponses: 1
    Dernier message: 17/12/2010, 21h18
  3. [Lazarus] GetCurrentDir : exception External SIGSEGV
    Par JP.NUAGE dans le forum Lazarus
    Réponses: 2
    Dernier message: 07/06/2009, 07h59
  4. [Info]Classes externe
    Par mrttlemonde dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 09/11/2005, 20h11
  5. [EJB][JONAS] EJB utilisant une classe "externe"
    Par Gregory3000 dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/12/2004, 20h57

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