Jump to content
mirador_22

[Resolvido] estrutura dentro de estrutura dando erro de parametro

Recommended Posts

mirador_22

Ola a todos, estou com dificuldade em definir as estruturas para simular um jogo de multibol para 3 pessoas e algumas bolas em linguagem C e tenho assim, as seguintes estruturas


#define MAX_NUM_JOGADOR	   10//numero maximo de jogadores
#define MIN_NUM_JOGADOR	   3//numero minimo de jogadores a jogar
#define MAX_BOLA_JOGADOR   2//numero maximo de bolas para cada jogador
#define MAX_NUM_BOLA	5//numero maximo de bolas para jogo
#define MIN_NUM_BOLA	 1//numero minimo de bola para jogo

typedef struct {
int num_bola; /* numero de bola */
} BOLA; /*Declaração da estrutura que define a bola*/

typedef struct {
int num_jogador; /*numero de jogador*/
BALIZA baliza; /*possui uma e uma só baliza*/
BOLA bola[MAX_BOLA_JOGADOR]; /*existem várias bolas entre uma a duas bolas*/
} JOGADOR; /*Declaração da estrutura que define o jogador*/

typedef struct {
int num_baliza; /*numero de baliza*/
JOGADOR jogador;
} BALIZA; /*Declaração da estrutura que define a baliza*/

typedef struct {
JOGADOR jogador[MAX_NUM_JOGADOR]; /* contem no maximo 10 jogadores*/
BALIZA balizas[MAX_NUM_JOGADOR]; /*o numero de baliza é igual ao numero de jogadores*/
BOLA bola[MAX_NUM_BOLA]; /*possui no maximo 5 bolas para cada jogo*/
} CAMPO; /*Declaração da estrutura que define  o campo*/

ao compilar da o erro, como mostra na figura

KxlhhMi.png

e tentei fazer assim e dá erro na mesma

/**********************************************
**	Declaração da Estrutura		   **
**********************************************/
typedef struct {
int num_baliza; /*numero de baliza*/
   struct jogador { /*contem apenas um e só um jogador*/
	int num_jogador; /*numero de jogador*/
	BALIZA baliza; /*possui uma e uma só baliza*/
	BOLA bola[MAX_BOLA_JOGADOR]; /*existem várias bolas entre uma a duas bolas*/
 } jogador; /*Declaração da estrutura que define o jogador*/

} BALIZA; /*Declaração da estrutura que define a baliza*/

qySLGx5.png?1

Edited by mirador_22

Share this post


Link to post
Share on other sites
HappyHippyHippo

não podes "usar" um tipo de dados que ainda não foi declarado previamente.

o compilador de C lê o código de cima para baixo e se encontra algum tipo de dados que ainda não interpretou, dá esse erro (se bem que a imagem que apresentas é um erro do NetBeans, mas é a prevenir erros de compilação)

o que deverás fazer é fazer a alusão ao tipo de dados que irás declarar:

#define MAX_NUM_JOGADOR     10              // numero maximo de jogadores
#define MIN_NUM_JOGADOR     3               // numero minimo de jogadores a jogar
#define MAX_BOLA_JOGADOR    2               // numero maximo de bolas para cada jogador
#define MAX_NUM_BOLA        5               // numero maximo de bolas para jogo
#define MIN_NUM_BOLA        1               // numero minimo de bola para jogo

typedef struct BOLA BOLA;                   // dizer que existe um tipo de dados estruturado BOLA que irá ser declarado no "futuro"
typedef struct JOGADOR JOGADOR;             // dizer que existe um tipo de dados estruturado JOGADOR que irá ser declarado no "futuro"
typedef struct BALIZA BALIZA;               // dizer que existe um tipo de dados estruturado BALIZA que irá ser declarado no "futuro"
typedef struct CAMPO CAMPO;                 // dizer que existe um tipo de dados estruturado CAMPO que irá ser declarado no "futuro"

struct BOLA {
       int num_bola;                       // numero de bola
};                                          // Declaração da estrutura que define a bola

struct JOGADOR {
       int num_jogador;                    // numero de jogador
       BALIZA baliza;                      // possui uma e uma só baliza
       BOLA bola[MAX_BOLA_JOGADOR];        // existem várias bolas entre uma a duas bolas
};                                          // Declaração da estrutura que define o jogador

struct BALIZA {
       int num_baliza;                     // numero de baliza
       JOGADOR jogador;
};                                          // Declaração da estrutura que define a baliza

struct CAMPO {
       JOGADOR jogador[MAX_NUM_JOGADOR];   // contem no maximo 10 jogadores
       BALIZA balizas[MAX_NUM_JOGADOR];    // o numero de baliza é igual ao numero de jogadores
       BOLA bola[MAX_NUM_BOLA];            // possui no maximo 5 bolas para cada jogo
};                                          // Declaração da estrutura que define o campo


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mirador_22

obrigado, mas continuou na mesma, continua sem reconhecer o tipo de dados baliza

segundo o prof, a logica a seguir será isto

  • Cada jogador possui uma e uma só baliza e
  • cada baliza pertence a um e um só jogador.

