Bonjour j'apprand actuellement le c et je développe un module de gestion de tableau d'entier tout fonctionnait très bien jusqu’au jour ou j'ai ajouté une define dans mon code j'ai beau l'enlever l'erreur reste et j'ai beau relire le code je ne trouve pas l'erreur pouvez vous m'aider svp.

intarray.c

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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
 
#include <stdlib.h>
#include <stdio.h>
 
#include "intarray.h"
#include "tool.h"
 
/*
	Module n°1 sur les tableau d'entier int 
 
*/
 
#define INTARRAY_DEFAULT_ALLOC 10
 
 
 
intarray intarray_create(int len)
{
	intarray tab = malloc(sizeof(struct _intarray));
 
	tab->len = len;
	tab->alloc = len; 
 
	tab->data = malloc(len * sizeof(int));
 
	return tab; 
}
 
void intarray_creatOx(intarray tab)
{
	int i = 0;
 
	if(tab->alloc <= 0)
	{
		tab->alloc = 4; 
		printf("ERROR <intarray_createOx> : Impposible de creer un tableau <= 0 octe : valeur par defaut 4\n"); 
	}
 
	tab->data = malloc(tab->alloc * sizeof(int));
 
	for(i = 0; i < tab->alloc; i++)
	{
		tab->data[i] = 0;
	}
 
}
 
intarray intarray_emptyCreate(int alloc)
{
intarray tab = malloc(sizeof(struct _intarray));
 
	tab->len = 0;
	tab->alloc = alloc;
 
	intarray_creatOx(tab);	
 
	return tab; 
}
 
intarray intarray_emptyStandarCreate(void)
{
	return intarray_emptyCreate(INTARRAY_DEFAULT_ALLOC);	
}
 
 
void intarray_UNSORTED_delete(intarray tab, int index)
{
	if((index < 0) || (index >= tab->len))
	{
		printf("ERROR <intarray_delete> : Impossible de suprimer un element dans une case non alouer\n");
		return;
	}
 
	tab->data[index] = tab->data[tab->len - 1];	
 
	tab->len --;
}
 
void intarray_delete(intarray tab, int index)
{
	int i = 0;
	if((index < 0) || (index >= tab->len))
	{
		printf("ERROR <intarray_delete> : Impossible de suprimer un element dans une case non alouer\n");
		return;
	}
 
	for(i = index + 1; i < tab->len; i ++)
	{
		tab->data[i - 1] = tab->data[i];  
	}
	tab->len --; 
}
 
void intarray_add(intarray  tab, int value)
{
	intarray_setAdd(tab, tab->len, value); 
}
 
void intarray_resize(intarray tab, int newAlloc)
{
	int * newData = malloc(sizeof(int) * newAlloc);
 
	int i = 0; 
 
	for(i =0; i < tab->len; i++)
		newData[i] = tab->data[i]; 
 
	free(tab-> data);
 
	tab->data = newData;
	tab->alloc = newAlloc;	
}
 
 
int intarray_sum(intarray tab)
{
	int i;
	int sum = 0; 
 
	for(i = 0; i < tab->len; i ++)
	{
		sum += tab->data[i]; 
	}
 
	if(tab->len <= 0)
		printf("ERROR <intarray_sum> : Tableau de longeur NULL ou Negative\n");
 
	return sum; 
}
 
float intarray_average(intarray tab)
{
	int sum = intarray_sum(tab);
	float average = 0; 
 
	average = (sum + 0.0) / tab->len;
	if(tab->len <= 0)
	{
		printf("ERROR <intarray_average> : Tableau de longeur NULL ou Negative\n");
		return -1; 
	}
 
	return average; 	
 
}
 
float intarray_median(intarray tab)
{
	if(tab->len <= 0)
{
		printf("ERROR <intarray_mediane> : Tableau de longeur NULL ou Negative\n");
		return -1; 
	}
 
 
	intarray copy = intarray_clone(tab);
	float mediane = 0; 
 
	intarray_sortAscendingOrder(copy);
 
	if(copy->len % 2 == 1)//impaire
		mediane  = copy->data[(copy->len -1) /2];
	else
	{
		int v1 = copy->data[(copy->len -1) / 2];
		int v2 = copy->data[copy->len / 2];
 
		mediane  = (v1 + v2) / 2.0; 
 
	}
 
	intarray_destroy(copy);
	return mediane; 
}
 
intarray intarray_clone(intarray tab)
{
	intarray clone = intarray_create(tab->len);
	 int i = 0; 
 
	 for(i = 0; i < tab->len; i ++)
	 	clone->data[i] = tab->data[i];
 
	 return clone; 
}
 
