Loki Posted February 22, 2014 at 08:25 PM Report #546195 Posted February 22, 2014 at 08:25 PM (edited) Boas pessoal. Tenho uma duvida, eu queria colocar uma variavel numa função que me fosse incrementando +1 consoante fosse encontrando 0(zeros) dentro de uma matriz a função que criei foi esta: int GameOver(int N, int M,int count, int **m){ int l,c; for(l = 0; l < N; l++) for(c = 0; c < M; c++) if(m[l][c]==0 || m[l][c]==7){ count++;} } eu tentei utilizar o [count] para o efeito mas não está a funcionar, o que eu fiz para determinar se o jogo acabou foi: if (GameOver(N, M, count, m)== countA)(este countA era o que entrava na função){ printf("GAMEOVER"); } Não sei se me expliquei muito bem, mas se alguma alma caridosa poder dar uma ajuda agradecia. Cumps pessoal. Edited February 22, 2014 at 08:36 PM by thoga31 GeSHi
thoga31 Posted February 22, 2014 at 08:49 PM Report #546209 Posted February 22, 2014 at 08:49 PM Explica melhor o que queres. Tu queres que a função conte o número de zeros (até aqui tudo bem), mas essa informação deve ser guardada numa variável que é passada por referência? Explica aquele "countA era o que entrava na função" - entrava na função? Duas coisas: 1) Quando defines uma função não-void, ela deve ter um valor de retorno do tipo dela. Por exemplo, neste caso deve retornar um int. 2) Nestes casos tens duas opções de devolver a informação pretendida: ou devolves o resultado através de return, ou colocas o resultado numa variável passada por referência. A não ser que precises mesmo muito de passagem por referência, eu utilizaria return. Knowledge is free!
Loki Posted February 22, 2014 at 09:40 PM Author Report #546230 Posted February 22, 2014 at 09:40 PM (edited) Sim essa parte do retorno da função teria que colocar um int e não um void Quanto ao resto a passagem por referência referes-te a utilizar um pointer certo? Outra questão o return permite-me incrementar a variavel fora da função? O [countA] era a que eu passava para dentro da função quando a chamo, ou seja GAMEOVER(N,M,countA,mA) eu enganei-me aqui: if (GameOver(N, M, count, m)== countA)(este countA era o que entrava na função){ printf("GAMEOVER"); } Era assim: if (GameOver(N, M, countA, m)== multy)(este countA era o que entrava na função através do [count]){ printf("GAMEOVER"); } Edited February 22, 2014 at 09:42 PM by thoga31 GeSHi
thoga31 Posted February 22, 2014 at 09:50 PM Report #546238 Posted February 22, 2014 at 09:50 PM O return só faz uma coisa: devolve um resultado. Portanto, tu queres que countA fique com o resultado da contagem? Knowledge is free!
Loki Posted February 22, 2014 at 09:59 PM Author Report #546241 Posted February 22, 2014 at 09:59 PM sim, cada vez que lá vai se existir mais um zero do que os que lá estavam ele acrescenta mais 1 á contagem.
thoga31 Posted February 22, 2014 at 10:03 PM Report #546242 Posted February 22, 2014 at 10:03 PM (edited) Portanto, countA é um contador cumulativo. Ele pode ter o valor 5 quando "entra" na função, encontram-se dois zeros, e sai de lá com 7. É isto? void foo(int *a) { (*a)++; } int main(void) { int bar = 5; foo(&bar); printf("%d", bar); // bar = 6 return 0; } Edited February 22, 2014 at 10:03 PM by thoga31 Knowledge is free!
Loki Posted February 22, 2014 at 10:06 PM Author Report #546243 Posted February 22, 2014 at 10:06 PM sim é isso mesmo. mas não tenho que o declarar como pointer no main?
thoga31 Posted February 22, 2014 at 10:07 PM Report #546245 Posted February 22, 2014 at 10:07 PM Não. Na função, o teu argumento está a receber uma referência (um endereço). Na chamada da função, tu estás a fornecer o endereço de "bar". A isto se chama passagem por referência. Tu referencias uma variável, esta não tem de ser um apontador. 😉 Knowledge is free!
Loki Posted February 22, 2014 at 10:09 PM Author Report #546246 Posted February 22, 2014 at 10:09 PM referia-me ao BAR, esquecime de dizer. Ah ok já entendi, obrigado pela ajuda foi uma grande ajuda estava a bater neste problema á uns dias. 👍
thoga31 Posted February 22, 2014 at 10:10 PM Report #546248 Posted February 22, 2014 at 10:10 PM (edited) De nada 😉 Edited February 22, 2014 at 10:10 PM by thoga31 1 Report Knowledge is free!
Flinger Posted February 24, 2014 at 10:15 AM Report #546434 Posted February 24, 2014 at 10:15 AM Já agora só mais uma dica. Podes usar tanto a passagem por referência como o retorno da função, o que te permite fazer algo como: int foo(int *a) { (*a)++; return *a; } int main(void) { int bar = 5; while(foo(&bar)!=8) printf("%d\n", bar); printf("%d - terminou\n",bar) return 0; } O valor continua a ser armazenado na tua variável, mas também é retornado, pelo que podes usar o retorno da função para fazer comparações. 1 Report
HappyHippyHippo Posted February 24, 2014 at 10:35 AM Report #546437 Posted February 24, 2014 at 10:35 AM já que estamos na área de notas 😄 Podes usar tanto a passagem por referência como o retorno da função é uma solução, mas é mais convencional usar o valor de retorno como indicador do sucesso da função. não quer dizer que a solução de retornar o valor esteja errada, somente que esse valor de retorno pode ser usado para retornar informação mais útil que de outra forma complicaria o código. exemplo: int foo(int *a) { if (a == NULL) return -1; (*a)++; return 0; } int main(void) { int bar = 5; printf("resultado : %s\n", foo(&bar) == 0 ? "SUCESSO" : "ERRO"); printf("resultado : %s\n", foo(NULL) == 0 ? "SUCESSO" : "ERRO"); return 0; } 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Loki Posted February 24, 2014 at 02:04 PM Author Report #546471 Posted February 24, 2014 at 02:04 PM (edited) Eu utilizei o o toupper, mas sinseramente não entendi como ele funciona, se alguém me podesse explicar a coisa assim melhor eu agradecia. Ficou assim e funciona bem. if(sub<4){ do{ printf("\n\nColoque os Submarino\n"); printf("Digite as coordenadas(EX:a5 ou A5)\n"); printf("Coordenada: "); scanf(" %c", &linha); p=toupper(linha); l=Caracteres(p); scanf("%d",&c); c=c-1; if (l>N || l<0|| c>N || c<0 || m[l][c]!=0){ printf("\nExcedeu o limite da grelha,\nou colocou um barco onde já existia um!!\n\n"); }else{ m[l][c]=1; sub++; } ApresentaMatrixHumano(N , M, m); }while(sub<4); } que acham? Edited February 24, 2014 at 03:46 PM by thoga31 GeSHi
Flinger Posted February 24, 2014 at 02:42 PM Report #546474 Posted February 24, 2014 at 02:42 PM (edited) http://linux.die.net/man/3/toupper Mais uma dica: se pesquisares "man nome_da_função" no google encontras a pagina do man na net. O mané um utilitário dos sistemas *nix que contém múltiplos tópicos de ajuda, quer sobre bibliotecas e utilitários do sistema, quer sobre o sistema em si e standards. Antes da existência da Internet era a ferramenta mais valiosa para um programador em ambientes Unix. Quanto ao teu programa, não tens validação do input do utilizador. Por exemplo, o que acontece se o utilizador introduzir 2 números, em vez de uma letra e um número. é uma solução, mas é mais convencional usar o valor de retorno como indicador do sucesso da função. não quer dizer que a solução de retornar o valor esteja errada, somente que esse valor de retorno pode ser usado para retornar informação mais útil que de outra forma complicaria o código. Concordo plenamente, mas como o exemplo é muito simples, existe pouca coisa que possa correr mal dentro da função, à excepção de o apontador ser nulo 😄 Nesse caso, passar um apontador nulo é um erro de palmatória 😛 . O mais certo é passar um apontador inválido, o que não é possível "apanhar", e que vai provocar erros no programa mais cedo ou mais tarde. De qualquer forma, concordo contigo, essa forma é a mais convencional. Edited February 24, 2014 at 02:46 PM by Flinger
thoga31 Posted February 24, 2014 at 04:14 PM Report #546492 Posted February 24, 2014 at 04:14 PM (edited) Uma vez que o C tem algumas particularidades na atribuição, eu não recorro muito à passagem por referência. Faço antes isto: int foo(int n) { return ++n; } int main(void) { int bar; printf("%d", 4 == (bar = foo(3)) ? bar : -1); return 0; } Claro que nem sempre se torna útil, mas para estes pequenos casos serve bem o propósito 😄 Edited February 24, 2014 at 04:14 PM by thoga31 Knowledge is free!
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