Jump to content

Valor errado final...


alphasil

Recommended Posts

Olá ppl

Numa função determinada existe uma contagem de acertos do utilzador que quero que passe para a função seguinte.

o protótipo da primeira função é:

int gp1_Ques(struct perg *p, char *usr1)

//Aqui chamo a nova função
gp2_Ques(&p, usr1, result); //result é para transportar o valor apurado

em que struct serve de apontador para estrutura perg e o *usr1 vai buscar-me o utilizador que fez login na função anterior

Quando joga, o utilizador acumula pontos, se tiver pontos suficientes passa para a fase seguinte(outra função)

Nesta nova função quero transportar o valor acumulado (result), o protótipo fica assim.

int gp2_Ques(struct gp2 *p, char *usr1, int *result)

Se eu puser uma frase de entrada sobre usr1 e valor de result funciona na perfeição mas tenho este warning no result

format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat]|

Se quiser criar uma variavel result1 e no fim atribuir ao valor result o valor de result1 dá um número que não tem nada a ver.

estilo se for result = 2;

result1 = 3;

faço

result+=result1;

Dá-me 18????

Se eu puser *result, o programa estoira...

Que se passa com isso??

Obrigado

Edited by alphasil
gmc11

 

Link to comment
Share on other sites

Além disto,

