Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/04/2017, à 20:53

Sébastien COLLARD

Problème erreur de segmentation (core dumped)

Bonjour à tous,
j'ai commencer la programmation en C et j'ai rencontrer un petit problème que je n'arrive pas a identifier la source. La compilation ce passe très bien, mais en essayant de l'exécuter une Erreur de segmentation (core dumped) surgit.
Voici le code :

#include "DS.h"

void lirePredence (Tache **tab, int taille)
{
	FILE *flot;
	int s, p, i, j;
	flot=fopen ("precedence.don", "r");
	if (flot==NULL)
	{
		printf("Pb d'ouverture du fichier predence\n");
		exit(1);
	}
	fscanf(flot, "%d%d%*c",&p, &s);
	while (!feof(flot))
	{
		i=rechercherTache(tab, taille, p);
		j=rechercherTache(tab, taille, s);
		if (i==-1 || j==-1)
		{
			printf("Tache n'existe pas\n");
			exit(1);
		}
		tab[i]->succ=inserer(tab[i]->succ, s);
		tab[j]->nbPred=tab[j]->nbPred+1;
		fscanf(flot, "%d%d%*c",&p, &s);
	}
	fclose(flot);
}

void copier (Tache **t, int i, int j, Tache **R)
{
	int k=0;
	while (i<j)
	{
		R[k]=t[i];
		k=k+1;
		i=i+1;
	}
}

int triDico (Tache **t, int n)
{
	Tache **R, **S;
	if (n==1)
		return n;
	R=(Tache**)malloc(n/2*sizeof(Tache*));
	S=(Tache**)malloc(n-n/2*sizeof(Tache*));
	if (R==NULL || S==NULL)
		exit(1);
	copier(t, 0, n/2,R);
	copier(t, n/2, n, S);
	triDico(R, n/2);
	triDico(S, n-n/2);
	fusion (R, n/2, S, n-n/2, t);
	free(R);
	free(S);
}

Liste insertEnTete (Liste l, int x)
{
	Maillon *m;
	m=(Maillon*)malloc(sizeof(Maillon));
	if (m==NULL)
	{
		printf("Pb malloc\n");
		exit(1);
	}
	m->v=x;
	m->suiv=l;
	return m;
}

Liste listevide (void)
{
	Liste l;
	l=NULL;
	return l;
}

void afficher (Liste l)
{
	while (l!=NULL)
	{
		printf("%d\t",l->v);
		l=l->suiv;
	}
	printf("%d\t",l->v);
}

Liste inserer (Liste l, int x)
{
	if (l==NULL)
		return insertEnTete(l, x);
	if (x<=l->v)
		return insertEnTete(l, x);
	if (x==l->v)
		return l;
	l->suiv=inserer(l->suiv, x);
	return l;
}

Liste supprimerEnTete (Liste l)
{
	Maillon *m;
	if (l==NULL)
	{
		printf("Opération interdite");
		exit(1);
	}
	m=l;
	l=l->suiv;
	free(m);
	return l;
}

Tache liretache (FILE *flot)
{
	Tache t;
	fscanf(flot,"%d%d",&t.num,&t.duree);
	t.succ=listevide();
	t.nbPred=0;
	t.datDebut=0;
	t.traite=faux;
	return t;
}

void afficherTache (Tache t)
{
	printf ("%d\t%d\n",t.num,t.duree);
	afficher(t.succ);
	printf("%d\n%d\n%d\n",t.nbPred, t.datDebut,t.traite);
	printf("\n_____________________\n");
}

Booleen rechercher (Liste l, int x)
{
	if (l==NULL)
		return faux;
	if (x<l->v)
		return faux;
	if (x==l->v)
		return vrai;
	return rechercher(l->suiv,x);
}

Booleen vide (Liste l)
{
	if (l==NULL)
		return vrai;
	return faux;
}

int tete (Liste l)
{
	if (l==NULL)
	{
		printf("Operation interditre");
		exit(1);
	}
	return l->v;
}

int longueur (Liste l, int x)
{
	if (vide (l))
		return 0;
	return 1+longueur(l->suiv,x);
}

Liste insertEnQueue (Liste l, int x)
{
	if (l==NULL)
		return insertEnTete(l,x);
	l->suiv=insertEnQueue(l->suiv,x);
	return l;
}

Tache **remplirTab (int *taille, int *max)
{
	Tache t, **tab, **aux;
	FILE *flot;		
	*taille=0;
	*max=10;
	flot=fopen("taches.don","r");
	if (flot==NULL)
	{
		printf ("Pb d'ouverture du fichier tache");
		exit(1);
	}
	tab=(Tache **)malloc(*max*sizeof(Tache*));
	if(tab==NULL)
	{
		printf("Pb malloc tache");
		exit(1);
	}
	t=liretache(flot);
	while (!feof(flot))
	{
		if (*taille==*max)
		{
			*max=*max+2;
			aux=(Tache**)realloc(tab,*max*sizeof(Tache*));
			if (aux==NULL)
			{
				printf("Pb realloc tache");
				exit(1);
			}
			tab=aux;
		}
		tab[*taille]=(Tache*)malloc(sizeof(Tache));
		if (tab[*taille]==NULL)
		{
			printf("Pb malloc 2 tache");
			exit(1);
		}
		*tab[*taille]=t;
		*taille=*taille+1;
		t=liretache(flot);
	}
	fclose(flot);
	return tab;
}

