> Tous les forums > Forum Autres langages
 Pb de segmentation fault
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
JayJay4ever
  Posté le 20/05/2004 @ 18:06 
Aller en bas de la page 
Nouvel astucien
Bonjour je suis nouveau je dois réaliser un projet en C et je suis bloqué par un segmentation fault dans la fonction InitTableau... si quelqu'un peut m aider... merci #include <MlvTypeC.h> #include <MlvProcC.h> #include <stdio.h> #include <stdlib.h> #define X_MAX 700 #define Y_MAX 700 #define MAXP 60 /***************************************************************************/ /* BIBLIOTHEQUE */ /***************************************************************************/ /*Type point*/ typedef struct _point { int x; int y; } Point; /* type Tableau des coordonnées des points */ typedef struct _ensemble { Point *tabpoint; int nbrepoints; } Ensemble; /* type Sommet */ typedef struct _Sommet { Point *Copoint; struct _Sommet *suiv; struct _Sommet *prec; }Sommet; /* type enveloppe */ typedef struct _enveloppe{ Sommet *Enveloppe; int taille; }Enveloppe; /* type de figure */ typedef enum{CARRE,CERCLE,TRIANGLE}Figure; /***************************************************************************/ /* INITIALISATION TABLEAU */ /***************************************************************************/ /* Choix du mode de distribution */ void InitFigure (Figure *choix){ int i; do{ printf("3 modes de distribution sont proposés: \n"); printf("pour le mode carré tapez 1\n"); printf("pour le mode circulaire tapez 2\n"); printf("pour le mode triangulaire tapez 3\n"); scanf("%d",&i); } while(i<1 || i>3); if(i==1) *choix=CARRE; else if(i==2) *choix=CERCLE; else *choix=TRIANGLE; return; } /* Modes de distribution */ Point DistributionCarre(){ Point point; point.x=random(X_MAX); point.y=random(Y_MAX); return point; } Point DistributionCercle(){ Point point; Point centre; int possible; int rayon=X_MAX/2; centre.x=X_MAX/2; centre.y=Y_MAX/2; do{ point.x=random(X_MAX); point.y=random(Y_MAX); possible=((point.x-centre.x)*(point.x-centre.x)+ (point.y-centre.y)*(point.y-centre.y)-(rayon*rayon)); }while(possible>0); return point; } Point DistributionTriangle(){ Point point; point.x= random(X_MAX); do{point.y=random(Y_MAX); }while(point.y>(Y_MAX-point.y)); return point; } /***************************************/ /* Initialisation du tableau de points */ /* renvoie 1 si réussi */ /* renvoie -1 si plus de mémoire */ /* renvoie 0 sinon */ /***************************************/ void InitTableau (Ensemble *T) {int i; Figure choix; /* Choix du nombre de points a généré dans le l enveloppe */ printf(" Entrez le nombre de point a afficher dans l enveloppe\n"); do{ scanf("%d",&(T->nbrepoints)); } while ((T->nbrepoints)<3); /* Allocation du tableau*/ T->tabpoint= (Point *)malloc(T->nbrepoints*sizeof(Point)); if(T->tabpoint==NULL)/*echec*/ {T->nbrepoints=0; /*renvoie un ensemble vide*/ printf("Plus de mémoire"); } else{ InitFigure(&choix); if(choix==CARRE){ /* Distribution carrée */ for (i=0; i<(T->nbrepoints); i++){ T->tabpoint[i].x=DistributionCarre().x; T->tabpoint[i].y=DistributionCarre().y; printf("point %d: x=%d y=%d\n",i+1,T->tabpoint[i].x,T->tabpoint[i].y); } } else if(choix==CERCLE){ /* Distribution circulaire */ for (i=0; i<T->nbrepoints; i++) { T->tabpoint[i].x=DistributionCercle().x; T->tabpoint[i].y=DistributionCercle().y; printf("point %d: x=%d y=%d\n",i+1,(T->tabpoint[i].x),(T->tabpoint[i].y)); } } else{ /* Distribution triangulaire */ for (i=0; i<T->nbrepoints; i++) { T->tabpoint[i].x=DistributionTriangle().x; T->tabpoint[i].y=DistributionTriangle().y; printf("point %d: x=%d y=%d\n",i+1,(T->tabpoint[i].x),(T->tabpoint[i].y)); } } } } MAIN /***************************************/ int main(void){ Ensemble T; Enveloppe E; InitTableau(&T); return 0; }
Publicité
gpl
 Posté le 20/05/2004 à 20:21 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Salut, Tu dis que t'as une erreur, a quel moment? Avant le choix de la figure? Après... De toute façon t'as un pointeur qui chie et il fo trouver lequel! Sinon tu peux aussi pister a quel moment y a le bug avec un debug ou sinon avec l'affichage de message pour que tu situes quel partie du code est effectué ou non. Voila @+++
