Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PsySc0rpi0n

[Resolvido] Projecto em C - Implementar um jogo do galo personalizado

Mensagens Recomendadas

PsySc0rpi0n

Olá malta...

Este ano o projecto para a cadeira de Programação de Computadores é implementar o jogo do galo mas com algumas personalizações.

Os professores já disponibilizaram todos os pormenores que o jogo deve ter.

Eu e o meu colega de grupo já estamos a começar a "escrevinhar" qualquer coisa.

A primeira parte é implementar um menu que contenha algumas opções, entre as quais, uma que registe jogadores numa espécie de base de dados muito arcaica (num simples file de texto).

Esse registo deve conter um username, o real name, o género (mascuino ou feminino) do jogador e a data de nascimento.

Como o semestre ainda nem a meio vai, ainda há muita matéria da cadeira por dar que vamos precisar para o projecto e neste momento estou a tentar entender a ferramenta "struct" em C para armazenar estes dados e para depois os escrever nesse tal ficheiro.

A minha dúvida é a seguinte:

Criando uma struct eu tenho que definir à priori quantos dados deste tipo de struct vou ter ou posso ir adicionando à medida que este menu de "registar jogador" for solicitado???


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

No que respeita a tamanho de arrays, uma struct comporta-se da mesma maneira que, por exemplo, um int.

Ou defines um array com tamanho "suficiente", ou usas memoria dinamica.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

pmg, agradecido pela resposta rápida...

Como não sei se percebi bem a tua resposta, se calhar não me expliquei bem.

O primeiro menu que aparece é uma lista de opções onde, entre outras, está a opção "Register new player".

Este menu deve pedir alguns dados ao jogador e arquivá-los num ficheiro.

De cada vez que este menu é solicitado, um novo jogador vai ser adicionado ao ficheiro caso ainda não exista.

Estive a ver como se usa a ferramenta struct em C e não sei s entendi bem a ferramenta.

Quando temos o seguinte:

struct p_info {
char u_name [15];
char r_name [60];
char gender [6];
char b_date [10];
}un, rn, gn, bd;

o que está a seguir à última chaveta é a quantidade de dados que a estrutura vai receber, ou seja nese caso, apenas admitiria 4 jogadores registados ou é um género de um identificador para cada variável que declarei dentro da estrutura?

Edited;

Não sei se consegui explicar a minha dúvida...

Ainda não consegui perceber se , no exemplo que dei antes, o "un", o "rn", o "gn" e o "db" são a quantidade de jogadores que eu posso registar com aquelas características que declarei dentro da sctruct ou se cada uma delas se relaciona com cada uma das "variáveis" que declarei dentro da struct!!!

Tentado ainda reformular de outra maneira:

Quando quero usar a struct eu vou pedir os dados e guardá-los como?? Assim???

gets (un.u_name);
...
gets (un.r_name);
...
gets (un.gender);
...
gets (un.b_date);

e depois

gets (ur.u_name);
...
gets (ur.r_name);
...
gets (ur.gender);
...
gets (ur.b_date);

e depois

gets (gn.u_name);
...
gets (gn.r_name);
...
gets (gn.gender);
...
gets (gn.b_date);

e por fim

gets (bd.u_name);
...
gets (bd.r_name);
...
gets (bd.gender);
...
gets (bd.b_date);

e neste caso apenas consigo guardar 4 jogadores que foi o número de variáveis deste tipo que eu criei, ou fazendo

gets (un.u_name);
...
gets (ur.r_name);
...
gets (gn.gender);
...
gets (bd.b_date);

consigo já guardar tantos jogadores quantos queira, armazenando os dados sempre nas mesmas variáveis, sabendo que os anteriores já estão guardados num file????

Se for a 1ª hipótese, eu apenas posso guardar tantos jogadores quantos declarar a seguir à última chaveta da struct que criei.

