Segmentation fault (core dumped)

Résolu
Maxime Bigot - 16 déc. 2015 à 10:56
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 16 déc. 2015 à 15:30
Bonjour tous le monde.

Ceci est mon premier message sur un forum, mais je n'ai plus aucune solution, alors j'espere que vous pourrais m'aider.
Alors mon problème, dans le cadre d'un projet en C pour mon école, nous devons modifier un shell sous linux, en y ajoutant différentes options, notamment un easter-egg sur les tours de hanoï. Je suis un débutant en info, donc j'ai eu quelques problèmes pour faire mon programme, mais j'ai finalement réussi à le faire fonctionner.... sur windows. En passant mon code sur linux, j'arrive a compiler mon programme, mais apres avoir rentré mes premieres valeurs sur mes piliers pour bouger les disques, une erreur de segmentation apparait. J'ai essayé plusieurs choses, deja trouver la source du probleme, qui semblait etre un scanf béliqueux. Apres avoie essayé de le remplacer par d'autres fonctions, le probleme n'etais pas résolu. J'ai demandé de l'aide a différentes personnes, et même a mon tuteurs, mais impossible de trouver la sollution.
Je me tourne donc vers ma derniere sollution, demander de l'aide sur un forum.

voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pile.h"
#include "pile_fonction.h"
#include <unistd.h>

int main ()
{
Pile *tasA;
Pile *tasB;
Pile *tasC;
int *nombre = NULL;
int NbrDisq;
int i = 1;
if ((tasA = (Pile *) malloc (sizeof (Pile))) == NULL)
return -1;
if ((tasB = (Pile *) malloc (sizeof (Pile))) == NULL)
return -1;
if ((tasC = (Pile *) malloc (sizeof (Pile))) == NULL)
return -1;
if ((nombre = (int *) malloc (50 * sizeof (int))) == NULL)
return -1;
initialisation (tasA);
initialisation (tasB);
initialisation (tasC);


while(i){

printf("\nVeuillez m'indiquer un nombre entre 4 et 10 pour savoir avec combien de disque vous voulez jouer : ");
scanf("%d", &NbrDisq);


if(NbrDisq >=4 && NbrDisq<=10){

printf("\nVous m'avez indique comme nombre de disque %d.\n", NbrDisq);
i = 0;

}

else{

printf("\nLe nombre que vous m'avez indique n'est pas correcte.\n");
}

}
nombre = &NbrDisq;

set(nombre, tasA);
jouer(tasA, tasB, tasC, NbrDisq);

}


void set(int *nombre, Pile *tasA){

int i;
int a = *nombre;

for(i=a; i>0; i--){

empiler(tasA, i);
}
printf("\n\n");
}


void afficher(Pile *tasA, Pile *tasB, Pile *tasC,int NbrDisq){


Element *courant;
int x;
int y;
int z;
int i = 0;
int j = tasA->taille;
int tableau [3][NbrDisq];
memset(tableau,0, sizeof(tableau));
int pointeur = 0;

for(j; j > 0;j--){


pointeur = j;
courant = tasA->debut;

for(pointeur; pointeur > 1; pointeur--){

courant = courant->suivant;

}

tableau[0][i] = courant->donnee;
i++;
}


j = tasB->taille;
i = 0;


for(j; j > 0;j--){


pointeur = j;
courant = tasB->debut;

for(pointeur; pointeur > 1; pointeur--){

courant = courant->suivant;

}

tableau[1][i] = courant->donnee;
i++;
}

j = tasC->taille;
i = 0;


for(j; j > 0;j--){


pointeur = j;
courant = tasC->debut;

for(pointeur; pointeur > 1; pointeur--){

courant = courant->suivant;

}

tableau[2][i] = courant->donnee;
i++;
}


j = NbrDisq - 1;

for (j; j >= 0; j--){

x = tableau[0][j];
y = tableau[1][j];
z = tableau[2][j];

printf("\t\t");

if (x != 0){
if(NbrDisq == 10){
if (x!=10){
printf(" %d|%d ", x, x);
}
else{
printf("%d|%d", x, x);
}
}
else{
printf("%d|%d", x, x);
}
}
else{
if (NbrDisq == 10){
printf(" | ");
}
else{
printf(" | ");
}
}

printf("\t\t");

if (y != 0){
if(NbrDisq == 10){
if (y!=10){
printf(" %d|%d ", y, y);
}
else{
printf("%d|%d", y, y);
}
}
else{
printf("%d|%d", y, y);
}
}
else{
if (NbrDisq == 10){
printf(" | ");
}
else{
printf(" | ");
}
}

printf("\t\t");

if (z != 0){
if(NbrDisq == 10){
if (z!=10){
printf(" %d|%d ", z, z);
}
else{
printf("%d|%d", z, z);
}
}
else{
printf("%d|%d", z, z);
}
}
else{
if (NbrDisq == 10){
printf(" | ");
}
else{
printf(" | ");
}
}


printf("\n");


}

printf("\t\t___________________________________");
printf("\n\n\t\t 1\t\t 2\t\t 3");
printf("\n\n");


}


