Bonjour à tous,
après une certain nombre de recherche je me trouve bien bloqué
j'essaye de mettre des thread dans mon programme de façon à accélérer certaine partie de mon programme tout en essayant d'utiliser au mieux les cœurs de ma machine.
Mon problème:
J'ai une structure StructAgent composer de deux éléments un identifiant et un pointeur sur la structure suivante
à partir de la j'ai une liste de structure pas compliqué.
mon problème est dans la suppression du premier élément de la liste.
j'appelle ma fonction avec
jusque la tous marche bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part pthread_create (&supAgent_thread, NULL, sup_agent2, StructAgent);
mon problème vient des dernière ligne du code soit
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 void *sup_agent2(void *Agent) { unAgent *tmp2 = (unAgent*) Agent; unAgent *tmp = (unAgent*) (Agent); //nextlist tmp2 = (tmp2)->suivant; while(tmp2 != NULL) { if((tmp2)->energie <= 0) { (*tmp).suivant = (*tmp2).suivant; free(tmp2); tmp2 = (tmp)->suivant; } else { tmp = (tmp)->suivant; tmp2 = (tmp2)->suivant; } } // firstlist unAgent *tmp3 = (unAgent*) (Agent); unAgent *tmp4 = (unAgent*) (&Agent); if( (tmp3)->energie <= 0) { tmp4 = (tmp3)->suivant; free(tmp3); } return NULL; }
quand j'insère la structure suivante ((tmp3)->suivant) à la racine (mon pointeur de base Agent) j'ai une belle erreur de segmentation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 // firstlist unAgent *tmp3 = (unAgent*) (Agent); unAgent *tmp4 = (unAgent*) (&Agent); if( (tmp3)->energie <= 0) { tmp4 = (tmp3)->suivant; free(tmp3); }
le problème doit être simple mais je tourne un peu en rond depuis un bon moment, je dois me tromper à un endroit.
J'ai fais le tour ses faqs mais en utilisant thread je n'ai plus de pointeur de pointeur.
La méthode ci-dessous plante aussi et la je me retrouve coincé
Merci de vos réponses
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 // firstlist unAgent *tmp3 = (unAgent*) (Agent); if( (tmp3)->energie <= 0) { Agent = (tmp3)->suivant; free(tmp3); }
Partager