Przekazywanie struktury do funkcji oraz odnoszenie sie do elementow

0

Mam takie stuktury:

struct player_data{
  unsigned int x;
  unsigned int y;
  unsigned int deaths;
};
struct ball_data{
  unsigned int x;
  unsigned int y;
  bool mv_left;
  bool mv_right;
  bool mv_up;
  bool mv_down;
};
struct game_data{
  unsigned int max_field_x;
  unsigned int max_field_y;
  struct player_data *player;
  struct ball_data *ball;
};

poprzez strukture game_data moge dojsc do danych z pozostalych dwoch struktur, teraz, zrobilem sobie wskaznik na to w ten sposob

struct game_data *gd;

I teraz mam pytanie w dwoch czesciach, po pierwsze, dlaczego zawsze musze w funkcji main uzywac np

gd->player->x

a nie moge np

gd.player.x

?
Oraz po drugie, jak moge ta strukture game_data przekazac do funkcji teraz zebym mial w funkcji dostep do wszystkich elementow struktury game_data i elementow tych dwoch struktur ktore ona zawiera ?

1

Bo gd jest wskaźnikiem, a operator dobierania się do wnętrza wskaźnika to strzałka a nie kropka. gd-> jest równoważne (*gd).. Jak bardzo lubisz kropki, to możesz

(*(*gd).player).x

Sam zobacz jakie to jest ohydne.

Przekazujesz wskaźnik do istniejącej struktury, żadnej magii tutaj nie ma;

void f(struct game_data* data)

Możesz też przekazać strukturę, ale nastąpi kopiowanie i będziesz operował na kopii

void f(struct game_data data)
0

a no faktycznie dziala, teraz duzo wygodniej odnosic sie do elementow struktury, ale jeszcze jedna rzecz, np jesli zadecyduje zeby struktura player w strukturze nie byla wskaznikiem na siebie tylko byla tam skopiowana to mam error odnosnie malloca:

pong.c:64:13: error: incompatible types when assigning to type ‘struct player_data’ from type ‘void *’
   gd->player=malloc(sizeof(struct player_data));

a struktura zmieniona wyglada tak:

struct game_data{
  unsigned int max_field_x;
  unsigned int max_field_y;
  struct player_data player;
  struct ball_data ball;
};

jak w takim wypadku powinno sie zmienic malloca zeby bylo dobrze ?

1

Jeśli to nie jest wskaźnik to nie ma potrzeby wywołania malloc(). Tak samo jak masz unsigned int x to przecież nie wołasz

x = malloc(sizeof(unsigned int));

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