Passagem de int para void *

1. Passagem de int para void *

Perfil removido
removido

(usa Nenhuma)

Enviado em 27/02/2014 - 18:23h

Galera é o seguinte eu tenho o seguinte código:

#include <iostream>

using namespace std;


int coint(void* i)
{
int x=*(int*)(&i);

cout<<"\n"<<x<<endl;

}


int number(int (*foo)( void*), void*i)
{
foo(i);


}




int main()
{
int arg=0;
cout<<"\nEntre com um número:\n";
cin>>arg;




number(coint,(void *)arg);




return 0;
}

E quando eu compilo ele me retorna o seguinte aviso:
main.cpp: In function ‘int main()’:
main.cpp:34:24: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
number(coint,(void *)arg);

Mas sem em vez de eu colocar int arg=0 e por long int arg=0 ele compila na boa sem avisos!O que eu gostaria de saber é o porque disso.E eu estou usado o Debian GNU/linux de 64-bits.



  


2. Re: Passagem de int para void *

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/02/2014 - 07:29h

O porquê disso é justamente a sua última frase, que informa que você está usando Debian de 64 bits.

Ocorre que, por padrão, na plataforma amd64 os inteiros sem a qualificação long têm representação em 32 bits, enquanto os ponteiros são de 64 bits -- como convém a uma máquina com 64 para endereços. Ao converter do menor para o maior, o compilador lhe avisa que o ponteiro pode ficar com um valor não confiável, porque faltam informações dos bits mais significativos.

Fora isso, eu tenho uma dúvida sobre o seu código. Na função coint(), você faz um cast sobre o endereço da variável i, e não sobre o valor com o qual a função foi chamada. Tem certeza de que é isso mesmo que você quer?


3. Re: Passagem de int para void *

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/02/2014 - 21:33h

Qual a utilidade de um ponteiro void, em uma função cujo próprio nome referencia um número??


4. Re: Passagem de int para void *

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/03/2014 - 08:30h

Esse código é só para eu treinar conversões de ponteiros e tambem treinar um pouco a implemntação de funções de pointeiros.Simplesmente esse código é para fim de testes!


5. Re: Passagem de int para void *

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/03/2014 - 23:01h

Ah, então tá certo!

Mas como tudo na memória não se passa de sequências de bytes, veja um exemplo.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void* FloatToChar(void *n, int size){
char *ptr;
ptr = malloc(size);
memcpy(ptr, n, size);
return ptr;
}

int main(){

float n = 3.14;
float *ret;
//casting...
ret = (float*)castFloatToChar(&n, sizeof(float));

printf("Ret: %.2f\n",*ret);

return 0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts