| ||||||||
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é | ||||||||
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 @+++ | |||||||
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.
@+ | |||||||
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.
| |||||||
|
Les bons plans du moment PC Astuces | Tous les Bons Plans | |||||||||||||||
|
Sujets relatifs | ||||||
|