void afficherTab (Tache **tab, int taille)
{
	int i;
	for(i=0;i<taille;i++)
		afficherTache(*tab[i]);
}		

int rechercherTache (Tache **tab, int taille, int val)
{
	int i;
	for(i=0;i<taille;i++)
		if (tab[i]->num==val)
			return i;
	return -1;
}

void pert (Tache **tab, int taille)
{
	Liste f;
	f=listevide();
	int i, t, it, s, is;
	for (i=0;i<taille;i++)
		if(tab[i]->nbPred==0)
		{
			f=insertEnQueue(f, tab[i]->num);
			tab[i]->traite=vrai;
		}
	while (!vide(f))
	{
		t=tete(f);
		f=supprimerEnTete(f);
		it=rechercherTache(tab,t , taille);
		while (!vide(tab[it]->succ))
		{	
			s=tete(tab[it]->succ);
			tab[it]->succ=supprimerEnTete(tab[it]->succ);
			is=rechercherTache(tab, taille, s);
 			tab[is]->datDebut=max(tab[is]->datDebut, tab[it]->datDebut+tab[it]->duree);
			tab[is]->nbPred=tab[is]->nbPred-1;
			if (tab[is]->traite==0)
			{
				if(tab[is]->traite==vrai)
				{
					printf("Présence d'un circuit\n");
					exit(1);
				}
				tab[is]->traite=vrai;
				f=insertEnQueue(f,s);
			}
		}
	}
	for(i=0;i<taille;i++)
		if (tab[i]->traite==faux)
		{
			printf("Pb de donnée\n");
			exit(1);	
		}
}

void fusion (Tache **R, int n, Tache **S, int m, Tache **tab)
{
	int i=0, j=0, k=0;
	while (i<n && j<m)
	{
		if (R[i]<S[j])
		{
			tab[k]=R[i];		
			i=i+1;
			k=k+1;
		}
		else 
		{
			tab[k]=S[j];
			j=j+1;
			k=k+1;
		}
	}
	while (i<n)
	{
		tab[k]=R[i];
		i=i+1;
		k=k+1;
	}
	while (j<n)
	{
		tab[k]=S[j];
		j=j+1;
		k=k+1;
	}
}


int max (int a, int b)
{
	int c;
	if (a>b)
		c=a;
	else c=b;
	return c;
}

void global (void)
{
	Tache **tab;
	int taille, max;
	tab=remplirTab(&taille,&max);
	lirePredence(tab,taille);
	afficherTab(tab, taille);
	taille=longueur(tab[0]->succ,taille);
	printf("Nombre de tache : %d\n",taille);
	free(tab);
}

Merci de m'aider big_smile !


Furion974

Hors ligne

#2 Le 05/04/2017, à 20:57

pingouinux

Re : Problème erreur de segmentation (core dumped)

Bonsoir,
Si tu veux de l'aide, fournis au moins un programme qui compile.

$ make seb
cc     seb.c   -o seb
seb.c:1:16: fatal error: DS.h: No such file or directory
 #include "DS.h"
                ^
compilation terminated.
make: *** [seb] Error 1

Hors ligne

#3 Le 05/04/2017, à 20:59

Sébastien COLLARD

Re : Problème erreur de segmentation (core dumped)

Bonsoir,
la compilation ce fait très bien chez moi.


Furion974

Hors ligne

#4 Le 05/04/2017, à 21:26

grigouille

Re : Problème erreur de segmentation (core dumped)

Donne nous le DS.h.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#5 Le 05/04/2017, à 21:28

Sébastien COLLARD

Re : Problème erreur de segmentation (core dumped)

Voici le DS.h :

#include <stdio.h>
#include <stdlib.h>

typedef enum {faux, vrai} Booleen;

typedef struct maillon
{	
	int v;
	struct maillon *suiv;
}Maillon, *Liste;

typedef struct
{
	int num;
	int duree;
	Liste succ;
	int nbPred;
	int datDebut;
	Booleen traite;
}Tache;

void copier (Tache **t, int i, int j, Tache **R);
void lirePredence (Tache **tab, int taille);
int triDico (Tache **t, int n);
Liste insertEnTete (Liste l, int x);
Liste listevide (void);
void afficher (Liste l);
Liste inserer (Liste l, int x);
Liste supprimerEnTete (Liste l);
Tache liretache (FILE *flot);
void afficherTache (Tache t);
Booleen vide (Liste l);
Booleen rechercher (Liste l, int x);
int tete (Liste l);
int longueur (Liste l, int x);
Liste insertEnQueue (Liste l, int x);
void afficherTab (Tache **tab, int taille);
Tache **remplirTab (int *taille, int *max);
int rechercherTache (Tache **t, int taille, int val);
void pert (Tache **tab, int taille);
void fusion (Tache **R, int n, Tache **S, int m, Tache **tab);
int max (int a, int b);
void global (void);

