Bonjour a tous !
J'avais déja posté ici il y a un certain temps , au sujet des nombres 64bits (pour introduire les tables de haschage dans mon programme d'échecs)
J'ai perdu entretemps mes identifiants donc je me réinscris ... et me re présente
Dany 50 ans , autodidacte dans le C depuis un certain temps (toujours des cheveux
) et un hobby addictif : le développement d'un programme d'échecs en C.
J'ai un release qui joue (là notamment : http://www.open-aurec.com/chesswar/) mais je suis passé récemment de DEVC++ a code blocks et j'utilise maintenant un compilateur 64 bits mingw64
J'ai un segmentation fault depuis hier que je ne parviens pas a comprendre
Je ne peux pas poster tout les fichiers sources (!) je vais essayer d'être le plus précis possible
J'ai des structures pour créer les listes de coups et les sauvegarder :
dans définition.h :
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
|
#define COUP_MAX 499
#define PILE_COUPS 1000
typedef struct le_COUP
{
int dep; /*n°case depart du coup*/
int arr; /*n° case d'arrivee du coup*/
int piece_jouee; /*piece jouee (roi , pion , etc ....*/
int piece_prise; /*piece capturee */
int type; /*type de coup (normal ,prise roque etc...)*/
signed int ep; /*case de prise en passant (VIDE ou n°case)*/
int pion_ep; /*n°case du pion pris en passant (pour jouer/dejouer)*/
int val; /*valeur du coup apres evaluation rapide*/
int piece_promue; /*en cas de promo val DTFC*/
} COUP;
/*------------------------------------------------------------------------------
| structure pour sauvegarder les coups dans l'arbre | |
|------------------------------------------------------------------------------*/
typedef struct coup_ARBRE
{
COUP t; /*coup joue*/
int statut; /*coup dans biblio ou non (VRAI ou FAUX*/
int cap; /*si prise cap = etiquette piece*/
ull hashcode; /*code de la position*/
int coul; /*couleur piece prise*/
int regle_50; /*valeur pour nul par 50 coups*/
int enpassant; /*flag en passant : -1 ou numero case*/
} L_ARBRE; |
Je déclare un tableau qui sauvegarde les coups joués lors de la recherche pour pouvoir les déjouer ensuite et un autre qui sert de pile , créant les coups légaux a chaque profondeur
dans datas.h :
1 2
| extern L_ARBRE coups[COUP_MAX+1];
extern COUP pile_coups[PILE_COUP+1]; |
dans datas.c:
1 2
| L_ARBRE coups[COUP_MAX+1];
COUP pile_coups[PILE_COUP+1]; |
Lorsqu'on joue un coup on doit sauvegarder un certain nombre d'infos sur la positon précédente ? je fais comme ça :
dans analyse.c :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
int jouer_coup(int x)
{
int echec = 0;
COUP c;
int xc = OPP(side);
c = pile_coups[x];
//----------------------------------------------------------------------------------------------------------------
// sauvegarde des données du coup précédent
coups[nb_coups].t = c; //index
coups[nb_coups].statut = coup_biblio; //coup biblio ou non
.....
} |
ça marchait comme ça ... jusqu’à ce que je veuille ajouter deux tableaux dans la structure le_COUP pour sauvegarder l'état des roques (tables droit_OO[3] et droit_OOO[3]
Dans definition.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
typedef struct le_COUP
{
int dep; /*n°case depart du coup*/
int arr; /*n° case d'arrivee du coup*/
int piece_jouee; /*piece jouee (roi , pion , etc ....*/
int piece_prise; /*piece capturee */
int type; /*type de coup (normal ,prise roque etc...)*/
signed int ep; /*case de prise en passant (VIDE ou n°case)*/
int pion_ep; /*n°case du pion pris en passant (pour jouer/dejouer)*/
int val; /*valeur du coup apres evaluation rapide*/
int droit_OO[3] /*statut petits roques*/
int droit_OOO[3] /*statut grands roques*/
int piece_promue; /*en cas de promo val DTFC*/
} COUP; |
ça m'a fait un segmentation fault a l'exécution suivante , j'ai supprimé les deux tableaux et là ça continue ! en mode débug de codeblocks le programme plante a chaque fois à une ligne où il y a coups[..].qquechose
Si j'entre un coup par exemple (sous la forme e2e4) le programme plante a la ligne
coups[nb_coups].t = c; //index
de la fonction jouer_coups(int x)
J'avoue que je n'arrive pas a comprendre pourquoi ça plante , même en ayant supprimé les deux tableaux ... en un mot (lol) : Au secours !!!!
merci pour vos conseils et réponses éclairées !
dany le bricolo du C
Partager