Jump to content

Utilizar variável em função que retorne valor!


Recommended Posts

Posted (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 by thoga31
GeSHi
Posted

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!

Posted (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 by thoga31
GeSHi
Posted (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 by thoga31

Knowledge is free!

Posted

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!

Posted

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.

  • Vote 1
Posted

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;
}
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Posted (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 by thoga31
GeSHi
Posted (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 by Flinger
Posted (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 by thoga31

Knowledge is free!

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.