segundo percebi teoricamente, cada jogador possui apenas um numero de baliza que será igual ao que foi inserido e cada baliza pertence a um jogador que será igual ao que tiver o mesmo numero de baliza.

na pratica, ficaria assim,

struct BOLA {
int num_bola; // numero de bola
}; // Declaração da estrutura que define a bola

struct JOGADOR {
int num_jogador; // numero de jogador
int num_baliza; // possui uma e uma só baliza
BOLA bola[MAX_BOLA_JOGADOR]; // existem várias bolas entre uma a duas bolas
}; // Declaração da estrutura que define o jogador

struct BALIZA {
int num_baliza; // numero de baliza
JOGADOR jogador;// possui um e um só jogador
}; // Declaração da estrutura que define a baliza

seguindo este codigo, não dá erro

Edited by mirador_22

Share this post


Link to post
Share on other sites
HappyHippyHippo

obrigado, mas continuou na mesma, continua sem reconhecer o tipo de dados baliza

já percebi qual é o teu problema

nem olhei bem para o conteudo de cada estrutura ...

a solução está aqui :

se um jogador tem uma só baliza e uma baliza pertence a um só jogador, então são uma unica "coisa"

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mirador_22

honestamente a programação é mesmo complicada de entender mas mesmo assim, usando a sua solução continou a dar o mesmo erro

Share this post


Link to post
Share on other sites
falk0n

Qual é o erro que está a aparecer quando compilas o código ?

Pensei que antes fosse que não reconhecia o tipo de dados BALIZA. Como o @HappyHippyHippo disse se trocares a ordem das definições (primeiro a baliza e depois o jogador) já não deverias ter esse problema de reconhecimento do tipo de dados.

Se puderes coloca aqui qual o erro dado pelo compilador (gcc, microsoft compiler, borland, etc).

Boas programações

ps. A baliza pertencer a apenas um jogador (guarda-redes) e um jogador ter apenas uma baliza (a da sua equipa) não quer dizer que sejam a mesma coisa. Mas a ideia do HappyHippyHippo está boa :)

Edited by falk0n

Share this post


Link to post
Share on other sites
HappyHippyHippo

Qual é o erro que está a aparecer quando compilas o código ?

Pensei que antes fosse que não reconhecia o tipo de dados BALIZA. Como o @HappyHippyHippo disse se trocares a ordem das definições (primeiro a baliza e depois o jogador) já não deverias ter esse problema de reconhecimento do tipo de dados.

o que disse não foi trocar a ordem, mas fazer a alusão, o que não é uma solução completa porque não se pode declarar uma estrutura com um parâmetro de tamanho desconhecido.

ps. A baliza pertencer a apenas um jogador (guarda-redes) e um jogador ter apenas uma baliza (a da sua equipa) não quer dizer que sejam a mesma coisa.

eu só analizei o que foi escrito:

segundo o prof, a logica a seguir será isto

  • Cada jogador possui uma e uma só baliza e
  • cada baliza pertence a um e um só jogador.

o que quer dizer que é a mesma coisa

se é para ter declarado as duas estruturas diferentes, a solução é ter um ponteiro (que é um tipo de dados de tamanho conhecido)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mirador_22

Qual é o erro que está a aparecer quando compilas o código ?

Pensei que antes fosse que não reconhecia o tipo de dados BALIZA. Como o @HappyHippyHippo disse se trocares a ordem das definições (primeiro a baliza e depois o jogador) já não deverias ter esse problema de reconhecimento do tipo de dados.

Se puderes coloca aqui qual o erro dado pelo compilador (gcc, microsoft compiler, borland, etc).

Boas programações

ps. A baliza pertencer a apenas um jogador (guarda-redes) e um jogador ter apenas uma baliza (a da sua equipa) não quer dizer que sejam a mesma coisa. Mas a ideia do HappyHippyHippo está boa :)

sem duvida que, a ideia do HappyHippyHippo está boa mas dá erro de não reconhecer a baliza visto que não foi declarado mas na ideia do a iHappyHippyHippo é a mais correta só que o compilador ainda insiste que está errado e a baliza não é para guarda-redes, sim para os jogadores que vao iniciar o jogo multibol

eis a figura,

fSUNEq3.png?1

Share this post


Link to post
Share on other sites
falk0n

sem duvida que, a ideia do HappyHippyHippo está boa mas dá erro de não reconhecer a baliza visto que não foi declarado mas na ideia do a iHappyHippyHippo é a mais correta só que o compilador ainda insiste que está errado e a baliza não é para guarda-redes, sim para os jogadores que vao iniciar o jogo multibol

eis a figura,

Qual é o erro que o compilador dá ? Quando compilas o código em C qual é o erro do compilador ?

Boas programações,

ps. HappyHippyHippo e mirador_22, desculpem eu desconhecia o conceito de multigol. Interessante de facto.

Share this post


Link to post
Share on other sites
mirador_22

Qual é o erro que o compilador dá ? Quando compilas o código em C qual é o erro do compilador ?

Boas programações,

