erreur segmentation C++
Dernière réponse : dans Programmation
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....
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;
}
Autres pages sur : erreur segmentation
Lassé par la pub ? Créez un compte
c'est du C++
je suis pas très douée pour les commentaires, j'en ai rajouté quelques uns mais je ne sais pas si c'est très clair!
En gros le problème c'est que comme je dois tester si un bateau se trouve à coté d'ou je veux mettre le nouveau bateau, je suis obligé de regarder les cases d'avant et quand je me trouve vers le bord, je sors de la grille donc erreur de segmentation. J'ai voulu tester et enlever les cas ou ca sort de la grille d'ou des if un peu compliqué! Je pense que l'on peut faire plus simple mais comment?
le "-65" correspond à : ligne etant en char je le mets en int, mais du coup j'ai les nombres entre 65(A) et 74(J) pour rammener à lequivalence entre 1 et 10 j'enleve 65.
Pour colonne, jenleve 1 car ma grille d'affiche : ligne : de A a J et colonne : 1 a 10, mais dans mon tab ce sont les valeurs de 0 à 9!
C'est tres compliqué, vu ke j'ai pas posté tout le programme.... Si vous arrivez à suivre : chapeau! merci!
je suis pas très douée pour les commentaires, j'en ai rajouté quelques uns mais je ne sais pas si c'est très clair!
En gros le problème c'est que comme je dois tester si un bateau se trouve à coté d'ou je veux mettre le nouveau bateau, je suis obligé de regarder les cases d'avant et quand je me trouve vers le bord, je sors de la grille donc erreur de segmentation. J'ai voulu tester et enlever les cas ou ca sort de la grille d'ou des if un peu compliqué! Je pense que l'on peut faire plus simple mais comment?
le "-65" correspond à : ligne etant en char je le mets en int, mais du coup j'ai les nombres entre 65(A) et 74(J) pour rammener à lequivalence entre 1 et 10 j'enleve 65.
Pour colonne, jenleve 1 car ma grille d'affiche : ligne : de A a J et colonne : 1 a 10, mais dans mon tab ce sont les valeurs de 0 à 9!
C'est tres compliqué, vu ke j'ai pas posté tout le programme.... Si vous arrivez à suivre : chapeau! merci!
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;//cas direction ouest : colonne - 1, reste meme ligne
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; // si porte avion : 5 tirs necessaires pour couler
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'))) //test si position different des cases du contour
{
if (tab[(int)ligne - 65 - iligne][colonne - 1 - icolonne] != ' ') //ligne etant un char je soustrait 65 par ASCII
{
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; // si test sort du tableau->FAUX
if (tab[l][c] != ' ')
{
cout<<"Le bateau ne peut pas etre mis ici"<<endl;
return false;
}
if (!((l == 10)||(c == 10))) //si test ne sort pas du tableau
{
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))) //si test ne sort pas du tab
{
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;
}
et je continue a dire que c'est du c. en c++ on utilisent des std::vector et on se fait pas chier avec char**
et puis ton code, il est pas blindé ! si je passe 'X' comme cardinal ? il se passe quoi ?
comportement indéfini ...
pareil pour le type ...
et ces cout n'ont rien a faire dans le code...
et l'utilisation de "using namespace std;" est a proscrire
et puis ton code, il est pas blindé ! si je passe 'X' comme cardinal ? il se passe quoi ?
comportement indéfini ...
pareil pour le type ...
et ces cout n'ont rien a faire dans le code...
et l'utilisation de "using namespace std;" est a proscrire
Je suis désolée mais en fac de maths on nous presente ceci comme tu C++ et le char**tab est un tableau à 2 dimensions.
Jamais vu std::vector! J'ai du mal à croire que mes professeurs d'informatique ne savent pas faire la difference!
En fait, là je ne presente qu'une fonction mais j'ai un programme a coté avec pleins d'autres fonstions et notemment des fonctions pour rentrer le type et cardinal avec des conditions qui empechent d'avoir des comportements indefinis!
Donc je maintiens qu'il faut le using namespace std et les cout et tout....
Jamais vu std::vector! J'ai du mal à croire que mes professeurs d'informatique ne savent pas faire la difference!
En fait, là je ne presente qu'une fonction mais j'ai un programme a coté avec pleins d'autres fonstions et notemment des fonctions pour rentrer le type et cardinal avec des conditions qui empechent d'avoir des comportements indefinis!
Donc je maintiens qu'il faut le using namespace std et les cout et tout....
C'est du C/C++. C'est du C++ de profs de maths quoi :\ ( zeb est diplomé d'une fac de Math-Info, il sait de quoi il parle
)
Le C++ est un langage objet. Le C ne l'est pas.
Le C++ accepte toutes les commandes C, c'est pourquoi on parle de C/C++.
Le C n'accepte que le C.
Il n'y a pas l'ombre de programmation object dans ton code. Tu nous fais de la prose (du C) sans le savoir, M. Jourdain.
( La prochaine fois, écris
Merci pour l'indentation. Tu devrais aussi mettre un peu d'espace dans tes conditions, quitte à sauter des lignes. C'est pour toi que je dis ça.
Je n'ai pas encore vu où était le problème mais je te propose de mettre des printf (ou des cout si tu préfères
) un peu partout pour afficher tes variables. Par exemple, ligne 97, j'écrirais :
Tiens nous au courant
)Le C++ est un langage objet. Le C ne l'est pas.
Le C++ accepte toutes les commandes C, c'est pourquoi on parle de C/C++.
Le C n'accepte que le C.
Il n'y a pas l'ombre de programmation object dans ton code. Tu nous fais de la prose (du C) sans le savoir, M. Jourdain.
( La prochaine fois, écris
(int)(ligne - 'A' - 1)
, juste pour savoir de quoi il s'agit. Ce qui te vaudra peut-être un point de plus sur ta copie soit dit en passant )Merci pour l'indentation. Tu devrais aussi mettre un peu d'espace dans tes conditions, quitte à sauter des lignes. C'est pour toi que je dis ça.
Je n'ai pas encore vu où était le problème mais je te propose de mettre des printf (ou des cout si tu préfères
) un peu partout pour afficher tes variables. Par exemple, ligne 97, j'écrirais : juste avant d'utiliser ces valeurs.
printf ( "tab [%d] [%d] \n", (int)ligne - 65 + itir*iligne, colonne - 1 + itir*icolonne );
Tiens nous au courant
Ca y'est ca marche!
Pas facile de reussir à faire marcher une fonction quand on a une logique de mathématiques en faisant toujours plus compliqué (notamment avec des -65) c'est vrai que quand on les enleve c'est beaucoup plus simple!
J'ai reussi a me debloquer mais il me reste encore beaucoup de trucs à faire sur mon projet! Peut etre que je ferai donc de nouveau appel à vous....
Merci!
Pas facile de reussir à faire marcher une fonction quand on a une logique de mathématiques en faisant toujours plus compliqué (notamment avec des -65) c'est vrai que quand on les enleve c'est beaucoup plus simple!
J'ai reussi a me debloquer mais il me reste encore beaucoup de trucs à faire sur mon projet! Peut etre que je ferai donc de nouveau appel à vous....
Merci!
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumErreur de segmentation dev c
- ForumErreur de segmentation sous linux
- ForumErreur de segmentation dans ns-2
- ForumErreur de segmentation ns2
- ForumErreur de segmentation sur string
- ForumErreur de segmentation gcc
- ForumUne violation d'accã s erreur de segmentation
- ForumErreur de segmentation sur script bash
- ForumWmv to flv ffmpeg erreur de segmentation erreur de segmentation avec ffmpeg
- benchmarkLa segmentation
- Voir plus