void gp2_Ques(struct gp2 *p, char *usr1, int *result)
{
FILE *f; //apontador para ficheiro
f=fopen("gp2.dat", "rb"); //abertura do ficheiro
char buf[10];
int reg=0,reg1; //Variaveis contadoras de perguntas e random
int random; // Variável de random
int op; //Variáveis opções utilizadores
int qual; //Variáveis resultados
rewind(f); //retorna a posição corrente do ficheiro para o início
srand(time(NULL)); //função random
system("cls");
fseek(f, 0, SEEK_END);
reg=ftell(f) /sizeof *p;
fseek(f, 0 , SEEK_SET);
if (reg<=0) //condição que verifica se existem registos
{
		printf ("Sem registos \n");
		printf ("\n Necessario ter registos para jogar...\n");
		return;
}
else
{
if(op==1)
		{
				fseek(f, reg1 * sizeof *p, SEEK_SET);
				fread(p, sizeof *p, 1, f);
/*AQUI*/       printf("%s transporta %d pontos da anterior fase \n",usr1, *result);   //<--- alteração
				printf("\nPergunta : %s", p->ques);
				printf("\nResposta correta? (facto ou ficcao)\n");
				fgets(buf,9,stdin);
				printf("A variavel buf tem %s", buf);
				if(strcmp(buf,p->res)==0) //compara as duas stringd
						{
								printf("\nAcertou na resposta...");
								result++;
								random=rand()%reg; //função random
								reg1 = random; //atribui a variavel reg o valor de random
								fseek(f, reg1 * sizeof *p, SEEK_SET);
								fread(p, sizeof *p, 1, f);
								printf("\nPergunta : %s", p->ques);
								printf("\nResposta correta? (facto ou ficcao)\n");
								fgets(buf,9,stdin);
								if(strcmp(buf,p->res)==0)
								{
										printf("\nAcertou na resposta...");
/*AQUI*/                                *result++;  //<---- Alteração (estavas a incrementar o apontador, não o valor apontado)
/*AQUI*/                                printf("Valor de result %d\n", *result);  //<--- Alteração
										printf("\nPassou a segunda fase...parabens\n");
										//por aqui gp3_Ques
								}
								else
								{
										printf("\nResposta errada\n");
										printf("\nFoi eliminado....tente novamente\n");

								}
						}
						else
						{
								printf("Resposta errada");
								printf("\nFoi eliminado....tente novamente\n");
								Sleep(2000);
								system("cls");
								jogo();
}
}

Tens de testar isso, não corri logo não posso garantir que esteja tudo ok.

Edited by Flinger
Link to comment
Share on other sites

Oi

Isto é assim, se ponho

int result;

gp2_Ques(&p, usr1, &result); //result é para transportar o valor apurad

dá-me um valor completamente absurdo

Se ponho * o programa estoira...

Assim funciona

gp2_Ques(&p, usr1, result);

no protótipo da função em vez de int *result ponho assim

int gp2_Ques(struct gp2 *p, char *usr1, int result)

e a linha que vai buscar esse valor é:

printf ("\n      Traz da outra fase: %d pontos \n",result);

Não sei se está certo mas não me dá warning e está a dar-me o valor certo

gmc11

 

Link to comment
Share on other sites

Essa solução funciona porque passas o valor de resul em vez de passares o apontador para a variavel. O problema é que quando terminas a função, a variável result da main não tem o valor actualizado mas sim o valor antes da chamada da tua função.

De qq forma encontrei mais uma referência que não estava corrigida.

void gp2_Ques(struct gp2 *p, char *usr1, int *result)
{
    FILE *f; //apontador para ficheiro
    f=fopen("gp2.dat", "rb"); //abertura do ficheiro
    char buf[10];
    int reg=0,reg1; //Variaveis contadoras de perguntas e random
    int random; // Variável de random
    int op; //Variáveis opções utilizadores
    int qual; //Variáveis resultados
    rewind(f); //retorna a posição corrente do ficheiro para o início
    srand(time(NULL)); //função random
    system("cls");
    fseek(f, 0, SEEK_END);
    reg=ftell(f) /sizeof *p;
    fseek(f, 0 , SEEK_SET);
    if (reg<=0) //condição que verifica se existem registos
    {
				    printf ("Sem registos \n");
				    printf ("\n Necessario ter registos para jogar...\n");
				    return;
    }
    else
    {
if(op==1)
				    {
								    fseek(f, reg1 * sizeof *p, SEEK_SET);
								    fread(p, sizeof *p, 1, f);
/*AQUI*/	   printf("%s transporta %d pontos da anterior fase \n",usr1, *result);   //<--- alteração
								    printf("\nPergunta : %s", p->ques);
								    printf("\nResposta correta? (facto ou ficcao)\n");
								    fgets(buf,9,stdin);
								    printf("A variavel buf tem %s", buf);
								    if(strcmp(buf,p->res)==0) //compara as duas stringd
												    {
																    printf("\nAcertou na resposta...");
/*AQUI-Faltava esta*/                                                                        *result++;
																    random=rand()%reg; //função random
																    reg1 = random; //atribui a variavel reg o valor de random
																    fseek(f, reg1 * sizeof *p, SEEK_SET);
																    fread(p, sizeof *p, 1, f);
																    printf("\nPergunta : %s", p->ques);
																    printf("\nResposta correta? (facto ou ficcao)\n");
																    fgets(buf,9,stdin);
																    if(strcmp(buf,p->res)==0)
																    {
																				    printf("\nAcertou na resposta...");
/*AQUI*/							    *result++;  //<---- Alteração (estavas a incrementar o apontador, não o valor apontado)
/*AQUI*/							    printf("Valor de result %d\n", *result);  //<--- Alteração
																				    printf("\nPassou a segunda fase...parabens\n");
																				    //por aqui gp3_Ques
																    }
																    else
																    {
																				    printf("\nResposta errada\n");
																				    printf("\nFoi eliminado....tente novamente\n");
																    }
												    }
												    else
												    {
																    printf("Resposta errada");
																    printf("\nFoi eliminado....tente novamente\n");
																    Sleep(2000);
																    system("cls");
																    jogo();
}
}
Link to comment
Share on other sites

Oi;

Obrigado pelas dicas;

Esta função já sofreu umas alterações visto que numa fase chego a ter 8 questões e não ia repetir as condições ou senão tornava-se um programa muito extenso,

Criei uma função só para ler e validar resposta que é esta.

int jogo1Gp1(FILE *f, int res1)
{
   struct perg p;
   int resposta;
   system("cls");
   printf ("\n*=============================================================================*\n");
   printf ("|						  >>>>Escolha Multipla<<<<						    |\n");
   printf ("*=============================================================================*\n");
   fseek(f, res1 * sizeof p, SEEK_SET);
   fread(&p, sizeof p, 1, f);
   printf("\nPergunta : %s", p.ques);
   printf("\nOpcao 1 : %s",p.op1);
   printf("\nOpcao 2 : %s",p.op2);
   printf("\nOpcao 3 : %s",p.op3);
   printf("\nOpcao 4 : %s",p.op4);
   printf("\nResposta correta?\n");
   scanf("%d", &resposta);
   getchar();
   if(resposta==p.res)
   return 1;
   else
   return 0;
}

Depois de passar esta fase a outra função vai chamar esta que onde deve transitar o valor de result.

int gp2_Ques(struct gp2 *p, char *usr1, int *result)
{
   FILE *f; //apontador para ficheiro
   f=fopen("gp2.dat", "rb"); //abertura do ficheiro
   int reg=0,reg1; //Variaveis contadoras de perguntas e random
   int random; // Variável de random
   rewind(f); //retorna a posição corrente do ficheiro para o início
   srand(time(NULL)); //função random
   system("cls");
   fseek(f, 0, SEEK_END);
   reg=ftell(f) /sizeof *p;
   fseek(f, 0 , SEEK_SET);
   if (reg<=0) //condição que verifica se existem registos
   {
    printf ("Sem registos \n");
    printf ("\n Necessario ter registos para jogar...\n");
    return 0;
    }
    else
    {
	    printf ("\n*=============================================================================*\n");
	    printf ("|						   >>>>Facto ou Ficcao<<<<						    |\n");
	    printf ("*=============================================================================*\n");
	    printf ("																			   \n");
	    printf ("\n	  Traz da outra fase: %d pontos \n",*result); //conta as perguntas
	    printf ("\n	  TOTAL de perguntas: %d \n",reg); //conta as perguntas
	    printf ("\n	  O seu score maximo sera: 3 \n"); //pontuação máxima do jogo
	    printf ("																			   \n");
	    printf ("*=============================================================================*\n");
	    Sleep(3000);
	    random=rand()%reg; //função random
	    reg1 = random; //atribui a variavel reg o valor de random
	    if ( jogo1Gp2(f,reg1) )
	    {
		    printf("\nAcertou na resposta...\n");
		    *result++;
		    random=rand()%reg;//função random
		    printf("Atencao a proxima pergunta...\n");
		    Sleep(2000);
		    if ( jogo1Gp2(f,random))
		    {
			    printf("\nAcertou novamente na resposta...\n");
			    *result *=2;
		    }
		    else
		    {
			    printf("Resposta errada....foi eliminado ");
			    Sleep(2000);
			    system("cls");
			    jogo();
		    }
	    }
	    else
	    {
		    printf("\nResposta errada....foi eliminado ");
		    Sleep(2000);
		    system("cls");
		    jogo();
	    }
    }
    if (result>=6)
    {
	    printf("\nTem um total de %d pontos", *result);
	    printf("\nVai passar para a fase 3...aguarde \n");
	    Sleep(2000);
	    gp3_Ques(&p, usr1, result);
    }
    else
    {
	    printf("Nao atingiu o minimo para seguir....vai voltar ao menu anterior");
	    Sleep(2000);
	    system("cls");
	    jogo();
    }
    fclose(f);
    return 0;
}

Com as alterações sugeridas aparece-me este warning

warning: value computed is not used [-Wunused-value]|

printf("\nAcertou na resposta...\n");
		    *result++;
		    random=rand()%reg;//função random

E quando executado em vez de me dar 6, dá-me 14...

gmc11

 

Link to comment
Share on other sites

Pode ser isto... Como te disse não testei. Não sei de cor como o compilador interpreta isto, se (*result)++ se *(result++), mas o que queremos é a primeira, por isso não perdes nada em forçá-la, como o Hyppo sugeriu.

http://en.cppreference.com/w/cpp/language/operator_precedence

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Afinal HHH tinha toda a razão...novamente 😁 :cheesygrin:

A contagem está correta agora.

Ao passar para a terceira fase é que já não visto que já não me dá o user nem o valor certo do result, mantenho na mesma o que fiz na função 2

gp3_Ques(usr1, &result);

e a nova função tem

int gp3_Ques(char *usr1, int *result)
{
   system("cls");
   printf ("\n*=============================================================================*\n");
   printf ("|                           >>>>Facto ou Ficcao<<<<                            |\n");
   printf ("*=============================================================================*\n");
   printf ("                                                                               \n");
   printf ("\n      Esta no bom caminho %s \n",usr1);
   printf ("\n      Traz da outra fase: %d pontos \n", *result); //conta as perguntas
   printf ("\n      TOTAL de perguntas:  \n"); //conta as perguntas
   printf ("\n      O seu score maximo sera: 3 \n"); //pontuação máxima do jogo
   printf ("                                                                               \n");
   printf ("*=============================================================================*\n");
   Sleep(3000);
   //jogo1Gp3(num);
   return 0;
}

Não deveria passar os argumentos tal e qual como na função anterior?

O user aparece carateres estranhos...o result um endereço de memória o que acho estranho visto que ter valor 6 para transitar para outra fase.

Edited by pmg
LP adicionada aos GeSHis
gmc11

 

Link to comment
Share on other sites

A string é impressa e o valor está correto

	if (*result>=6)
	{
		printf("\nTem um total de %d pontos", *result); //impressão da string - O valor dá certo
		printf("\nVai passar para a fase 3...aguarde \n");
		Sleep(2000);
		gp3_Ques(usr1, &result);
	}

Ao entrar na fase 3 é que já não

Edited by alphasil
gmc11

 

Link to comment
Share on other sites

Não há meio de por isto a dar na função 3

Passo isso para a função 3

gp3_Ques(usr1, *result, *total_perg, *certas, *erradas);

Função 3

int gp3_Ques(char *usr1, int *result, int num[], int n, int *total_perg,int *certas,int *erradas)

se ponho

Traz da outra fase: %d pontos \n", *result);

Tenho isto

warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat]|

Já estive a procurar, a pesquisar e não vejo a solução

Teria lógica criar um apontador nesta função e atribuir a esse apontador o valor de *result e trabalhar com esse apontador até ao final da função e depois atribuir o valor do apontador criado ao *result?

gmc11

 

Link to comment
Share on other sites

A tua chamada da função gp3_Ques não corresponde ao protótipo da mesma; basta contar o número de virgulas entre os parênteses.

Mesmo que os parâmetros adicionais fossem passados o tipo do 'result', por exemplo, está mal.

Se queres alterar o valor duma variável passada como parâmetro a uma função tens de chamar a função com o endereço da variável e declará-la (a função) como recebendo um ponteiro para o tipo da variável. Assim para receber e alterar um parâmetro de tipo 'int' tens de fazer:

void funcao(int * param)
{
 *param = 1;
}

int main(void)
{
 int valor = 0;

 funcao(&valor);  /* Após a execução da função a variável local 'valor' terá o valor 1 */
}

Vê lá se percebes a mecânica disto.

Edited by bsccara
Link to comment
Share on other sites

Não há meio de por isto a dar na função 3

Passo isso para a função 3

gp3_Ques(usr1, *result, *total_perg, *certas, *erradas);

Função 3

int gp3_Ques(char *usr1, int *result, int num[], int n, int *total_perg,int *certas,int *erradas)

se ponho

Traz da outra fase: %d pontos \n", *result);

Tenho isto

warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *' [-Wformat]|

Já estive a procurar, a pesquisar e não vejo a solução

Teria lógica criar um apontador nesta função e atribuir a esse apontador o valor de *result e trabalhar com esse apontador até ao final da função e depois atribuir o valor do apontador criado ao *result?

Já te tinha dito isto antes... Se a tua q3 recebe um apontador para inteiro, e tu a chamas na q2, onde result já é um apontador para inteiro, usas a variavel directamente:

gp3_Ques(usr1, result,...);

Não completei a chamada da função, porque, como disse o bsccara, tens o número de argumentos diferente na chamada e no protótipo. Além disso não sei de onde vêm as variáveis que estás a passar, mas dificilmente estão correctas na chamada...

De uma forma básica:

Se tens uma função que recebe um apontador para um tipo A:

B funcao(A *param);

Se tens uma variável, na função que chama esta outra do tipo:

A myvar;

Então :

funcao(&myvar);

Se tens uma variavel que já é um apontador para A:

A *myvar

Então:

funcao(myvar);

Se a tua função recebe um A:

B funcao(A param);

E tens uma variável do tipo apontador para A, Então:

A* myvar;

funcao(*myvar);

Quando disse que não estás a imprimir a string referia-me ao nome do utilizador. Imprime-o na q2 para ver se aí já está bem ou mal. Não vejo nada de errado com ele na q2, logo penso que já irá mal detrás.

Edited by Flinger
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
×
×
  • 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.