Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Problemas com a função time(0) na plataforma Xcode.

Pessoal, boa noite.

Estou fazendo o curso de programação em C e no jogo de adivinhação, para gerar o número aleatório, estou com problemas para declarar a função que retorna o número de segundos passados (aquela função time(0)). Estou escrevendo o código da seguinte forma: srand(time(0)); int num_secreto = rand() % 100;

Os problemas que aparecem são: - Initializer element is not a compile-time constant - Type specifier missing, defaults to 'int' - Expected ')' - Conflicting types for 'srand' - Expected parameter declarator

Obs: declarei a biblioteca

Alguém poderia me ajudar com esses erros?

Obrigado pela ajuda desde já. Grande abraço.

10 respostas

posta o código todo pra gente? é nessa linha o erro de compilacao?

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

int tentativas = 0, chute;
double pontos_finais, pontos_perdidos = 0, pontos_iniciais = 10000;
srand(time(0));
int num_secreto = rand() % 100;

int main ()

{
    printf("Olá, bem-vindo! Você está no jogo de adivinhação desenvolvido por Guilherme Palazzo. \n\n");
    printf("A regra é simples. Você irá chutar números para adivinhar um número aleatório gerado pelo computador. \n\n");
    printf("Você começará com 10000 pontos. Cada vez que errar, perderá os pontos da seguinte forma: Os pontos que você possui no início daquela rodada, subtraído da metade da diferença entre o número que escolheu e o número secreto. Caso acerte de primeira, conseguirá manter os 10000 pontos iniciais. \nO jogo terminar quando você acertar ou quando esgotar a quantidade de pontos que possui. \n\nBoa sorte! \n\n");

    while (1)
    {

            tentativas += 1;
            pontos_finais = pontos_iniciais;
            printf("\nVocê está na sua %.0dª tentativa \n", tentativas);
            printf("Chute um número natural: \n");
            scanf("%d", &chute);

                if ( chute > 0 )
                {

                    if ( chute == num_secreto )
                    {
                        if ( tentativas == 1)
                        {
                            printf("\nParabéns, você acertou na %.0dª tentativa! \nO número secreto é %.0d. \n", tentativas, num_secreto);
                            printf("Como combinado, você manteve seus %.1f pontos. \n", pontos_iniciais);
                            break;
                        }

                        else
                        {
                            printf("\nParabéns, você acertou na %.0dª tentativa! \nO número secreto é %.0d. \n", tentativas, num_secreto);
                            printf("Você terminou o jogo com %.1f pontos. \n", pontos_finais);
                            break;
                        }
                    }

                    else if ( chute > num_secreto )
                    {
                        pontos_perdidos = abs(chute - num_secreto) / (double)2;
                        pontos_iniciais = pontos_iniciais - pontos_perdidos;

                        if (pontos_iniciais < 0)
                        {
                            printf("O número %.0d é maior que o número secreto. \n\n", chute);
                            printf("O número secreto é: %.0d. \nVocê chutou o valor %.0d e, após as sucessivas subtrações de pontos, agora possui %.1f pontos \n", num_secreto, chute, pontos_iniciais);
                            printf("De acordo com nossas regras de subtração de pontos, você foi desclassificado. \nFim de jogo.\n");
                            break;
                        }

                        else
                        {
                            continue;
                        }
                    }

                    else
                    {
                        pontos_perdidos = abs(chute - num_secreto) / (double)2;
                        pontos_iniciais = pontos_iniciais - pontos_perdidos;
                        printf("O numero %.0d é menor que o número secreto. \n\n", chute);
                        continue;
                    }
                }

                else
                {
                    printf("Você só pode informar números naturais, ou seja, maiores que zero. \nInsira o número novamente. \n\n");
                    tentativas--;
                    continue;
                }
    }
}

Eu imagino que deva ter um jeito menos longo de fazer esse código, mas sou bem iniciante e consegui fazer através dessa lógica, haha. Aos poucos vou lapidando.

O erro se dá na linha em que declarei eles mesmo.

oi Guilherme

coloque essas duas delcaracoes dentro do main!

srand(time(0));
int num_secreto = rand() % 100;

fora do main só fica as variaveis globais. nao deve colocar uma chamada de funcao, como srand, por lá!

Paulo, obrigado pela ajuda. Os erros diminuíram, porém ainda possui um erro com a seguinte mensagem: Implicit conversion loses integer precision: 'time_t' (aka 'long') to 'unsigned int'

int main ()

