|
|
|
|
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;
}
Premierement j'aurai une petite question pour toi avant que j'aille plus loin dans l'evaluation de ton bout de code ?
|
Apres une deuxieme evaluation je vois que dans ton programme tu test si ligne == 1 ou ligne == 10 mais ligne est un char ....
|
Peux tu nous donner l'extrait de code qui compile mais qui segfault, car là on ne peut pas trop debugger ?
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 |