void deplacer(Pile *tasA, Pile *tasB, Pile *tasC){

int a;
int b;
int y;
int z;
int i = 1;
int verif = 1;
int *tampon;
int yatilunb;
Element *passe;
Element *futur;

while(verif){

while(i){

printf("\nQuel est le numero du pillier ou se trouve le disque que vous voulez deplacer ? (1, 2 ou 3) : ");
scanf("%d %d", &y, &z);

if (y < 1 || y > 3){

printf("\nAction impossible!\n");

}

else{

if(z < 1 || z > 3){

printf("Action impossible");

}

else{

i = 0;

}

}

}

i = 1;


if(y == 1){

if(tasA->debut != NULL){

passe = tasA->debut;
a = passe->donnee;
verif = 0;

}

else{

printf("\nAction Impossible!\n");

}

}

else if(y == 2){

if(tasB->debut != NULL){

passe = tasB->debut;
a = passe->donnee;
verif = 0;

}

else{

printf("\nAction Impossible!\n");

}

}

else{

if(tasC->debut != NULL){

passe = tasC->debut;
a = passe->donnee;
verif = 0;

}

else{

printf("\nAction Impossible!\n");

}

}



if(z == 1){

if(tasA->debut != NULL){

futur = tasA->debut;
b = futur->donnee;
yatilunb = 1;

}

else{

yatilunb = 0;

}

}

else if(z == 2){

if(tasB->debut != NULL){

futur = tasB->debut;
b = futur->donnee;
yatilunb = 1;

}

else{

yatilunb = 0;

}

}

else{

if(tasC->debut != NULL){

futur = tasC->debut;
b = futur->donnee;
yatilunb = 1;

}

else{

yatilunb = 0;

}

}

}

if(yatilunb = 1){

if(a>b){

printf("\nAction impossible\n");

}

else{

tampon = &a;

if (y == 1){

depiler (tasA);

}

else if(y==2){

depiler(tasB);

}

else{

depiler(tasC);

}

if(z==1){

empiler(tasA, a);
}

else if(z==2){

empiler(tasB, a);

}

else{

empiler(tasC, a);
}

}

}

else{

tampon = &a;

if (y == 1){

depiler (tasA);

}

else if(y==2){

depiler(tasB);

}

else{

depiler(tasC);

}

if(z==1){

empiler(tasA, a);
}

else if(z==2){

empiler(tasB, a);

}

else{

empiler(tasC, a);
}

}

}



int verifier(Pile *tasC, int NbrDisq){

int taille;
taille = tasC->taille;

if(taille != NbrDisq){

return 1;

}

else{

return 0;

}
}


Voila, excusez moi pour la longueur du code, ainsi que si le code vous semble vraiment brouillon, mais ceci est mon 2eme code.
Bref en esperant une réponse de votre part, et en vous remerciant.

5 réponses

Maxime Bigot
16 déc. 2015 à 11:56
Merci pour cette reponse, mais cela ne resout pas mon probleme :/
1
Bonjour,

