Rzutowanie na wskaźnik do tablicy trzymającej strukture

0

Witam, tworzę sobie wątek (pthread_create) i przekazuje jako argument wskaźnik do tablicy przechowującą strukturę

#include <stdlib.h>
#include <pthread.h>
#define MAX_PLAYER_NAME 40
#define MAX_PLAYER_COUNT 2
 
struct player {
    char namePlayer[MAX_PLAYER_NAME];
};

void * registerPlayer(void *arg) {
struct player * myPlayers[] = (struct player[] *) arg; ???????????
}

void main() {
	pthread_t thread1;
	struct player players[MAX_PLAYER_COUNT];
	pthread_create(&thread1, NULL, registerPlayer, &players);
}

jak powinno wyglądać rzutowanie w registerPlayer z void * na taką tablicę ??
Obecny sposób nie działa - błąd składniowy..
Mam ustawiony tryb C99.

Nie chciałbym uciekać do zmiennych globalnych..

0
struct player * myPlayers[] = arg;
0

error: invalid initializer

1
#include <stdlib.h>
#include <pthread.h>
#define MAX_PLAYER_NAME 40
#define MAX_PLAYER_COUNT 2
 
typedef struct player
  {
   char namePlayer[MAX_PLAYER_NAME];
  } player;
 
void *registerPlayer(void *arg)
  {
   player *myPlayers=(player*)arg;
   return NULL;
  }
 
int main()
  {
   pthread_t thread1;
   player players[MAX_PLAYER_COUNT];
   pthread_create(&thread1,NULL,registerPlayer,players);
   return 0;
  }

Zastanów się nad przeniesieniem pthread_t thread1;:

#include <stdlib.h>
#include <pthread.h>
#define MAX_PLAYER_NAME 40
#define MAX_PLAYER_COUNT 2
 
typedef struct player
  {
   char namePlayer[MAX_PLAYER_NAME];
   pthread_t thread;
  } player;
 
void *registerPlayer(void *arg)
  {
   player *myPlayers=(player*)arg;
   return NULL;
  }
 
int main()
  {
   player players[MAX_PLAYER_COUNT];
   pthread_create(&players[0].thread,NULL,registerPlayer,players);
   return 0;
  }

Zauważ że masz nie przemyślaną jedną rzecz registerPlayer nie wie którym graczem jest.

0

dzięki ale to ominięcie problemu a nie jego rozwiązanie...registerPlayer otrzymuje taką informacje z metody synchronicznej...tu dosyć dużo kodu jest wycięte by nie zaciemniać

0

To nie jest ominięcie to jest rozwiązanie.
Pokaż jakiego problemu to nie rozwiązuje?

0

no chociażby co się stało z tablicą w registerPlayer ?? Ta funkcja musi mieć swobodny dostęp do manipulowania tablicą ze strukturą player..Jak w tym rozwiązaniu dostać się do elementu np. pierwszego ? bez otrzymywania ostrzeżenia od kompilatora

1

Masz tablice jak wół:

void *registerPlayer(void *arg)
  {
   player *myPlayers=(player*)arg;
   cout<<myPlayers[0].namePlayer<<endl;
   return NULL;
  }
0

dzięki, faktycznie zadziałało.. :-)
problem rozwiązany

1 użytkowników online, w tym zalogowanych: 0, gości: 1