Ir ao conteúdo
  • Cadastre-se
Pedro Aldá

Trabalhando com stdbool.h

Recommended Posts

Olá computeiros,

 

Estava eu fazendo trabalho de criptografia e me deparei com um situação que eu não entendi...Segue o código.
 

#include <stdio.h>
#include <stdbool.h>

void teste(bool *v[2][2]){

    printf("%d %d\n%d %d\n\n",&(v[0][0]),&(v[0][1]),&(v[1][0]),&(v[1][1]));
}


int main (void){
    bool v[2][2] ={{0,0},{0,0}};
    teste(v);
    printf("%d %d\n%d %d\n",&(v[0][0]),&(v[0][1]),&(v[1][0]),&(v[1][1]));
    return;
}

Ocorre que a saída do programa foi:

6356748 6356752
6356756 6356760

6356748 6356749
6356750 6356751

Os prints não deveriam ser iguais?:huh:

 

Queria mandar um beijo especialmente para minha mãe!

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está mandando um tipo diferente do que é esperado pela função, pois na função a variável declarada é *v[2][2], mas no main a variável é v[2][2].

 

Para obter o resultado correto o código deve ser assim:

#include <stdio.h>
#include <stdbool.h>

void teste(bool v[2][2]){

    printf("%d %d\n%d %d\n\n",&(v[0][0]),&(v[0][1]),&(v[1][0]),&(v[1][1]));
}


int main (void){
    bool v[2][2] ={{0,0},{0,0}};
    teste(v);
    printf("%d %d\n%d %d\n",&(v[0][0]),&(v[0][1]),&(v[1][0]),&(v[1][1]));
    return;
}

Com tipo compatível na função com o que é enviado pelo main().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faltaria dizer que o processo de passar uma matriz é ligeiramente distinto ao de passar um vetor. Ao passar v, como no exemplo de isrnick, para a função teste, você realmente está passando um ponteiro. É possível averiguar o anterior dito fazendo printf("%d\n", v), tanto como printf("%d", &(v[0][0])), o que será impresso é a direção do primeiro elemento da matriz(mesmo resultado). Que quer dizer isso...? Que realmente nunca se passa uma copia e sim uma referencia!
Existem algumas formas de passar uma cópia de uma matriz... como por exemplo enviando a matriz dentro de uma estrutura, mas realmente é mais bem como fazer uma gambiarra.
Se pensamos um pouco passar uma matriz no ponto de vista da eficiência é algo sem sentido, pois matrizes podem ser grandes volumes de dados, passar uma matriz GIGANTE por copia faria com que seu programa ficasse lento e ocupasse muita memória, para isso é melhor trabalhar com referencia. Certo?! Pense... Realmente você precisa passar uma matriz por cópia? Certamente não. >_<

No seu exemplo você está esperando uma matriz de ponteiros a boleanos. Para você fazer uma ideia é como se dentro de main você tentar fazer isso:
bool b1 = true;
bool b2 = false;
bool *v[2][2];
v[0][0] = &b1;
v[0][1] = &b2;
...
Um pouco sem sentido não é?
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×