Bonjour à tous,

Voila je dois réaliser un programme en C effectuant un tri par fusion en utilisant les pthreads, et tout cela en 1semaine et sans connaître le C

on m'a donné le gros de l'algorithme à utiliser (que voici) :
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
 
#define SIZE_TAB 5
 
void fusion(int tableau[], int deb1, int fin1, int fin2);
void tri_fusion_bis(int tableau[], int deb, int fin, int count);
void tri_fusion(int tableau[], int longueur);
 
void affiche_tab(int *tab)
{
	int i;
	for (i = 0; i <= SIZE_TAB; i++)
	{
		printf (" %d ", tab[i]);
	}
}
 
void fusion(int tableau[], int deb1, int fin1, int fin2)
{
	int *table1;
	int deb2 = fin1 + 1;
	int compt1 = deb1;
	int compt2 = deb2;
	int i;
 
	printf (" [deb fusion] --> ");
	affiche_tab(tableau);
	printf("\n");
 
	table1 = malloc((fin1 - deb1 + 1) * sizeof(int));
 
	//on recopie les éléments du début du tableau
	for (i = deb1; i <= fin1; i++)
	{
		table1[i-deb1] = tableau[i];
	}
 
	printf (" cpy tableau \n");
	for (i = deb1; i <= fin2; i++)
	{
		printf (" Elements %d \n", i);
		if (compt1 == deb2)
		{
			printf (" Tous les éléments sont classés. \n");
			break;
		}
		else if (compt2 == fin2 + 1)
		{
			tableau[i] = table1[compt1 - deb1];
			compt1++;
		}
		else if (table1[compt1 - deb1] < tableau[compt2])
		{
			tableau[i] = table1[compt1 - deb1];
			compt1++;
		}
		else
		{
			tableau[i] = tableau[compt2];
			compt2++;
		}
	}
	free(table1);
 
	printf (" [fin fusion] --> ");
	affiche_tab(tableau);
	printf (" \n");
}
 
void tri_fusion_bis(int tableau[], int deb, int fin, int count)
{
	sleep(3);
 
	printf ("[%d] Itération debut %d fin %d \n", count, deb, fin);
 
	if (deb != fin)
	{
		int milieu = (fin + deb) / 2;
 
		tri_fusion_bis (tableau, deb, milieu, count + 1);
 
		tri_fusion_bis(tableau, milieu + 1, fin, count + 1);
 
		fusion(tableau, deb, milieu, fin);
	}
}
 
void tri_fusion(int tableau[], int longueur)
{
	if (longueur > 0)
	{
		tri_fusion_bis(tableau, 0, longueur - 1, -1); 
	}
}
1ère question : à quoi sert le "#define SIZE_TAB 5" au tout début ??

J'ai essayé de créer le main pour pouvoir utiliser le programme sans les threads dans un premier temps. J'ai donc fait un truc dans ce genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
int main(void)
{
	int tableau[8] = {26, 7, 15, 6, 1};
	int longueur = sizeof(tableau);
 
	tri_fusion(tableau, longueur);
 
	return 0;
}
Lorsque je lance le programme, au début tout va bien a part un détail : il affiche 6 nombres alors que le tableau n'en contient que 5 (un zero apparait à la fin).

Ensuite, plus on avance, plus ça "part en live". les nombres du ableau sont au fur é a mesure remplacés par des zeros, seuls le 1 3 et 6 restent, et sont mis après trois zero.

Enfin une erreur se produit sur la fin
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
5 [main] a 1780 _cygtls::handle_exception: Error while dumping state (probably corrupted stack)
Segmentation fault (core dumped)
Je n'ai pas bien saisi l'erreur donc bon...

Pour info, je teste sous cygwin (un émulateur unix) en compilant le fichier via la commande gcc

Grand merci d'avance pour votre aide