Se for a 2ª hipótese, aí acho que já posso registar quantos jogadores quiser porque "un", "rn", "gn" e "bd" apenas relacionam cada variável a cada tipo declarado dentro da struct.

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Tive o cuidado de observar que usaste a função gets. Cuidado com o uso dela.

Lê aqui o porquê de eu estar a dizer isto: About Everything: Buffer Overflow.

Relativamente à dúvida, o que estás a fazer é declarar variáveis do tipo da estrutura que acabaste de definir. Ou seja, só podes guardar 4 jogadores, não mais porque são variáveis individuais. Imagina que o tipo int era uma estrutura, ao fazeres algo como int a, b, c, d; estás a declarar 4 variáveis do tipo int (que no caso, imaginas como uma estrutura). Como farias para teres muitas variáveis desse tipo? Declaras um vetor e o problema está resolvido. Podes fazer o mesmo para a estrutura que definiste.

Editado por Localhost

here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Se for a 1ª hipótese, eu apenas posso guardar tantos jogadores quantos declarar a seguir à última chaveta da struct que criei.

Se for a 2ª hipótese, aí acho que já posso registar quantos jogadores quiser porque "un", "rn", "gn" e "bd" apenas relacionam cada variável a cada tipo declarado dentro da struct.

É a primeira hipotese.

Mas podes fazer um array:

struct p_info {
char u_name [15];
char r_name [60];
char gender [6];
char b_date [10];
} array[1000];

Cada elemento do array (ate um maximo de 1000) leva informacao completa sobre cada jogador;

printf("u_name: %s\n", array[42].u_name); /* nome do jogador #43 */

ATENCAO AO TAMANHO DAS STRINGS: char gender[6] nao tem espaco suficiente para guardar a string "female"; char b_date[10] nao tem espaco suficiente para guardar a string "1999-12-31".

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Ah ok...

Obrigado pelos advices de ambos...

Agora vou tentar implementar isso.

Edited;

Posso usar a directiva #define dentro de uma função? Caso não possa, se usar uma directiva destas na função main ela está disponível dentro da main e também dentro das funções? Ou é melhor declarar este vector logo com 10000, por exemplo???

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Posso usar a directiva #define dentro de uma função? Caso não possa, se usar uma directiva destas na função main ela está disponível dentro da main e também dentro das funções? Ou é melhor declarar este vector logo com 10000, por exemplo???

podes usar a "directiva" onde quiseres, tens é de perceber que é um comando do pré-compilador. é algo que será executado antes do compilador !


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

podes usar a "directiva" onde quiseres, tens é de perceber que é um comando do pré-compilador. é algo que será executado antes do compilador !

Ok...

Se fizer assim, estará correcto?

struct p_data {
  int id;
  char u_name [16], char r_name [51], char gender [7], char d_birth [11];
  }
  struct p_data n_player;
  }players [MAX_PLAYERS];
  printf ("Enter player name (15 chars max):\n");
  fgets (n_player [0].u_name, 15, stdin);
  printf ("Enter your real name (50 chars max): \n");
  fgets (n_player [0].r_name, 51, stdin);
  printf ("Enter your gender (male/female): \n");
  fgets (n_player [0].gender, 7, stdin);
  printf ("Enter your birth date (dd-mm-yyyy): \n");
  fgets (n_player [0].d_birth, 11, stdin);

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Se fizer assim, estará correcto?

Resposta dentro do teu codigo, com // comentarios

  struct p_data {
     int id;
     char u_name [16], char r_name [51], char gender [7], char d_birth [11]; // ERRO
     // para separar membros usa ;
  }
  struct p_data n_player; // ERRO!
  // depois de definires uma struct ou terminas a definicao com ;
  // ou aproveitas a definicao da struct propriamente dita para declarar
  // (ou definir) um ou mais objectos desse tipo

  }players [MAX_PLAYERS]; // ERRO! Chaveta a mais

  printf ("Enter player name (15 chars max):\n");
  fgets (n_player [0].u_name, 15, stdin); // ERRO
  // n_player nao esta definido, porque as instrucoes anteriores teem erro!
  // se nao tivesse erro, mesmo assim tinhas ERRO neste fgets: n_player nao foi
  // declarado como array, mas sim como objecto normal

  /* ... */

