Segmentation fault (core dumped) [Résolu]

Maxime Bigot - 16 déc. 2015 à 10:56 - Dernière réponse : cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention
- 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.
Afficher la suite 

5 réponses

Répondre au sujet
Maxime Bigot - 16 déc. 2015 à 11:56
+1
Utile
Merci pour cette reponse, mais cela ne resout pas mon probleme :/
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Maxime Bigot
0
Utile
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
Commenter la réponse de Mosca
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 16 déc. 2015 à 13:01
0
Utile
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.
Commenter la réponse de cptpingu
Maxime Bigot - 16 déc. 2015 à 13:15
0
Utile
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;
}
}
Commenter la réponse de Maxime Bigot
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par cptpingu le 16/12/2015 à 16:37
0
Utile
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
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.