void intarray_sortAscendingOrder(intarray tab)
{
	int i = 0; 
	int indiceMini = 0; 
	int numberMini = 0; 
 
 
 
	for(i = 0; i <= tab->len - 2; i++)
	{
		indiceMini = intarray_getIndexOfMinFrom(tab, i); 
		intSwap(tab->data + i, tab->data + indiceMini);		
	}
 
 
}
 
 
intarray intarray_concat(intarray t1, intarray t2)
{
	intarray T = intarray_create(t1->len + t2->len);
	int i = 0, j = 0; 
 
	for(i = 0; i < t1->len; i ++ )
	{
		T->data[j] = t1->data[i];	
		j++;	
	}
 
	for(i = 0; i < t2->len; i++)
	{
		T->data[j] = t2->data[i]; 
		j++;
	}
 
	return T; 	
}
 
int intarray_getMin(intarray tab)
{
	int indexMini = intarray_getIndexOfMin(tab);
 
	return tab->data[indexMini]; 
}
 
int intarray_getIndexOfMin(intarray tab)
{		
	return intarray_getIndexOfMinFrom(tab, 0); 
}
 
 
int intarray_getIndexOfMinFrom(intarray tab, int index)
{
 
	if ((index < 0) || (index > tab->len ))
	{ 
		printf("\nERROR <intarray_getIndexOfMinFrom>: L'index %d invalide\n", index);
		printf("***Les valeur valide sont entre 0 et %d***\n\n", tab->len-1);
		return 0; 
	}
 
	int i = 0;
	int indexMini = index;
 
	int mini = tab->data[index]; 
	for(i = index + 1; i < tab->len; i++)
	{
		if(tab->data[i] < mini)
		{
			mini = tab->data[i];
			indexMini = i;
		}	
 
	}
 
	return indexMini; 
 
}
 
int intarray_getMax(intarray tab)
{
	int indexMax = intarray_getIndexOfMax(tab);
 
	return tab->data[indexMax]; 
}
 
int intarray_getIndexOfMax(intarray tab)
{
	return intarray_getIndexOfMaxFrom(tab, 0);
}
 
int intarray_getIndexOfMaxFrom(intarray tab, int index)
{
	if ((index < 0) || (index > tab->len ))
	{ 
		printf("\nERROR <intarray_getIndexOfMinFrom>: L'index %d invalide\n", index);
		printf("***Les valeur valide sont entre 0 et %d***\n\n", tab->len-1);
		return 0; 
	}
 
	int i = 0;
	int indexMax = index;
 
	int max = tab->data[index]; 
	for(i = index; i < tab->len; i++)
	{
		if(tab->data[i] > max)
		{
			max = tab->data[i];
			indexMax = i; 
		}
	}
 
	return indexMax; 
}
 
void intarray_destroy(intarray tab)
{
	free(tab->data);
	free(tab);
}
 
int intarray_get(intarray tab, int index)
{
	if((index < 0)|| (index >= tab->len ))
	{
		printf("\nERROR <intarray_get> : index %d invalide\n", index);
		printf("***Les valeur valide sont entre 0 et %d***\n\n", tab->len-1);
		return -1;
 
	}	
 
	return tab->data[index];
}
 
void intarray_set(intarray tab, int index, int value)
{
	if((index < 0) || (index > tab->len))
	{
		printf("ERROR <intarray_set> : index %d invalide\n", index);
		printf("***Les valeur valide sont entre 0 et %d***\n", tab->len-1);
 
		return; 
	}	
 
	tab->data[index] = value; 				
}
 
void intarray_setAdd(intarray tab, int index, int value)
{
	int i = 0;
 
 
	if(index < 0)
	{
		printf("ERROR <intarray_setAdd> : Impossible de mettre une valeur dans une case %d\n", index);
		return;
	}
 
	if(index < tab->len)
	{
		intarray_set(tab, index, value);
 
		return;
	}
 
	if(index >= tab->alloc)
	{
		intarray_resize(tab, 1 + 2 * index);
	}
 
	for(i = tab->len; i < index; i++)
	{
		tab->data[i] = 0; 
	}
 
	tab->data[index] = value;
 
	if(index >= tab->len)
		tab->len = index +1; 
 
}
 
 
int intarray_length(intarray tab)
{
	return tab->len;	
 
}
 
 
 