Furion974

Hors ligne

#6 Le 05/04/2017, à 21:28

pingouinux

Re : Problème erreur de segmentation (core dumped)

la compilation ce fait très bien chez moi.

La compilation ne se fait pas avec les informations que tu as données. Il manque DS.h.

Hors ligne

#7 Le 05/04/2017, à 21:34

Sébastien COLLARD

Re : Problème erreur de segmentation (core dumped)

je vien de le mettre j'avais oublier de le mettre au départ désoler

pingouinux a écrit :

la compilation ce fait très bien chez moi.

La compilation ne se fait pas avec les informations que tu as données. Il manque DS.h.


Furion974

Hors ligne

#8 Le 05/04/2017, à 21:57

pingouinux

Re : Problème erreur de segmentation (core dumped)

J'arrive à compiler sans erreur en ajoutant en tête les prototypes de inserer et fusion, et en ajoutant un main (vide pour l'instant). Il faut que tu fournisses le tien.

Hors ligne

#9 Le 05/04/2017, à 22:02

Sébastien COLLARD

Re : Problème erreur de segmentation (core dumped)

Le voici:

#include "DS.h"

int main (void)
{
	global();
	return 0;
}
pingouinux a écrit :

J'arrive à compiler sans erreur en ajoutant en tête les prototypes de inserer et fusion, et en ajoutant un main (vide pour l'instant). Il faut que tu fournisses le tien.


Furion974

Hors ligne

#10 Le 05/04/2017, à 22:05

grigouille

Re : Problème erreur de segmentation (core dumped)

Il n'y a pas de fonction main.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#11 Le 05/04/2017, à 22:07

grigouille

Re : Problème erreur de segmentation (core dumped)

Il manque le fichier precedence.don


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#12 Le 05/04/2017, à 22:09

pingouinux

Re : Problème erreur de segmentation (core dumped)

Ça avance, mais il manque le fichier taches.don.

Hors ligne

#13 Le 05/04/2017, à 22:12

Sébastien COLLARD

Re : Problème erreur de segmentation (core dumped)

Désoler de l'oublie, voici le fichier precedence :

3	1
2	5
4	2
3	4	
1	2

voici le fichier taches:

3	10
5	30
1	20
2	15
4	40

Furion974

Hors ligne

#14 Le 05/04/2017, à 22:35

grigouille

Re : Problème erreur de segmentation (core dumped)

Tache n'existe pas.

C'est normal ?


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#15 Le 05/04/2017, à 22:40

Sébastien COLLARD

Re : Problème erreur de segmentation (core dumped)

Si taches n'existe pas ca veut dire que le fichier c'est mall ouvert donc la suite ne s'excute pas

grigouille a écrit :

Tache n'existe pas.

C'est normal ?

Dernière modification par Sébastien COLLARD (Le 05/04/2017, à 22:40)


Furion974

Hors ligne

#16 Le 05/04/2017, à 22:44

grigouille

Re : Problème erreur de segmentation (core dumped)

Pas du tout, c'est que i vaut -1 ou que j vaut -1


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#17 Le 05/04/2017, à 22:47

Sébastien COLLARD

Re : Problème erreur de segmentation (core dumped)

Alors la je ne comprend plus rien, tu a découvert un  nouveau problème.

grigouille a écrit :

Pas du tout, c'est que i vaut -1 ou que j vaut -1


Furion974

Hors ligne

#18 Le 05/04/2017, à 22:59

pingouinux

Re : Problème erreur de segmentation (core dumped)

Segmentation fault dans la seconde itération de la boucle while dans afficher.

Hors ligne

#19 Le 05/04/2017, à 23:14

pingouinux

Re : Problème erreur de segmentation (core dumped)

L'erreur provient de la dernière ligne de afficher, car l est alors un pointeur nul.

      printf("%d\t",l->v);

Hors ligne

#20 Le 05/04/2017, à 23:43

Sébastien COLLARD

Re : Problème erreur de segmentation (core dumped)

Merci de m'avoir indiquer où ce trouver l'erreur, je vais essayer de la corriger maintenant ! big_smile


Furion974

Hors ligne

#21 Le 06/04/2017, à 07:18

pingouinux

Re : Problème erreur de segmentation (core dumped)

je vais essayer de la corriger maintenant !

Il suffit d'imprimer le pointeur seul (tu verras ainsi qu'il est nul) :

	printf("%p\t",l);

Hors ligne

#22 Le 06/04/2017, à 07:22

no_spleen

Re : Problème erreur de segmentation (core dumped)

Saut,

Un petit conseil. Apprendre le C, c'est aussi apprendre a utiliser gdb ! Cela va te faire gagner un temps fou et te permettre de garder tes cheveux plus longtemps :-)

Voici ce que tu obtient en lancant ton programme dans gdb

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400b6f in afficher (l=0x0) at main.c:87
87		printf("%d\t",l->v);

Ce qui confirme ce que t'as dit pinguoinnux ci dessus.

Cheers,

Hors ligne