Faz assim

  struct p_data {
     int id;
     char u_name[16];
     char r_name[51];
     char gender[7];
     char d_birth[11];
  }; // Nota o ;

  struct p_data players[MAX_PLAYERS]; // array de struct p_data

  fgets(players[0].u_name, sizeof players[0].u_name, stdin);

  • Voto 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Quando fazemos o sizeof, o "argumento" do sizeof não tem que estar dentro de parêntesis?

Vou ter que ver como pesquisar no file onde guardo os dados pela id para a poder incrementar cada vez que um jogador novo é registado...

Esta parte ainda não faço ideia de como fazer...

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Estive a completar o code e ficou assim:

struct p_data {
  int id;
  char uname [16];
  char rname [51];
  char gender [7];
  char dbirth [11];
  } nplayer [MAX_PLAYERS];

  printf ("Enter player name (15 chars max):\n");
  fgets (nplayer [0].uname, sizeof nplayer [0].uname, stdin);
  printf ("Enter your real name (50 chars max): \n");
  fgets (nplayer [0], sizeof nplayer [0].rname, stdin);
  printf ("Enter yiur gender (male/female): \n");
  fgets (nplayer [0], sizeof nplayer [0].gender, stdin);
  printf ("Enter your birth date (dd-mm-yyy) ");
  fgets (nplayer [0], sizeof nplayer[0].dbirth, stdin);

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Quando fazemos o sizeof, o "argumento" do sizeof não tem que estar dentro de parêntesis?

Nao, se for um objecto. Se for um tipo, o tipo tem que estar entre parentesis -- ou seja, os parentesis "pertencem" ao tipo. Imagina que o sizeof é como o return ...

return 42; // return ou sizeof de um
sizeof 42; // objecto de tipo int;

return (int)3.5; // nao precisa de
sizeof (int);    // mais parentesis

return(-4); // parentesis
sizeof(-4); // redundantes


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Bem, pesquisei um pouco pela net para ver se seria fácil procurar uma string dentro do meu file mas parece que não é muito fácil.

Dos exemplos que vi, ainda há imensas coisas que ainda não conheço.

Por isso vou precisar de ajuda.

Estou a pensar no seguinte:

Quando um jogador se vai registar, o programa precisa de ir ao ficheiro onde estão os dados dos jogadores, procurar a última ID para criar uma a segir, e depois de o jogador inserir o nome de jogador/nick, o programa também tem que ir ao mesmo ficheiro e procurar se já existe algum igual.

O ficheiro estou a idealizar que fique assim parecido:

ID Player name Real Name Gender Date of Birth

000001 PsySc0rpi0n Bla Bla Bla Bla Bla Bla Male 01-01-1900

000002 PsySc0rpi0n2 Bla Bla Bla Bla Bla Bla Male 02-02-1902

Ou seja, preciso de um algoritmo para procurar e reconhecer o ID mais alto e ao criar o ID seguinte, que seja o anterior + 1 e depois que compare o Player name à string introduzida para este campo. Se for igual, alerta o user e pede para repetir a introdução do nome, se for diferente, pede o dado seguinte...

Por onde devo começar?

Vi este exemplo mas não sei interpretá-lo na sua totalidade nem sei alterá-lo de acordo com as minhas necessidades...

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
    FILE *fp=fopen(argv[1],"r");
    char  tmp[256]={0x0};
    while(fp!=NULL && fgets(tmp, sizeof(tmp),fp)!=NULL)
    {
    if (strstr(tmp, argv[2]))
    printf("%s", tmp);
    }
    if(fp!=NULL) fclose(fp);
    return 0;
}

Não sei o que significa {0x0} nem sei o que é o int argc, char **argv nos argumentos da função main. Depois também não conheço ainda a função strstr mas estou já a ver pelo google...

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

