Erreur segmentation C++

Résolu/Fermé
Juju - 30 nov. 2006 à 19:11
 juju - 2 déc. 2006 à 00:22
Bonjour, je travaille sur linux et je fais un jeu de bataille navale.
Je veux creer une fonction bool qui permet de voir si on peut placer le bateau aux coordonnées rentrés en parametres (ligne (de A à J), colonne (de 1 à 10), direction (N,S,O,E), type bateau (P,C,S,T,F) et le tab).
Le probleme est "erreur de segmentation", j'ai essayé plusieurs modifications mais je ne trouve pas d'ou vient le probleme.... Je pense que c'est du au fait que je dois à un moment tester des valeurs hors du tableau...non?
Voici mon programme. Merci d'avance à ceux qui prendront le temps de le lire....

bool position_bateau (char ligne, int colonne, char cardinal, char type, char** tab)

{

int icolonne, iligne, itir;

switch (cardinal)

{

case 'O' : icolonne = -1; iligne = 0;break;

case 'E' : icolonne = 1; iligne = 0;break;

case 'S' : iligne = 1; icolonne = 0;break;

case 'N' : iligne = -1; icolonne = 0; break;

}

switch (type)

{

case 'P' : itir = 5;break;

case 'C' : itir = 4; break;

case 'T' : itir = 3; break;

case 'F' : itir = 3;break;

case 'S' : itir = 2;break;

}

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;

}
}
for (int i=0; i<itir;i++)

{
int c,l;
l = (int)ligne - 65 + i*iligne;
c = colonne - 1 +i*icolonne;
if ((i != itir - 1)&&(((l == 1)&&(cardinal == 'N'))||((c == 1) && (cardinal == 'O'))||((l == 10) && (cardinal == 'S'))||((c == 10) && (cardinal ==
'E')))) return false;

if (tab[l][c] != ' ')

{

cout<<"Le bateau ne peut pas etre mis ici"<<endl;

return false;

}


if (!((l == 10)||(c == 10)))
{
if (tab[(int)ligne - 65 + i*iligne + icolonne][colonne - 1 + i*icolonne + iligne] != ' ')
{

cout<<"Le bateau ne peut pas etre mis ici"<<endl;

return false;

}
}

if (!((l == 1)||(c == 1)))
{
if (tab[(int)ligne - 65 + i*iligne - icolonne][colonne - 1 + i*icolonne - iligne] != ' ')

{

cout<<"Le bateau ne peut pas etre mis ici"<<endl;

return false;

}
}
}

if (!((ligne == 1) && (cardinal == 'N'))||((colonne == 1) && (cardinal == 'O'))||((ligne == 10) && (cardinal == 'S'))||((colonne ==
10) && (cardinal == 'E')))
{
if (tab[(int)ligne - 65 + itir*iligne][colonne - 1 + itir*icolonne] != ' ')

{

cout<<"Le bateau ne peut pas etre mis ici"<<endl;

return false;

}
}
else

return true;

}

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
0
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
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
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 :
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
0
Merci beaucoup de votre aide! Ca marche!
Bon j'ai encore pas mal de boulot encore pour finir mon projet mais au moins je suis debloquer!!!! Merci à tous!
0