Je passais par là et en lisant votre code, j'ai remarqué à la ligne 393
if(yatilunb = 1){

Écrit comme ça, le test est toujours vrai donc le else ne s’exécutera jamais.

Il faut écrire
if(yatilunb == 1){

Bonne continuation
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
16 déc. 2015 à 13:01
Il faudrait que tu passes ton code dans gdb, tu verrais vite ce qui ne va pas.
Je peux regarder, mais pour cela, il faut que tu ajoutes les fichiers manquant, car je ne peux pas compiler.
0
Maxime Bigot
16 déc. 2015 à 13:15
pile.h :
typedef struct ElementListe{

int donnee;
struct ElementListe *suivant;

} Element;

typedef struct ListeRepere{

Element *debut;
int taille;
} Pile;

/* initialisation */
void initialisation (Pile *tas);

/* EMPILER*/
int empiler (Pile *tas, int *donnee);

/* DEPILER*/
int depiler (Pile *tas);

/* Affichage de élément en haut de la pile (LastInFirstOut) */
#define pile_donnee(tas) tas->debut->donnee

/* Affiche la pile */
void affiche (Pile *tas);


pile_fonction.h :
void initialisation (Pile * tas){
tas->debut = NULL;
tas->taille = 0;
}


/* empiler (ajouter) un élément dans la pile */
int empiler (Pile * tas, int *donnee){
Element *nouveau_element;
if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL)
return -1;
/*if ((nouveau_element->donnee = (int *) malloc (50 * sizeof (int)))
== NULL)
return -1;*/
nouveau_element->donnee = donnee;
nouveau_element->suivant = tas->debut;
tas->debut = nouveau_element;
tas->taille++;
}


/* depiler (supprimer un élément de la pile */
int depiler (Pile * tas){
Element *supp_element;
if (tas->taille == 0)
return -1;
supp_element = tas->debut;
tas->debut = tas->debut->suivant;
free (supp_element->donnee);
free (supp_element);
tas->taille--;
return 0;
}


/* affichage de la pile */
void affiche (Pile * tas){
Element *courant;
int i;
courant = tas->debut;

for(i=0;i<tas->taille;++i){
printf("%d\n", courant->donnee);
courant = courant->suivant;
}
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 16/12/2015 à 16:37
Pense à compiler en activant *tout* les warnings. Parce que là, c'est festival :(.


pile_fonction.c: In function ‘empiler’:
pile_fonction.c:18:27: warning: assignment makes integer from pointer without a cast [enabled by default]
pile_fonction.c: In function ‘depiler’:
pile_fonction.c:32:3: warning: passing argument 1 of ‘free’ makes pointer from integer without a cast [enabled by default]
/usr/include/stdlib.h:488:13: note: expected ‘void *’ but argument is of type ‘int’
pile_fonction.c: In function ‘affiche’:
pile_fonction.c:46:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
pile_fonction.c:46:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
pile_fonction.c: In function ‘empiler’:
pile_fonction.c:22:1: warning: control reaches end of non-void function [-Wreturn-type]
pile.c: In function ‘main’:
pile.c:49:3: warning: implicit declaration of function ‘set’ [-Wimplicit-function-declaration]
pile.c:50:3: warning: implicit declaration of function ‘jouer’ [-Wimplicit-function-declaration]
pile.c: At top level:
pile.c:55:6: warning: conflicting types for ‘set’ [enabled by default]
pile.c:49:3: note: previous implicit declaration of ‘set’ was here
pile.c: In function ‘set’:
pile.c:62:5: warning: passing argument 2 of ‘empiler’ makes pointer from integer without a cast [enabled by default]
pile.h:19:5: note: expected ‘int *’ but argument is of type ‘int’
pile.c: In function ‘afficher’:
pile.c:81:3: warning: statement with no effect [-Wunused-value]
pile.c:87:5: warning: statement with no effect [-Wunused-value]
pile.c:102:3: warning: statement with no effect [-Wunused-value]
pile.c:108:5: warning: statement with no effect [-Wunused-value]
pile.c:122:3: warning: statement with no effect [-Wunused-value]
pile.c:128:5: warning: statement with no effect [-Wunused-value]
pile.c:141:3: warning: statement with no effect [-Wunused-value]
pile.c: In function ‘deplacer’:
pile.c:392:3: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
pile.c:424:9: warning: passing argument 2 of ‘empiler’ makes pointer from integer without a cast [enabled by default]
pile.h:19:5: note: expected ‘int *’ but argument is of type ‘int’
pile.c:429:9: warning: passing argument 2 of ‘empiler’ makes pointer from integer without a cast [enabled by default]
pile.h:19:5: note: expected ‘int *’ but argument is of type ‘int’
pile.c:435:9: warning: passing argument 2 of ‘empiler’ makes pointer from integer without a cast [enabled by default]
pile.h:19:5: note: expected ‘int *’ but argument is of type ‘int’
pile.c:466:7: warning: passing argument 2 of ‘empiler’ makes pointer from integer without a cast [enabled by default]
pile.h:19:5: note: expected ‘int *’ but argument is of type ‘int’
pile.c:471:7: warning: passing argument 2 of ‘empiler’ makes pointer from integer without a cast [enabled by default]
pile.h:19:5: note: expected ‘int *’ but argument is of type ‘int’
pile.c:477:7: warning: passing argument 2 of ‘empiler’ makes pointer from integer without a cast [enabled by default]
pile.h:19:5: note: expected ‘int *’ but argument is of type ‘int’
pile.c:241:8: warning: variable ‘tampon’ set but not used [-Wunused-but-set-variable]
pile.c: In function ‘main’:
pile.c:52:1: warning: control reaches end of non-void function [-Wreturn-type]
/tmp/cckAhm61.o:pile.c:function main: error: undefined reference to 'jouer'
collect2: ld returned 1 exit status


Je n'ai pas encore passé de gdb, puisque la fonction "jouer" n'existe pas. Je ne peux donc pas compiler.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
ttp://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
Rejoignez-nous