bem, como pareces um bocado longe do que deverias implementar, aqui tens um exemplo daquilo que deverias ter:

nota : não foi testado, todo o código é feito de cabeça, mas é o suficiente para te elucidar de como fazer

#include <stdio.h>
#include <string.h>

#define PLAYERS_FILE "players.bin"

struct Player {
 int id;
 char uname [16];
 char rname [51];
 char gender [7];
 char dbirth [11];
};

int player_get(struct Player * player)
{
 FILE * fd = NULL;
 struct Player searcher;

 // abrir o ficheiro
 if ((fd = fopen(PLAYERS_FILE, "rb")) == NULL)
 {
   // erro de abertura do ficheiro
   return -1;
 }

 // ciclo de pesquisa do registo no ficheiro
 while (fread(&searcher, sizeof (struct Player), 1, fd))
 {
   if (searcher.id == player->id)
   {
     // gravar a info do registo encontrado
     *player = searcher;

     fclose(fd);

     // encontrado
     return 0;
   }
 }

 fclose(fd);

 // não encontrado
 return -2;
}

int player_save(struct Player * player)
{
 FILE * fd = NULL;

 // abrir o ficheiro
 if ((fd = fopen(PLAYERS_FILE, "ab")) == NULL)
 {
   // erro de abertura do ficheiro
   return -1;
 }

 if (!fwrite(player, sizeof (struct Player), 1, fd))
 {
   fclose(fd);

   // erro de escrita
   return -2;
 }

 fclose(fd);

 // gravado
 return 0;
}

int player_update(struct Player * player)
{
 FILE * fd = NULL;
 struct Player searcher;

 // abrir o ficheiro
 if ((fd = fopen(PLAYERS_FILE, "rb")) == NULL)
 {
   // erro de abertura do ficheiro
   return -1;
 }

 // reposicionar o ponteiro interno do stream para a pesquisa (aberto com 'a')
 rewind(fd)

 // ciclo de pesquisa do registo no ficheiro
 while (fread(&searcher, sizeof (struct Player), 1, fd))
 {
   if (searcher.id == player->id)
   {
     // retroceder o ponteiro para a posição inicial do registo
     fseek(fd, - sizeof (struct Player), SEEK_CUR);

     // actualizar o registo
     if (!fwrite(player, sizeof (struct Player), 1, fd))
     {
       fclose(fd);

       // erro de escrita
       return -3;
     }

     fclose(fd);

     // actualizado
     return 0;
   }
 }

 fclose(fd);

 // não encontrado
 return -2;
}

int main()
{
 struct Player player;

 // gravar um registo de jogador
 if (player_save(&player) != 0)
 {
   // erro de gravação
 }

 // actualizar um registo do jogador
 player.id = 1; // <--- o id é obrigatório para a pesquisa do registo
 if (player_update(&player) != 0)
 {
   // erro de actualização
 }

 // leitura de um registo específico
 player.id = 1; // <--- o id é obrigatório para a pesquisa do registo
 if (player_get(&player) != 0)
 {
   // erro de leitura
 }
}


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Outra solucao seria, ao iniciar o programa, copiares todos os dados do ficheiro para memoria.

Durante o tempo em que o programa esta a funcionar nunca mais pensavas no ficheiro ...

E no fim do programa escrevias os dados actualizados para o ficheiro, ficando com ele actualizado.

O ficheiro estou a idealizar que fique assim parecido:

ID Player name Real Name Gender Date of Birth

000001 PsySc0rpi0n Bla Bla Bla Bla Bla Bla Male 01-01-1900

000002 PsySc0rpi0n2 Bla Bla Bla Bla Bla Bla Male 02-02-1902

Ok ... mas eu punha o nome no fim: supoe que um gajo se chama "Alberto Male" :)

Com o nome no fim eu sei muito facilmente onde comecam e acabam todas as informacoes.

Não sei o que significa {0x0}

0x0 é o valor 0 (zero) em notacao hexadecimal (o autor desse codigo estava a fazer-se engracadinho).

