Erreur segmentation C++
Résolu/Fermé
A voir également:
- Erreur segmentation C++
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 1001 outlook - Accueil - Bureautique
- Erreur de segmentation (core dumped) ✓ - Forum Programmation
- Erreur g030 - Forum Bbox Bouygues
4 réponses
Premierement j'aurai une petite question pour toi avant que j'aille plus loin dans l'evaluation de ton bout de code ?
Le parametre char **tab est le tableau ou tu joue ton jeux est-il bien alloué ? car cette partie de code tu le montre pas ...
Premiere chose a verifier mais avec le code que tu as envoyer on ne peux le vérifier
Frank
Le parametre char **tab est le tableau ou tu joue ton jeux est-il bien alloué ? car cette partie de code tu le montre pas ...
Premiere chose a verifier mais avec le code que tu as envoyer on ne peux le vérifier
Frank
Apres une deuxieme evaluation je vois que dans ton programme tu test si ligne == 1 ou ligne == 10 mais ligne est un char ....
ex...
if (!((ligne == 1) && (cardinal == 'N'))||((colonne == 1) && (cardinal == 'O'))||((ligne == 10) && (cardinal == 'S'))||((colonne ==10) && (cardinal == 'E')))
{
if (tab[(int)ligne - 65 - iligne][colonne - 1 - icolonne] != ' ')
{
cout<<"Le bateau ne peut pas etre mis ici"<<endl;
return false;
}
et de plus tu fais ligne -65 - iligne mais iligne peut etre -1 alors dans le cas ou ligne == A on a A-65-1 = -1 ce qui est a l'exterieur du tableau....
Voici quelque changment a faire pour faciliter la lecture de ton code
1: remplacé dans l'entete de la fonction
bool position_bateau (char ligne, int colonne, char cardinal, char type, char** tab) par
bool position_bateau (char ligneLettre , int colonne, char cardinal, char type, char** tab)
ensuite definir
int ligne =toupper( ligneLettre) - 'A' ;
je ne sais pas ce que la plus part des gens on a vouloir se casser la tete avec quelquechose comme '- 65'
cela rend un programme pas portable dans des environnements différent de ascii et personne ne se rapelle jamais la valeur numerique des code ascii, pourquoi faire compliqué quand on peut faire simple
(le toupper() est juste pour permettre a la fonction de prendre une majuscule ou une minuscule)
par la suite tu utilise partout ligne sans a chaque fois etre obligé de deduire 65...
Autre commentaire la chaine "Le bateau ne peut pas etre mis ici";
tu le declare au debut du programme comme un static const char *
cela vas rendre ton programme plus petit (la chaine ne sera pas répété si le compilateur n'a pas d'optimisation a ce niveau) et deplus si tu as a la changé tu as une seule place a modifié...
Autre point comme tu fait du C++ je te conseille de ne pas utilisé un tableau de char pour le jeux mais plutot une classe ...
Les avantage sont les suivantes:
Ta classe a le tableau mais connait aussi la grandeur du tableau elle peut donc controlé l'access a l'extérieur du tableau.
Tu pourrais avoir different grandeur de tableau sans changé ton programme...
Mais bon ce n'est que des idées
Frank
ex...
if (!((ligne == 1) && (cardinal == 'N'))||((colonne == 1) && (cardinal == 'O'))||((ligne == 10) && (cardinal == 'S'))||((colonne ==10) && (cardinal == 'E')))
{
if (tab[(int)ligne - 65 - iligne][colonne - 1 - icolonne] != ' ')
{
cout<<"Le bateau ne peut pas etre mis ici"<<endl;
return false;
}
et de plus tu fais ligne -65 - iligne mais iligne peut etre -1 alors dans le cas ou ligne == A on a A-65-1 = -1 ce qui est a l'exterieur du tableau....
Voici quelque changment a faire pour faciliter la lecture de ton code
1: remplacé dans l'entete de la fonction
bool position_bateau (char ligne, int colonne, char cardinal, char type, char** tab) par
bool position_bateau (char ligneLettre , int colonne, char cardinal, char type, char** tab)
ensuite definir
int ligne =toupper( ligneLettre) - 'A' ;
je ne sais pas ce que la plus part des gens on a vouloir se casser la tete avec quelquechose comme '- 65'
cela rend un programme pas portable dans des environnements différent de ascii et personne ne se rapelle jamais la valeur numerique des code ascii, pourquoi faire compliqué quand on peut faire simple
(le toupper() est juste pour permettre a la fonction de prendre une majuscule ou une minuscule)
par la suite tu utilise partout ligne sans a chaque fois etre obligé de deduire 65...
Autre commentaire la chaine "Le bateau ne peut pas etre mis ici";
tu le declare au debut du programme comme un static const char *
cela vas rendre ton programme plus petit (la chaine ne sera pas répété si le compilateur n'a pas d'optimisation a ce niveau) et deplus si tu as a la changé tu as une seule place a modifié...
Autre point comme tu fait du C++ je te conseille de ne pas utilisé un tableau de char pour le jeux mais plutot une classe ...
Les avantage sont les suivantes:
Ta classe a le tableau mais connait aussi la grandeur du tableau elle peut donc controlé l'access a l'extérieur du tableau.
Tu pourrais avoir different grandeur de tableau sans changé ton programme...
Mais bon ce n'est que des idées
Frank
mamiemando
Messages postés
33333
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
31 octobre 2024
7 800
1 déc. 2006 à 09:03
1 déc. 2006 à 09:03
Peux tu nous donner l'extrait de code qui compile mais qui segfault, car là on ne peut pas trop debugger ?
Tu peux localiser ou se trouve les erreurs en mettant en début et fin de fonction des trucs genre :
Ca permettra de resserrer l'étau. Ensuite je te rappelle que tu peux utiliser le debuggeur pour directement trouver la ligne où ça plante. Par exemple sous linux :
Dans gdb :
r lance le programme et bt la pile d'éxecution indiquant précisemment ou et pourquoi ça a planté.
Bonne chance
Tu peux localiser ou se trouve les erreurs en mettant en début et fin de fonction des trucs genre :
void f(){ std::cout << "entre dans f()" << std::endl; //code de f() std::cout << "sort de f()" << std::endl; }
Ca permettra de resserrer l'étau. Ensuite je te rappelle que tu peux utiliser le debuggeur pour directement trouver la ligne où ça plante. Par exemple sous linux :
g++ -W -Wall -o plop.exe plop.cpp gdb plop.exe
Dans gdb :
r bt
r lance le programme et bt la pile d'éxecution indiquant précisemment ou et pourquoi ça a planté.
Bonne chance