Bonjour,

Je suis débutant dans la création de thread et j'ai pu comprendre qu'on ne pouvais passer qu'un seul argument dans la fonction pthread_create().

Par conséquent j'ai créer une structure avec toutes mes variables a faire passer.

Voici un extrait de mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
typedef struct thread
{
espece ** mer;
SDL_Surface * images[20];
humain * pecheur;
} donnee_t ;
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
 
int start()
  {
  int i;
  int j;
 
  pthread_t th_eco;
  pthread_t th_affichage;
 
  abscisse_sortie=TAILLE_MER-1;
 
  SDL_Surface * images[20];
  init_images(images);
 
  espece** mer;
  humain* pecheur;
 
  srand(time(NULL));
 
  mer=(espece**)malloc(TAILLE_MER*sizeof(espece*));
 
  for(j=0;j<TAILLE_MER;j++)
    {
    mer[j]=(espece*)malloc(TAILLE_MER*sizeof(espece));
    }
 
  donnee_t transfert;
 
  transfert.mer=(espece**)malloc(TAILLE_MER*sizeof(espece*));
 
  for(j=0;j<TAILLE_MER;j++)
    {
    transfert.mer[j]=(espece*)malloc(TAILLE_MER*sizeof(espece));
    }
  pecheur=malloc(sizeof(humain));
  transfert.pecheur=malloc(sizeof(humain));
 
  initialisation_mer(mer);
  initialisation_pecheur(pecheur);
 
 
 for(i=0;i<TAILLE_MER;i++)
   {
     for(j=0;j<TAILLE_MER;j++)
       {
	 transfert.mer[i][j].type=mer[i][j].type;
                           .............
	 transfert.mer[i][j].age=mer[i][j].age;
       }
   }
 
(*transfert.pecheur).nom=(*pecheur).nom;
                ....................
(*transfert.pecheur).taille_sac_max=(*pecheur).taille_sac_max;
 
for(j=0;j<20;j++)
  {
   transfert.images[j]=images[j];
  }
 
pthread_create(&th_eco, NULL,(void *(*)())thread_eco, &transfert);
pthread_create(&th_affichage, NULL,(void *(*)())thread_affichage, &transfert);
 
pthread_join (th_eco, NULL);
pthread_join (th_affichage, NULL);
 
...
  }
Et voila mes deux threads :

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
void *thread_eco(donnee_t donnees)
  {
  int j,k;
 
  while(quit==0)
    {
    controle_population(donnees.mer);
    tour_courant++;
 
    for(j=0;j<TAILLE_MER;j++)
      {
      for(k=0;k<TAILLE_MER;k++)
        {
        if(donnees.mer[j][k].type!=TYPE_SOL && donnees.mer[j][k].type!=TYPE_PONT)
          {
          donnees.mer[j][k].age++;
          donnees.mer[j][k].satiete=tour(donnees.mer[j][k].satiete,donnees.mer[j][k].metabolisme);
 
          if(survie(donnees.mer[j][k].satiete,donnees.mer[j][k].dernier_repas,donnees.mer[j][k].duree_survie,donnees.mer[j][k].age,donnees.mer[j][k].esperance_vie)==1)
            {
            deplacement(donnees.mer,j,k);
            }
 
          else kill_poisson(donnees.mer,j,k);
          }
        }
      }
 
    remise_zero(donnees.mer);
    sleep(2);
    }
  return NULL;
  }
 
void *thread_affichage(donnee_t donnees)
  {
  affichage(donnees.mer,donnees.pecheur,donnees.images);
  return NULL;
  }
Le problème est que je tombe sur une série de Segmentation fault a cause de la fonction SDL_BlitSurface() ou bien lors de la manipulation de mon tableau donnees.mer...

Donc je suppose que je ne sais pas passer mes paramètres dans mes threads.

Pourriez-vous m'aider?

Merci d'avance