OVH Cloud OVH Cloud

(int)pointeur???

4 réponses
Avatar
Pascal
Bonjour,

Dans un code que j'ai récupéré il y a une variable pointeur déclarée comme
ceci : int *pt

à un moment dans le code il est fait

var=(int)pt

En faisant tourner au débugger je vois que var vaut 1024 mais pourquoi?

Merci

4 réponses

Avatar
Samuel Krempp
le Tuesday 25 May 2004 14:43, écrivit :

Bonjour,

Dans un code que j'ai récupéré il y a une variable pointeur déclarée comme
ceci : int *pt

à un moment dans le code il est fait

var=(int)pt

En faisant tourner au débugger je vois que var vaut 1024 mais pourquoi?


parceque c'est aussi bien que 42. ou 4242. ou 4242424..

plus sérieusement, tel quel ya pas grd chose à dire. Il me semble que la
conversion est effectivement possible, et la seule utilité est de faire de
l'arithmetique de pointeurs. (je pourrais tres bien me tromper, je fais
jamais ce genre de conversion)

qu'est ce qui est fait de cette valeur entière ?

--
Sam

Avatar
Pascal
En fait voici le code exacte.

/* Check for aligned word */
if(((int)ProgAdr & 0x0001) != 0)
{
return(FALSE);
}

ProgAdr est un pointeur sur un int
Ca sert à tester si on peut écrire dans une EEPROM. Si ca passe ca lance la
procédure d'écriture.

Je ne comprends pas du tout l'interet du test

Merci

"Samuel Krempp" a écrit dans le
message de news:40b3689c$0$6343$
le Tuesday 25 May 2004 14:43, écrivit :

Bonjour,

Dans un code que j'ai récupéré il y a une variable pointeur déclarée
comme


ceci : int *pt

à un moment dans le code il est fait

var=(int)pt

En faisant tourner au débugger je vois que var vaut 1024 mais pourquoi?


parceque c'est aussi bien que 42. ou 4242. ou 4242424..

plus sérieusement, tel quel ya pas grd chose à dire. Il me semble que la
conversion est effectivement possible, et la seule utilité est de faire de
l'arithmetique de pointeurs. (je pourrais tres bien me tromper, je fais
jamais ce genre de conversion)

qu'est ce qui est fait de cette valeur entière ?

--
Sam



Avatar
Brieuc Jeunhomme
ProgAdr est un pointeur sur un int
Ca sert à tester si on peut écrire dans une EEPROM. Si ca passe ca lance la
procédure d'écriture.

Je ne comprends pas du tout l'interet du test


Je suppose que la procédure d'écriture doit faire des copies depuis la
mémoire vive, avec des choses du genre:

while( ProgAdr < foo ) *bar++ = *ProgAdr++;

Bref, elle doit déréférencer progaddr, et, si progaddr ne pointe pas sur
une adresse multiple de la taille d'un entier, ça passe sur un intel et
peut-être quelques autres, mais sur la plupart des processeurs, ça
crashe. L'effet du test ( ( (int)ProgAdr ) & 1 ) != 0 est de s'assurer
que ProgAdr pointe bien sur un multiple de deux octets, et que donc, les
accès réalisés par la procédure de copie seront bien alignés sur 16
bits.

--
BBP

Avatar
Pascal
Ok merci j'ai compris



"Brieuc Jeunhomme" a écrit dans le message de
news:
ProgAdr est un pointeur sur un int
Ca sert à tester si on peut écrire dans une EEPROM. Si ca passe ca
lance la


procédure d'écriture.

Je ne comprends pas du tout l'interet du test


Je suppose que la procédure d'écriture doit faire des copies depuis la
mémoire vive, avec des choses du genre:

while( ProgAdr < foo ) *bar++ = *ProgAdr++;

Bref, elle doit déréférencer progaddr, et, si progaddr ne pointe pas sur
une adresse multiple de la taille d'un entier, ça passe sur un intel et
peut-être quelques autres, mais sur la plupart des processeurs, ça
crashe. L'effet du test ( ( (int)ProgAdr ) & 1 ) != 0 est de s'assurer
que ProgAdr pointe bien sur un multiple de deux octets, et que donc, les
accès réalisés par la procédure de copie seront bien alignés sur 16
bits.

--
BBP