ps. HappyHippyHippo e mirador_22, desculpem eu desconhecia o conceito de multigol. Interessante de facto.

main.c:53:12: error: field ‘baliza’ has incomplete type

BALIZA baliza; // possui uma e uma só baliza

Share this post


Link to post
Share on other sites
falk0n

main.c:53:12: error: field ‘baliza’ has incomplete type

BALIZA baliza; // possui uma e uma só baliza

Podes voltar a colocar a sequencia de instrucoes (de definicoes de tipos) que tens no teu programa ?

Reparaste que o HappyHippoHippy colocou isto (em baixo) numa das respostas que te deu ?

typedef struct BOLA BOLA; // dizer que existe um tipo de dados estruturado BOLA que irá ser declarado no "futuro"

typedef struct JOGADOR JOGADOR; // dizer que existe um tipo de dados estruturado JOGADOR que irá ser declarado no "futuro"

typedef struct BALIZA BALIZA; // dizer que existe um tipo de dados estruturado BALIZA que irá ser declarado no "futuro"

typedef struct CAMPO CAMPO; // dizer que existe um tipo de dados estruturado CAMPO que irá ser declarado no "futuro"

O que (provavelmente) se passa no teu código é que tens dependencias circulares de tipos, que poderiam ser resolvidas com pointers, mas que em principio também podem ser resolvidas com o que coloquei acima em quote.

Ou seja, a BALIZA necessita de um jogador, mas um jogador necessita de uma baliza, (parecido ao problema do que nasceu primeiro o ovo ou a galinha). Ou seja eles são circulares. Para este tipo de problemas podes dizer que vai existir uma estrutura com o nome "qq" e só depois a defines de forma a que o compilador saiba que esse tipo (nome) ja existe. No entanto ele tem de ver procurar esse nome para saber qtos bytes essa estrura vai ter.

Boas programaçoes

Share this post


Link to post
Share on other sites
HappyHippyHippo

Como disse um jogador e baliza e exactamente a mesma coisa. Por outras palavras, não são estruturas diferentes


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mirador_22

Como disse um jogador e baliza e exactamente a mesma coisa. Por outras palavras, não são estruturas diferentes

Podes voltar a colocar a sequencia de instrucoes (de definicoes de tipos) que tens no teu programa ?

Reparaste que o HappyHippoHippy colocou isto (em baixo) numa das respostas que te deu ?

O que (provavelmente) se passa no teu código é que tens dependencias circulares de tipos, que poderiam ser resolvidas com pointers, mas que em principio também podem ser resolvidas com o que coloquei acima em quote.

Ou seja, a BALIZA necessita de um jogador, mas um jogador necessita de uma baliza, (parecido ao problema do que nasceu primeiro o ovo ou a galinha). Ou seja eles são circulares. Para este tipo de problemas podes dizer que vai existir uma estrutura com o nome "qq" e só depois a defines de forma a que o compilador saiba que esse tipo (nome) ja existe. No entanto ele tem de ver procurar esse nome para saber qtos bytes essa estrura vai ter.

Boas programaçoes

Agradeço vos pela vossa orientação mas na verdade, estava complicado raciocinar, mas depois de alterar o Jogador como um apontador da estrutura JOGADOR, deu certo sem erro, como vem na figura e vou repostar o codigo


typedef struct BOLA BOLA; // tipo de dados estruturado BOLA que irá ser declarado
typedef struct JOGADOR JOGADOR; // tipo de dados estruturado JOGADOR que irá ser declarado
typedef struct BALIZA BALIZA; // tipo de dados estruturado BALIZA que irá ser declarado
typedef struct CAMPO CAMPO; // tipo de dados estruturado CAMPO que irá ser declarado

struct BOLA {
   int num_bola; // numero de bola
   char trajetoria[50]; //trajetoria da bola
}; // Declaração da estrutura que define a bola

struct BALIZA {
   int num_baliza; // numero de baliza
   JOGADOR *jogador;//Apontada para jogador que irá ser adicionado a Baliza
}; // Declaração da estrutura que define a baliza

struct JOGADOR {
   int num_jogador; // numero de jogador
   BALIZA baliza; // possui uma e uma só baliza
   BOLA bola[MAX_BOLA_JOGADOR]; // existem várias bolas entre uma a duas bolas
}; // Declaração da estrutura que define o jogador

struct CAMPO {
   JOGADOR jogadores[MAX_NUM_JOGADOR]; // contem no maximo 10 jogadores
   BALIZA balizas[MAX_NUM_JOGADOR]; // o numero de baliza é igual ao numero de jogadores
   BOLA bolas[MAX_NUM_BOLA]; // possui no maximo 5 bolas para cada jogo
}; // Declaração da estrutura que define o campo

Edited by mirador_22

Share this post


Link to post
Share on other sites
mirador_22

tópico resolvido, porque o codigo já está funcionado como esperado e neste momento, estou criando jogadores, baliza adicionando jogadores e criar bola tudo isso foi armazenado na estrutura CAMPO e apartir desta estrutura, já estou acendendo aos dados de outra estruturas, mas duvidas, vou postar e obrigado

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.