2013-06-11 2 views
1

J'ai une valeur que je reçois dans un tableau d'octets non signé que je souhaite déréférencer comme un flottant. Prenez ptr comme uint8_t * pointant sur un tableau d'octets de quatre valeurs 0,0,0xCD, 0x42 (c'est un petit système endian).Pointeur de déréférencement dans Code Composer Studio

float val = *(float*)ptr; 

est retour -1.34e8

Quand je tape:

*(float*)ptr; 

Dans la fenêtre des expressions après avoir atteint un point de rupture dans cette partie du code, il me donne 102,5 comme prévu. De plus, quand je tape:

*(float*)(ptr - 1); 

je reçois le -1.34e8 incorrect, comme si le compilateur utilisé PTR - 1 au lieu de ce que je tapais.

Je suis confus - ai-je oublié quelque chose ici?

+0

Fondamentalement, le deref est correct. si vous printf ("% p", ptr); avez-vous une adresse qui n'est peut-être pas alignée sur 4 octets (ou au moins sur 2 octets)? (Cela peut être nécessaire sur certaines plates-formes). Et btw, (ptr-1) est un octet de retour (parce que c'est un uint8_t *), pas l'habituel retour en arrière d'une taille float. – QSQ

+0

Oui c'est la chose étrange. ptr - 1 est un octet de retour, donc c'est comme si mon code original * (float *) ptr; regarde un octet en arrière et interprète les quatre octets flottants à partir de là au lieu de ptr. Mon point était que lorsque le code a été arrêté dans le débogueur, * (float *) ptr me donne ce que je m'attendais à obtenir à l'exécution, et * (float *) (ptr-1) me donne ce que j'ai réellement obtenu à l'exécution. – ace

+1

peut-être que le compilateur arrondit la valeur ptr s'il n'est pas aligné correctement. essayez printf ("% p", ptr); dans la source, puis vérifiez si le résultat est le même que celui que le débogueur vous donne (il suffit d'imprimer le pointeur lui-même dans le dbg). – QSQ

Répondre

2

Fondamentalement, le deref est correct.

Si vous avez printf("%p", ptr); obtenez-vous une adresse qui n'est peut-être pas alignée sur 4 octets (ou alignée sur au moins 2 octets)? Cela peut être nécessaire sur certaines plates-formes.

Pour le test, transmettez simplement la valeur d'un réel float dans uint8_t *, par ex.

float f= 102.5; 
yourfunct((uint8_t*)&f); 

et de voir si cela fonctionne.

0
*(float*)(ptr - 1); 

est le même que celui

ptr--; //move the pointer to point to charackter in front of the previous one 
*(float*)ptr; 

Est-ce votre intention? Ou voulez-vous simplement soustraire 1 de la valeur pointée sur ptr.

+0

Je ne veux pas m'en soustraire.Ce que je disais c'est que pendant l'exécution, déréférencer ptr comme un flottant agit comme si j'avais déréférencé le pointeur en arrière d'un octet. – ace

Questions connexes