As chavetas servem para a inicializacao do array

char  tmp[256] = {0}; // inicializa todos os tmp com zero

nem sei o que é o int argc, char **argv nos argumentos da função main

O argtc e o argv servem para identificar os parametros usados no programa. Se o teu programa se chamar "programa.exe" e o chamares na linha de comando com "programa quarenta e dois", usando argc e argv eles vao ter os valores

argc: 4

argv[0]: "programa" (ou programa.exe ou outra coisa dependendo do SO)

argv[1]: "quarenta"

argv[2]: "e"

argv[3]: "dois"

argv[4]: NULL (nota: igual a argv[argc])

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

O code do HappyHippyHippo acho que ainda um pouco demais para mim...

Vou tentar percebê-lo a ver se o consigo implementar no meu programa.

Obrigado pmg pelas explicações.

A tua sugestão parece-me também muito funcional, mas não estarei a comprometer a memória do PC onde o jogo estiver a correr ao copiar todos os dados do ficheiro para a memória? O por maior que seja o ficheiro não deve chegar para pôr em causa a memória do computador?

HappyHippyHippo, vou ter que analisar o teu código por partes e entender o que cada coisa faz... Tenho que rever algumas funções como fread, fwrite e fseek. Depois há ali algumas linhas de código que não percebo. Mas mais logo vemos isso melhor, ok HappyHippyHippo???

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

struct Player {
 int id;
 char uname [16];
 char rname [51];
 char gender [7];
 char dbirth [11];
};

- 4 bytes para o id

- 16 para o uname

- 51 para o rname

- 7 para o gender

- 11 para o dbirth

= 89 bytes + padding = 92 bytes por registo

em 1 megabyte (1048576 bytes) podes ter : 11397 registos


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Estava aqui a tentar implementar no meu telefone (Android) o code só para os menus mas isto está-me a dar erros e queria ajuda para identificá-los porque não sei se terão a ver com o SO ou se têm apenas a ver com o c.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void m_menu () {
    char op;
    system ("clear");
    printf ("O Jogo do Galo \n\n\n");
    printf ("\tMenu Principal \n");
    printf ("\t\t(R)egistar Novo Jogador\n");
    printf ("\t\t(M)ostrar informação sobre o Jogador\n");
    printf ("\t\t(A)pagar Jogador\n");
    printf ("\t\t(J)ogar\n");
    printf ("\t\t(L)istar Pontuações\n");
    printf ("(S)air\n");
    again:
    printf ("Escolha o menu: \n");
    fflush (stdin);
    scanf ("%c", &op);
    switch (tolower (op)) {
         case 'r': reg_jogador (); break;
         case 'm': mostra_info (); break;
         case 'a': apaga_jogador (); break;
         case 'j': jogar (); break;
         case 'l': list_pont (); break;
         case 's': {
                           printf ("Escolheu sair!\n"); 
                           getchar ();
                           exit (0);
                        }
         default: printf ("Opção inválida!\n"); goto again;
}
}

void reg_jogador () {
    char op;
    system ("clear");
    printf ("(R)egistar Novo Jogador\n");
    printf ("(S)air\n");
    again:
    printf ("Escolha o menu: \n");
    fflush (stdin);
    scanf ("%c", &op);
    switch (tolower (op)) {
         case 'r': reg_jog (); break;
         case 's': m_menu (); break;
         default: printf ("Opção inválida!\n"); goto again;
    }
}

void mostra_info (){
    printf ("Menu mostra informação do jogador!\n");
    getchar ();
    m_menu ();
}

void apaga_jogador () {
    printf ("Menu Apaga Jogador\n");
    getchar ();
    m_menu ();
}

void jogar () {
    char op;
    system ("clear");
    printf ("Jogador vs (C)omputador\n");
    printf ("(J)ogador vs Jogador\n");
    printf ("Comp(u)tador vs Computador");
    printf ("(S)air");
    again:
    printf ("Escolha a opção: \n");
    fflush (stdin);
    switch (tolower(op)) {
         case 'c': jog_jc (); break;
         case 'j': jog_jj (); break;
         case 'u': jog_cc (); break;
         case 's': m_menu (); break;
         default: printf ("Opção inválida!\n"); goto again;
    }
}

