Rzutowanie na wskaźnik do tablicy trzymającej strukture

Rzutowanie na wskaźnik do tablicy trzymającej strukture
D1
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 7 lat
  • Postów:9
0

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

Kopiuj
#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..

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0
Kopiuj
struct player * myPlayers[] = arg;

D1
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 7 lat
  • Postów:9
0

error: invalid initializer

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
1
Kopiuj
#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;:

Kopiuj
#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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
D1
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 7 lat
  • Postów:9
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ć

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
D1
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 7 lat
  • Postów:9
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

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
1

Masz tablice jak wół:

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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
D1
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 7 lat
  • Postów:9
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.