alphasil Posted June 15, 2012 at 10:38 AM Report Share #463013 Posted June 15, 2012 at 10:38 AM (edited) 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 June 15, 2012 at 10:40 AM by alphasil gmc11 Link to comment Share on other sites More sharing options...
Flinger Posted June 15, 2012 at 10:54 AM Report Share #463016 Posted June 15, 2012 at 10:54 AM gp2_Ques(&p, usr1, result); Se result tiver declarado como um iinteiro, então tens de passar à função &result. Link to comment Share on other sites More sharing options...
KiNgPiTo Posted June 15, 2012 at 10:56 AM Report Share #463017 Posted June 15, 2012 at 10:56 AM Para estares a mudar o valor de result por isso tens de fazer *result = ... Mas onde estás a chamar a função deves passar o endereço de um int se o tiveres declarado dessa forma. //Aqui chamo a nova função int result; gp2_Ques(&p, usr1, &result); //result é para transportar o valor apurado printf("%d", result); Link to comment Share on other sites More sharing options...
Flinger Posted June 15, 2012 at 11:02 AM Report Share #463021 Posted June 15, 2012 at 11:02 AM (edited) 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 June 15, 2012 at 11:05 AM by Flinger Link to comment Share on other sites More sharing options...
alphasil Posted June 15, 2012 at 01:13 PM Author Report Share #463065 Posted June 15, 2012 at 01:13 PM 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 More sharing options...
Flinger Posted June 15, 2012 at 01:42 PM Report Share #463077 Posted June 15, 2012 at 01:42 PM 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 More sharing options...
alphasil Posted June 15, 2012 at 02:48 PM Author Report Share #463101 Posted June 15, 2012 at 02:48 PM 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 More sharing options...
HappyHippyHippo Posted June 15, 2012 at 02:52 PM Report Share #463104 Posted June 15, 2012 at 02:52 PM - em que linha dá o warning (não é erro) - em que sítio te dá 14 e porque razão devia te dar 6 ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Flinger Posted June 15, 2012 at 02:57 PM Report Share #463107 Posted June 15, 2012 at 02:57 PM Com as alterações sugeridas aparece-me este warning warning: value computed is not used [-Wunused-value]| Em que linha te dá o warning? printf("\nAcertou na resposta...\n"); *result++; random=rand()%reg;//função random E quando executado em vez de me dar 6, dá-me 14... Onde é que estás a ver esse resultado? Link to comment Share on other sites More sharing options...
alphasil Posted June 15, 2012 at 03:01 PM Author Report Share #463110 Posted June 15, 2012 at 03:01 PM Dá na linha do *result++; Vejo o resultado quando faço o printf if (result>=6) { printf("\nTem um total de %d pontos", *result); printf("\nVai passar para a fase 3...aguarde \n"); Sleep(2000); } Perto do fiim da funçao gp2_Ques() gmc11 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 15, 2012 at 03:04 PM Report Share #463113 Posted June 15, 2012 at 03:04 PM (edited) responde-me : nesta instrução *result++; o que é feito primeiro, o ++ ou o * ? já tentaste (*result)++; Edited June 15, 2012 at 03:04 PM by HappyHippyHippo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Flinger Posted June 15, 2012 at 03:08 PM Report Share #463114 Posted June 15, 2012 at 03:08 PM já tentaste (*result)++; 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. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 15, 2012 at 03:15 PM Report Share #463119 Posted June 15, 2012 at 03:15 PM 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 Portugol Plus Link to comment Share on other sites More sharing options...
alphasil Posted June 15, 2012 at 03:53 PM Author Report Share #463133 Posted June 15, 2012 at 03:53 PM Para incrementar a variável tenho de usar o (*result)++ Se usar result++; incrementa os bytes na memória Vou testar a tua pick HHH, mais uma vez obrigado gmc11 Link to comment Share on other sites More sharing options...
alphasil Posted June 15, 2012 at 04:35 PM Author Report Share #463142 Posted June 15, 2012 at 04:35 PM (edited) 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 June 15, 2012 at 05:10 PM by pmg LP adicionada aos GeSHis gmc11 Link to comment Share on other sites More sharing options...
Flinger Posted June 15, 2012 at 05:35 PM Report Share #463150 Posted June 15, 2012 at 05:35 PM (edited) Chamas a terceira fase a partir da segunda, logo a variavel result já é um int *: gp3_Ques(usr1, result); Quanto à string, não a imprimes na fase 2. Experimenta imprimi-la aí a ver se já vem mal detrás. Edited June 15, 2012 at 05:41 PM by Flinger Link to comment Share on other sites More sharing options...
alphasil Posted June 15, 2012 at 05:58 PM Author Report Share #463155 Posted June 15, 2012 at 05:58 PM (edited) 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 June 15, 2012 at 05:58 PM by alphasil gmc11 Link to comment Share on other sites More sharing options...
alphasil Posted June 17, 2012 at 04:29 PM Author Report Share #463472 Posted June 17, 2012 at 04:29 PM 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 More sharing options...
bsccara Posted June 17, 2012 at 11:32 PM Report Share #463554 Posted June 17, 2012 at 11:32 PM (edited) 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 June 17, 2012 at 11:32 PM by bsccara Link to comment Share on other sites More sharing options...
Flinger Posted June 18, 2012 at 08:38 AM Report Share #463578 Posted June 18, 2012 at 08:38 AM (edited) 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 June 18, 2012 at 08:39 AM by Flinger Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now