récupération dans un entier de l'adresse d'un objet

syracuse900
récupération dans un entier de l'adresse d'un objet

Bonjour à tous,
pour des raisons de programmation je voudrais récupérer l'adresse d'un objet dans une variable de type int ou long. je voudrais savoir si cela est possible.
j'ai un objet ev

Event ev= new Event();
int taille = sizeof(ev); /// la taille est de 4 octets
int ad = &ev;

lorsque je programme cela, j'ai une erreur.
Pourriez vous me dire si ce que je tente de faire est faisable ?? et si oui, comment ???
merci de vos aides

fredericmazue

Bonjour,

Quote:

lorsque je programme cela, j'ai une erreur.

Une erreur dis tu ? Moi j'en vois plusieurs. Bon prenons dans l'ordre

Quote:

pour des raisons de programmation je voudrais récupérer l'adresse d'un objet dans une variable de type int

Pardonne moi, mais tes raisons sont mauvaises. C'est de très mauvais aloi de vouloir ranger un pointeur dans un int, c'est même un des principales raisons qui font que ton compilateur exprime son mécontement.

Quote:

Event ev= new Event();

Déjà, avant même d'aborder ton problème, cette ligne est fausse. Ce doit être

Event* ev = new Event();

ou bien

Event *ev = new Event()

Quote:

int taille = sizeof(ev); /// la taille est de 4 octets

4 octets c'est toi qui le dit. Enfin oui c'est ton compilateur via sizeof qui le dit :)
Mais il n'est pas garanti que ce sera vrai sur toutes les architectures, dont déjà tu es certain d'écrire du code non portable (au niveau source je veux dire)

Quote:

int ad = &ev;

Encore faux. Puisque tu as utilisé l'opérateur new, ev est un pointeur. donc &ev c'est l'adresse du pointeur et non l'adresse de l'objet de type Event. Donc ce n'est pas ce que tu veux faire. Le code correct serait (je dis bien "serait")

int ad = ev;

Mais de toutes façons ce sera refusé par le compilateur qui te dira qu'il ne peut affecter un int avec un pointeur justement parce qu'il n'y a aucune garantie que ces deux types soient de la même taille.

Pour répondre à ta question, tu peux le faire. En C++ on peut tout faire, ce qui ne veut pas dire que tout doit être fait. Pour faire ce que tu veux tu dois employer le transtypage le plus violent, qui revient à dire au compilateur "tais toi je sais ce que je fais". Voici donc un code qui compile:

Event* ev = new Event();
int ad = reinterpret_cast<int>(ev);

Mais le compilateur et moi pensons que tu ne sais pas ce que tu fais... ;)

Au fait c'est pour quoi faire, qu'elles sont tes "raisons" ?
Je demande parce que C++ supporte l'arithmétique de pointeurs (on le lui reproche assez d'ailleurs) Donc si jamais tu voulais faire des calculs sur des adresses/pointeurs, tu pourrais le faire directement, sans ranger tout ça dans des int.