int intarray_occurences(intarray tab, int n)
{
	int i = 0;
	int numberOfN = 0; 
 
	for(i = 0; i < tab->len; i++)
	{
		if(tab->data[i] == n )
			numberOfN ++;
	}
 
	return numberOfN; 
}
 
 
 
int intarray_search(intarray tab, int n)
{
	int i = 0, j = 0;
 
	for(i = 0; i < tab->len; i++)
	{
		if(tab->data[i] == n )
			return 1;
	}	
 
	return 0; 
}
 
 
void intarray_displayPositiveValues(intarray tab)
{
	int i = 0;
 
	for(i = 0; i < tab->len; i++)
	{
		if(tab->data[i] >= 0)
			printf("case %d : %d\n", i, tab->data[i]);
	}
}
 
 
void intarray_debug(intarray tab)
{
	int i; 
 
	printf("####################\n");
	printf("   [ ");
	for(i = 0; i < tab->len; i++)
	{
		printf(" %d;", tab->data[i]);
	}
	printf(" ]\n");
 
	printf("####################\n");
}
 
void intarray_debugMust(intarray tab)
{	
	printf("********************************\n");
 
	intarray_debug(tab);
	printf("La taille du tableau est : %d\n", tab->alloc);
	printf("Le nombre d'element du tableau est : %d\n", tab->len);	
 
	printf("********************************\n");
}
intarray.h

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
 
#ifndef INTARRAY_H
#define INTARRAY_H
 
//Déclaration des structurs
typedef struct _intarray* intarray;
typedef struct _intarray S_intarray;
 
 
struct _intarray
{
	int *data;
	int alloc; 
	int len; 
 
};
 
 
#define INTARRAY_DEFAULT_ALLOC 10
 
/*prototype de fonction de manipulation de tableau*/
//constructeur
intarray intarray_create(int len);
void intarray_creatOx(intarray tab);
intarray intarray_emptyCreate(int alloc);
intarray intarray_emptyStandarCreate(void);
 
//très rapide mais change l'ordre des elements du tab.
void intarray_UNSORTED_delete(intarray tab, int index);
//Est plus lente mais ne change pas l'odre des élements du tab.
void intarray_delete(intarray tab, int index);
void intarray_add(intarray  tab, int value);
void intarray_resize(intarray tab, int newAlloc);
 
 
int intarray_sum(intarray tab);
float intarray_average(intarray tab);
float intarray_median(intarray tab);
intarray intarray_clone(intarray tab); 
 
void intarray_sortAscendingOrder(intarray tab);
intarray intarray_concat(intarray t1, intarray t2);//concatène deux tableau 
int intarray_getMin(intarray tab);
int intarray_getIndexOfMin(intarray tab);
int intarray_getIndexOfMinFrom(intarray tab, int index);//retourne la valeur plus petite entre la case n du tableau et la fin
 
int intarray_getMax(intarray tab);
int intarray_getIndexOfMax(intarray tab);
int intarray_getIndexOfMaxFrom(intarray tab, int index);
 
void intarray_destroy(intarray tab);
int intarray_get(intarray tab, int index);
void intarray_set(intarray tab, int index, int value;
void intarray_setAdd(intarray tab, int index, int value);//Modifie la taille alouer si nécessaireœ 
int intarray_length(intarray tab);
 
void intarray_debug(intarray tab);
void intarray_debugMust(intarray tab);
void intarray_displayPositiveValues(intarray tab);
int intarray_search(intarray tab, int n);
int intarray_occurences(intarray tab, int n);
 
 
#endif
testIntarray.c

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
 
#include<stdlib.h>
#include<stdio.h>
 
#include"intarray.h"
#include"tool.h"
 
int main(int argc, char** argv)
{
	intarray tab = intarray_create(8);
	intarray toto = intarray_emptyStandarCreate();
	int i = 0; 
 
	for(i = 0; i < tab->len; i++)
	{
		tab->data[i] = i;  
	}
	intarray_debugMust(tab);
 
	intarray_delete(tab, 1);
        intarray_debug(tab); 	
 
	intarray_UNSORTED_delete(tab, 3);
	intarray_debug(tab);
 
	intarray_add(tab, 32);
	intarray_add(tab, 54);
	intarray_add(tab, 16);
 
	intarray_setAdd(tab, 12, 48);
	intarray_setAdd(tab, 3, 85);
 
 
	intarray_debugMust(tab);
 
 
	printf("\n  toto :\n ");
	intarray_debug(toto);
 
 
	intarray_destroy(toto); 
	intarray_destroy(tab);
 
	return 0;
}