void list_pont () {
    printf ("Menu listar pontuaçôes\n");
    getchar ();
    m_menu ();
}

void main (void) {

    m_menu ();

return 0;
}

Ainda me faltam definir pelo menos 3 funções mas o erro que dá é:

line 35...imcompatible types for redefinition of 'reg_jogador'

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Oops -- system("clear"); Isto, tem um efeito diferente de sistema operativo para sistema operativo: pode fazer o que esperas, fazer outra coisa, não fazer nada, ..., ...

Sugiro que não uses.

Oops -- fflush(stdin); Excepto em Windows com a biblioteca standard da microsoft, isto é um exemplo canónico de Comportamento Indefinido.

Sugiro que não uses.

Oops -- void main(void) { /* ... */ return 0; } Atão mas main não devolve nada (void no tipo da função) ou devolve um int (return 0;)? ???

Sugiro que alteres o tipo da função para devolver int.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

estas a chamar as funções antes de as definir.

ou passa a função main para o fim do ficheiro ou faz alusão à funções existente no início do ficheiro.


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

A função main está no final.

Já corrigi os 3 pontos que o pmg falou mas está a dar o mesmo erro. . .

edit;

Bem, como já estou em casa vou testar no PC!!!

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Não percebo porquê tanto warning e erro...

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void m_menu () {
 char op;
 system ("clear");
 printf ("O Jogo do Galo \n\n\n");
 printf ("\tMenu Principal \n");
 printf ("\t\t(R)egistar Novo Jogador\n");
 printf ("\t\t(M)ostrar informação sobre o Jogador\n");
 printf ("\t\t(A)pagar Jogador\n");
 printf ("\t\t(J)ogar\n");
 printf ("\t\t(L)istar Pontuações\n");
 printf ("(S)air\n");
 again:
 printf ("Escolha o menu: \n");
 //fflush (stdin);
 scanf ("%c", &op);
 switch (tolower (op)) {
	  case 'r': reg_jogador (); break;
	  case 'm': mostra_info (); break;
	  case 'a': apaga_jogador (); break;
	  case 'j': jogar (); break;
	  case 'l': list_pont (); break;
	  case 's': {
					    printf ("Escolheu sair!\n");
					    getchar ();
					    exit (0);
					 }
	  default: printf ("Opção inválida!\n"); goto again;
}
}
void reg_jogador () {
 char op;
 system ("clear");
 printf ("(R)egistar Novo Jogador\n");
 printf ("(S)air\n");
 again:
 printf ("Escolha o menu: \n");
 //fflush (stdin);
 scanf ("%c", &op);
 switch (tolower (op)) {
	  case 'r': reg_jog (); break;
	  case 's': m_menu (); break;
	  default: printf ("Opção inválida!\n"); goto again;
 }
}
void mostra_info (){
 system ("clear");
 printf ("Menu mostra informação do jogador!\n");
 getchar ();
 m_menu ();
}
void apaga_jogador () {
 system ("clear");
 printf ("Menu Apaga Jogador\n");
 getchar ();
 m_menu ();
}
void jogar () {
 char op;
 system ("clear");
 printf ("Jogador vs (C)omputador\n");
 printf ("(J)ogador vs Jogador\n");
 printf ("Comp(u)tador vs Computador");
 printf ("(S)air");
 again:
 printf ("Escolha a opção: \n");
 //fflush (stdin);
 switch (tolower(op)) {
	  case 'c': jog_jc (); break;
	  case 'j': jog_jj (); break;
	  case 'u': jog_cc (); break;
	  case 's': m_menu (); break;
	  default: printf ("Opção inválida!\n"); goto again;
 }
}
void list_pont () {
 system ("clear");
 printf ("Menu listar pontuaçôes\n");
 getchar ();
 m_menu ();
}
void jog_jc (){
 system ("clear");
 printf ("Começa o jogo a!\n");
 getchar ();
 jogar ();
}
void jog_jj () {
system ("clear");
printf ("Começa o jogo b!\n");
getchar ();
jogar ();
}
void jog_cc () {
system ("clear");
printf ("Começa o jogo c!\n");
getchar ();
jogar ();
}
int main () {
 m_menu ();
return 0;
}

