Bonjour a tous,
voila j'ai un programme (et lors de l'execution si n est inferieur ou egale a 6 il fonctionne et au dela il me signal une erreur de segmentation!) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MIN(a,b) (a)<(b)?(a):(b)
#define n 
/*extern*/ float R =3; //portee radio d'un noeud
/*extern*/ int adj=2; //longueur maximale d'un noeud a son chef
/*extern*/ int nbVoisMaxi =100; //nombre maximum de voisin (peut poser probleme)
/*extern*/ int DEBUG =1;
 
/* Genere N point uniformement repartit dans une boule de rayon */
/* 2*R, et on rajoute un point 0 correspondant a Palm.		*/
/* Les points sont numerotes de 0 a N.				*/
 
void generePoints2R(int N, double* abscisses, double* ordonnees)
{
	int i;
	float theta,r;
 
	abscisses[0]= 0.0;
	ordonnees[0]= 0.0;
	for (i=1; i<N; i++)
	{
		theta = 2 * 3.1415 * rand()/RAND_MAX;
		r = 2 * R * sqrt(1.0 * rand()/RAND_MAX);
		abscisses[i]= r * cos(theta);
		ordonnees[i]= r * sin(theta);
	}
}
 
void imprimePoints(int N, double* abscisses, double* ordonnees)
{
	int i;
 
	printf("Coordonnees des %d points\n",N);
	for (i=0; i<N; i++)
	{
		printf("abscisses[%d]=%f ordonnees[%d]=%f\n",i,abscisses[i],i,ordonnees[i]);
	}
}//fin de imprimePoints
 
/* construit le tableau de voisinage : ou la ligne i contient 	*/
/* la liste des indices des voisins du point d'indice i.	*/
/* La diagonale vaut 0: un point n'est pas voisin avec lui-meme.*/
/* Construit egalement le tableau taille ou le ieme element 	*/
/* contient le nombre de voisins du point d'indice i.		*/
/* Enfin, construit le graph sous forme matricielle		*/
 
/* Genere les degres des points a savoir 						*/
/* deux tableaux contenant les indices des points du 1 voisinage et du 2 voisinages	*/
/* voisinage1 et voisinage2.								*/
/* Pour le 1 voisinage : un tableau couple a voisinage1 qui decrit d+(u) c'est a dire 	*/
/* le nombre de 2 voisins (taille1).							*/
/* Pour le 2 voisinage : un tableau couple a voisinage2 qui decrit d-(u) c'est a dire 	*/
/* le nombre de 1 voisins de chaque point (taille2)					*/
 
void genereVoisin(int N, double* abscisses, double* ordonnees, int* taille, int* taille1, int* taille2, int** voisinage, int** voisinage1, int** voisinage2, char** voisinageM)
{
	int i,j,compt;
	int vois1;//nb de voisins dans le 1 voisinage et le 2 voisinage
	float ray=R*R;
	float distance;//distance a l'origine
	double tempa, tempo;
 
 
	for(i=0;i<N;i++){
		compt=0;
		vois1=0;
		tempa = abscisses[i];
		tempo = ordonnees[i];
		distance=abscisses[i]*abscisses[i]+ordonnees[i]*ordonnees[i];
		for(j=0;j<i;j++){
		  if((abscisses[j]-tempa)*(abscisses[j]-tempa)+(ordonnees[j]-tempo)*(ordonnees[j]-tempo)<ray)
		  {
			voisinage[i][compt]=j;
			voisinageM[i][j]=1;
			compt++;
			if(compt>=nbVoisMaxi) fprintf(stderr,"nbVoisMaxi pas assez grand\n");
 
			//si i est voisin de 0
		  	if(distance<=ray){
 
			  //calcul pour i des voisins du 2 voisinages 
		  	  if((abscisses[j]*abscisses[j]+ordonnees[j]*ordonnees[j])>ray){
				// on compte et repertorie les voisins de i du 2 voisinages
				voisinage1[i][vois1]=j;
				vois1++;
 
				// on compte et repertorie les voisins de j (j in N2) dans N1
				voisinage2[j][taille2[j]]=i;
				taille2[j]++;
			  }
			}//fin du if(distance<=ray)
		  }//fin du if
		}//fin du for sur j
 
		for(j=i+1;j<N;j++){
 
		  if((abscisses[j]-tempa)*(abscisses[j]-tempa)+(ordonnees[j]-tempo)*(ordonnees[j]-tempo)<ray)
		  {
			//i et j sont voisins
			voisinage[i][compt]=j;
			voisinageM[i][j]=1;
			compt++;
			if(compt>=nbVoisMaxi) fprintf(stderr,"nbVoisMaxi pas assez grand\n");
 
			//si i est voisin de 0
		  	if(distance<=ray){
 
			  //calcul pour i des voisins du 2 voisinages 
		  	  if((abscisses[j]*abscisses[j]+ordonnees[j]*ordonnees[j])>ray){
				// on compte et repertorie les voisins de i du 2 voisinages
				voisinage1[i][vois1]=j;
				vois1++;
 
				// on compte et repertorie les voisins de j (j in N2) dans N1
				voisinage2[j][taille2[j]]=i;
				taille2[j]++;
			  }
			}//fin du if(distance<=ray)
 
 
		  }//fin du if
		}//fin du for sur j
 
		taille[i]=compt;
		taille1[i]=vois1;
 
	}//fin du for sur i
}
int main()
{
    int i;
    double* a=(double*) calloc ( n , sizeof(double));
    double* b=(double*) calloc ( n , sizeof(double));
    int* taille=(int*) calloc ( n , sizeof(int));
    int* taille1=(int*) calloc ( n , sizeof(int));
    int* taille2=(int*) calloc ( n , sizeof(int));
    int** voisn=(int**) calloc ( n*n, sizeof(int));
    int** voisn1=(int**) calloc ( n*n, sizeof(int));
    int** voisn2=(int**) calloc ( n*n, sizeof(int));
    char** voisnM=(char**) calloc ( n*n, sizeof(char));
    generePoints2R(n, a, b);
    imprimePoints(n, a, b);
 
 
    genereVoisin(n,a,b, taille, taille1,taille2, voisn ,   voisn1,  voisn2,  voisnM);
    free(a);
    free(b);
    free(taille);
    free(taille1);
    free(taille2);
    free(voisn);
    free(voisn1);
    free(voisn2);
    free(voisn);
    system("pause");
}

Merci pour votre aide.