{
    srand(time(0));
    int num_secreto = rand() % 100;

em vez de fazer int use long. Não conheço muito bem as bibliotecas e diferenças de se programar no xcode... mas no devcpp ou outro editor/compilador isso deveria funcionar bem.

Paulo,

Infelizmente ainda não funcionou, mas agradeço a atenção.

Sobre o Xcode, você sugere outra plataforma para quem está começado ou acredita ser bom se familiarizar com ela para caso queira utilizar as outras funcionalidades futuramente?

long num_secreto = rand() % 100;

esse dá qual erro em especifico?

do editor, nao sei te dizer. eu usuaria o que foi proposto no curso para voce garantir que vai pegar mais facil esse começo!

Ele continua dando o mesmo erro com a mensagem: Implicit conversion loses integer precision: 'time_t' (aka 'long') to 'unsigned int' e o erro se refere a:

srand(time(0));

Combinado, farei isso, mas agora virou questão de honra conseguir arrumar esse problema (haha).

solução!

Paulo,

Mesmo com aquele erro, que ao que parece é um erro relacionado com a perda de dados por problemas de conversão, o código compila e roda sem problemas, gerando um número aleatório a cada vez que é compilado.

Acredito que não estou tendo problemas com essa perda de dados porque declarei a variável como sendo long, quando na verdade ela é um int.

O código ficou assim:

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

int tentativas = 0, chute;
double pontos_finais, pontos_perdidos = 0, pontos_iniciais = 10000;
long num_secreto;

int main ()

{
    srand(time(0));
    num_secreto = rand() % 101;


    printf("Olá, bem-vindo! Você está no jogo de adivinhação desenvolvido por Guilherme Palazzo. \n\n");
    printf("A regra é simples. Você irá chutar números para adivinhar um número aleatório gerado pelo computador. \n\n");
    printf("Você começará com 10000 pontos. Cada vez que errar, perderá os pontos da seguinte forma: Os pontos que você possui no início daquela rodada, subtraído da metade da diferença entre o número que escolheu e o número secreto. Caso acerte de primeira, conseguirá manter os 10000 pontos iniciais. \nO jogo terminar quando você acertar ou quando esgotar a quantidade de pontos que possui. \n\nBoa sorte! \n\n");

    while (1)
    {

            tentativas += 1;
            pontos_finais = pontos_iniciais;
            printf("\nVocê está na sua %.0dª tentativa \n", tentativas);
            printf("Chute um número natural: \n");
            scanf("%d", &chute);

                if ( chute > 0 )
                {

                    if ( chute == num_secreto )
                    {
                        if ( tentativas == 1)
                        {
                            printf("\nParabéns, você acertou na %.0dª tentativa! \nO número secreto é %.0ld. \n", tentativas, num_secreto);
                            printf("Como combinado, você manteve seus %.1f pontos. \n", pontos_iniciais);
                            break;
                        }

                        else
                        {
                            printf("\nParabéns, você acertou na %.0dª tentativa! \nO número secreto é %.0ld. \n", tentativas, num_secreto);
                            printf("Você terminou o jogo com %.1f pontos. \n", pontos_finais);
                            break;
                        }
                    }

                    else if ( chute > num_secreto )
                    {
                        pontos_perdidos = labs(chute - num_secreto) / (double)2;
                        pontos_iniciais = pontos_iniciais - pontos_perdidos;
                        printf("O número %.0d é maior que o número secreto. \n\n", chute);

                        if (pontos_iniciais < 0)
                        {
                            printf("O número secreto é: %.0ld. \nVocê chutou o valor %.0d e, após as sucessivas subtrações de pontos, agora possui %.1f pontos \n", num_secreto, chute, pontos_iniciais);
                            printf("De acordo com nossas regras de subtração de pontos, você foi desclassificado. \nFim de jogo.\n");
                            break;
                        }

                        else
                        {
                            continue;
                        }
                    }

                    else
                    {
                        pontos_perdidos = labs(chute - num_secreto) / (double)2;
                        pontos_iniciais = pontos_iniciais - pontos_perdidos;
                        printf("O numero %.0d é menor que o número secreto. \n\n", chute);
                        continue;
                    }
                }

                else
                {
                    printf("Você só pode informar números naturais, ou seja, maiores que zero. \nInsira o número novamente. \n\n");
                    tentativas--;
                    continue;
                }
    }
}

Obrigado pela sua disponibilidade.

Boa noite!

é realmente só um warning! e se quiser tirar, faça o casting:

srand( static_cast<unsigned int>(time(0)));