gpl
 Posté le 20/05/2004 à 20:32 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Re Moi g testé chez moi ton code.... Ben en fait a part les random qui n'existe pas j'ai pu l'executer et g pas eu d'erreur!! donne qq autre infos pour voir. @+
octy
 Posté le 22/05/2004 à 16:52 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Petit astucien
Il me semble que tu as un problème de pointeur. En premier lieu, C il ne faut pas faire retourner une structure à une fonction mais plutot un pointeur sur celle ci. Dans ta fonction DistributionCarre (c'est valable aussi pour les autres) tu retournes une variable allouée sur la pile pour la fonction et qui sera détruire au retour de la fonction (la varaible poin). Ce n'est pas correct, tu vas alors pointer dans une mauvaise zone mémoire et provoquer des "segmentation faults". Modifie tes fonctions de la sorte: Point * DistributionCarre() { Point * point; point = (Point*) malloc( sizeof( Point ) ); if( NULL == point ) { /* traitement de l'erreur ... */ } point->x = random( X_MAX ); point->y = random( Y_MAX ); return point; } Toutes les petites modifications vont engendrer une refonte complète de ton programme. Mais rien de bien long à faire. Je te conseille de changer d'autres structures, par exemple : /* type Tableau des coordonnées des points */ typedef struct _ensemble { Point ** tabpoint; int nbrepoints; } Ensemble; Ce qui sera plus optimal (si tu changes tes fonctions Distribution...() ), tu pourras alors écrire : T->tabpoint[i] = DistributionCarre(); Une fois le tableau alloué. En tout cas, je pense que ton problème vient de ces variables transiantes, détruites en sortie de fonction. Bonne chance.
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
65,99 €Boîtier PC Corsair Carbide Series 275R avec fenêtre à 65,99 €
Valable jusqu'au 01 Mars

Cdiscount propose actuellement le boîtier PC moyen tour avec fenêtre Corsair Carbide Series 275R à 65,99 €. On le trouve ailleurs à partir de 99,99 €. Le Corsair Carbide 275R est compact et conçu pour créer des systèmes hautes performances à l'aspect minimaliste. il offre une capacité de refroidissement efficace (2 ventilateurs 120 mm fournis), tout en vous permettant de faire évoluer ses performances grâce aux autres emplacements disponibles.


> Voir l'offre
10,99 €Hub 4 ports USB 3.0 à 10,99 €
Valable jusqu'au 01 Mars

Amazon propose actuellement le hub Anker 4 ports USB 3.0 à 10,99 € alors qu'on le trouve habituellement autour de 15 €. 


> Voir l'offre
92,99 €Disque dur externe portable Western Digital Elements USB 3.0 4 To à 92,99 €
Valable jusqu'au 01 Mars

Amazon propose actuellement le disque dur externe portable Western Digital Elements USB 3.0 4 To à 92,99 € livré. On le trouve ailleurs à partir de 115 €. Ce disque dur qui tient dans la main est silencieux, ne chauffe pas et dispose d'une connectique USB 3.0 qui vous offrira des transferts rapides. Il est compatible USB 2.0. Une très bonne affaire.


> Voir l'offre

Sujets relatifs
Erreur de segmentation
Programme Perl :: Erreur de segmentation
 > Tous les forums > Forum Autres langages