Jump to content

[Resolvido] estrutura dentro de estrutura dando erro de parametro


mirador_22
 Share

Recommended Posts

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
Link to comment
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
 Share

×
×
  • 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.