agcc -o tic-tac-toe_menus tic-tac-toe_menus.c
tic-tac-toe_menus.c: In function ‘m_menu’:
tic-tac-toe_menus.c:20:6: warning: implicit declaration of function ‘tolower’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c:21:11: warning: implicit declaration of function ‘reg_jogador’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c:22:11: warning: implicit declaration of function ‘mostra_info’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c:23:11: warning: implicit declaration of function ‘apaga_jogador’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c:24:11: warning: implicit declaration of function ‘jogar’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c:25:11: warning: implicit declaration of function ‘list_pont’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c: At top level:
tic-tac-toe_menus.c:35:6: warning: conflicting types for ‘reg_jogador’ [enabled by default]
tic-tac-toe_menus.c:21:21: note: previous implicit declaration of ‘reg_jogador’ was here
tic-tac-toe_menus.c: In function ‘reg_jogador’:
tic-tac-toe_menus.c:45:11: warning: implicit declaration of function ‘reg_jog’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c: At top level:
tic-tac-toe_menus.c:51:6: warning: conflicting types for ‘mostra_info’ [enabled by default]
tic-tac-toe_menus.c:22:21: note: previous implicit declaration of ‘mostra_info’ was here
tic-tac-toe_menus.c:58:6: warning: conflicting types for ‘apaga_jogador’ [enabled by default]
tic-tac-toe_menus.c:23:21: note: previous implicit declaration of ‘apaga_jogador’ was here
tic-tac-toe_menus.c:65:6: warning: conflicting types for ‘jogar’ [enabled by default]
tic-tac-toe_menus.c:24:21: note: previous implicit declaration of ‘jogar’ was here
tic-tac-toe_menus.c: In function ‘jogar’:
tic-tac-toe_menus.c:76:11: warning: implicit declaration of function ‘jog_jc’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c:77:11: warning: implicit declaration of function ‘jog_jj’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c:78:11: warning: implicit declaration of function ‘jog_cc’ [-Wimplicit-function-declaration]
tic-tac-toe_menus.c: At top level:
tic-tac-toe_menus.c:84:6: warning: conflicting types for ‘list_pont’ [enabled by default]
tic-tac-toe_menus.c:25:21: note: previous implicit declaration of ‘list_pont’ was here
tic-tac-toe_menus.c:91:6: warning: conflicting types for ‘jog_jc’ [enabled by default]
tic-tac-toe_menus.c:76:21: note: previous implicit declaration of ‘jog_jc’ was here
tic-tac-toe_menus.c:98:6: warning: conflicting types for ‘jog_jj’ [enabled by default]
tic-tac-toe_menus.c:77:21: note: previous implicit declaration of ‘jog_jj’ was here
tic-tac-toe_menus.c:105:6: warning: conflicting types for ‘jog_cc’ [enabled by default]
tic-tac-toe_menus.c:78:21: note: previous implicit declaration of ‘jog_cc’ was here
tic-tac-toe_menus.c: In function ‘jogar’:
tic-tac-toe_menus.c:75:21: warning: ‘op’ is used uninitialized in this function [-Wuninitialized]
/tmp/ccpOsfh2.o: In function `reg_jogador':
tic-tac-toe_menus.c:(.text+0x171): undefined reference to `reg_jog'
collect2: error: ld returned 1 exit status


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

tens razão, o main está no final, mas o problema está logo na "m_menu ()" ...

faz o que te disse :

faz alusão à funções existente no início do ficheiro.


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.