pb débile

Le
fabrizio
désolé je toruvais pas de titre pour un truc aussi

uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
section_length |= *(TSpacket+offsetPAT+2);
printf("section length: %x",section_length);

section length: ffb0


char tmp;
uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
tmp = *(TSpacket+offsetPAT+2);
section_length |= tmp;
printf("section length: %x",section_length);

section length: b0


le second est le bon .
pouvez-vous me dire comment se passer de cette variable temporaire ?
et donc quelle erreur je fais dans la premiere version.

par avance merci
fabrice
Vos réponses
Trier par : date / pertinence
Pierre Maurette
Le #896127
fabrizio
désolé je toruvais pas de titre pour un truc aussi...

uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
section_length |= *(TSpacket+offsetPAT+2);
printf("section length: %xn",section_length);
---
section length: ffb0
---

char tmp;
uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
tmp = *(TSpacket+offsetPAT+2);
section_length |= tmp;
printf("section length: %xn",section_length);
---
section length: b0
---

le second est le bon .
pouvez-vous me dire comment se passer de cette variable temporaire ?
et donc quelle erreur je fais dans la premiere version.
Si j'avais ce genre de problème (ça m'arrive souvent d'introduire des

tmp pour faciliter le debug), je tenterais d'abord les parenthèses:
section_length |= (*(TSpacket+offsetPAT+2));

--
Pierre

Richard Delorme
Le #896126
désolé je toruvais pas de titre pour un truc aussi...

uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
section_length |= *(TSpacket+offsetPAT+2);
printf("section length: %xn",section_length);
---
section length: ffb0
---

char tmp;
uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
tmp = *(TSpacket+offsetPAT+2);
section_length |= tmp;
printf("section length: %xn",section_length);
---
section length: b0
---


Quel est le type de TSpacket ?
Uiliser une variable temporaire de type char peut effectuer une
conversion implicte vers le type char. Si TSpacket est d'un autre type,
il est normal que le résultat soit différent.

PS : - Ecrire *(TSpacket+offsetPAT+2) est une façon compliquée d'écrire
TSpacket[offsetPAT + 2].
- tes printf sont sans doute erronnés. Il fallait écrire :
printf("section length: %hxn",section_length);
ou mieux encore :
std::cout << "section length: " << section_length << std::endl;

le second est le bon .
pouvez-vous me dire comment se passer de cette variable temporaire ?


- avec un conversion explicite ?
section_length |= static_cast<unsigned char>(TSpacket[offsetPAT+2]);

- avec un mask ?
section_length |= (TSpacket[offsetPAT+2] & 0xff);

et donc quelle erreur je fais dans la premiere version.


TSpacket n'est pas de type char ?

--
Richard

kanze
Le #896120
fabrizio wrote:
désolé je toruvais pas de titre pour un truc aussi...

uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
section_length |= *(TSpacket+offsetPAT+2);
printf("section length: %xn",section_length);
---
section length: ffb0
---

char tmp;
uint16 section_length = ( *(TSpacket+(offsetPAT+1)) & 0x0F ) << 8;
tmp = *(TSpacket+offsetPAT+2);
section_length |= tmp;
printf("section length: %xn",section_length);
---
section length: b0
---

le second est le bon .
pouvez-vous me dire comment se passer de cette variable temporaire ?
et donc quelle erreur je fais dans la premiere version.


Apparamment, les char sont non-signés chez toi, et TSpacket pointe à
un
char signé. Quand on fait ce genre de manip, c'est prèsque toujours
préférable de passer par des types non-signés.

En attendant, je le trouve aussi souvent préférable d'écrire en
clair
les bits qui nous intéressent, au moyen d'un & 0xFF, par exemple.
Donc,
dans ton cas, j'écrirais quelque chose du genre :

uint16 section_length
= (TSpacket[ offsetPAT+1 ] & 0x0F) << 8
| (TSpacket[ offsetPAT+2 ] & 0xFF) ;

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

fabrizio
Le #896016
uint16 section_length
= (TSpacket[ offsetPAT+1 ] & 0x0F) << 8
| (TSpacket[ offsetPAT+2 ] & 0xFF) ;



merci à Pierre, Richard et James pour vos réponses respectives.

pour la pette histoire :
TSpacket était bien un char*. le transformé en unsigned char * résout
mon probleme, au même titre que la ligne ci-dessus.

Publicité
Poster une réponse
Anonyme