OVH Cloud OVH Cloud

Ruse pour controler l'alignement

3 réponses
Avatar
Daniel Déchelotte
Bonjour,

Je cross-compile pour un iPaq, qui ne peut lire des mots de 2 octets que
s'ils commencent a une adresse paire et les mots de 4 octects que s'il
commencent sur une adresse multiple de 4. Malheureusement, j'ai un fichier
comme ceci :

// debut
const char data[] = {
0xaa, 0xaa, 0xaa, bref les donnees en hexa
};

int *ma_classe::mon_attribut_statique = (int *) data;
// fin

(j'espere n'avoir rien "casse" en changeant les noms et les types.)

Probleme : le compilateur n'aligne pas forcement le debut de data sur un
multiple de 4 (rien ne l'y oblige, je ne sais pas l'y obliger).
Donc je pensais mettre ce gros tableau de donnees dans une
structure/classe bidon, parce que je sais lui demander de commencer les
structures sur des multiples de 4 (flag de compil kivabien). Et c'est la
que je bute. Ma plus proche tentative est :

// debut
static struct {
static const unsigned char data[] = {
0xaa, 0xaa, 0xaa, bref les donnees en hexa
} adhoc;

int *ma_classe::mon_attribut_statique = (int *) (adhoc.data);
// fin

qui compile mais ne linke pas : référence indéfinie vers `_3._9.data (??)
(j'utilise g++-2.95)

Pour arranger les choses, voici mes contraintes : ce fichier est
auto-genere (pour la partie des donnees en hexa) et inclus (#include) dans
un autre fichier cpp : il ne peut pas contenir une fonction qui ferait le
truc proprement.

Quelqu'un est plus finaud que moi ?

Daniel
--
http://yo.dan.free.fr/

3 réponses

Avatar
Ivan Vecerina
"Daniel Déchelotte" wrote in message
news:
Salut,
| Je cross-compile pour un iPaq, qui ne peut lire des mots de 2 octets que
| s'ils commencent a une adresse paire et les mots de 4 octects que s'il
| commencent sur une adresse multiple de 4. Malheureusement, j'ai un fichier
| comme ceci :
|
| // debut
| const char data[] = {
| 0xaa, 0xaa, 0xaa, bref les donnees en hexa
| };
|
| int *ma_classe::mon_attribut_statique = (int *) data;
| // fin
...
| Pour arranger les choses, voici mes contraintes : ce fichier est
| auto-genere (pour la partie des donnees en hexa) et inclus (#include) dans
| un autre fichier cpp : il ne peut pas contenir une fonction qui ferait le
| truc proprement.
|
| Quelqu'un est plus finaud que moi ?

Pas finaud, mais plus robuste:

classe::mon_attribut_statique int[24]; // par exemple?

memcpy( & classe::mon_attribut_statique
, data
, sizeof( classe::mon_attribut_statique )
);


L'alternative étant peut-être de modifier/post-traiter le fichier
généré, avant qu'il ne soit vu par le compilateur...



Bonne chance,
Ivan
--
http://ivan.vecerina.com
Avatar
Daniel Déchelotte
Merci de ton aide, mais il reste a bidouiller :


| Pas finaud, mais plus robuste:
|
| classe::mon_attribut_statique int[24]; // par exemple?
|
| memcpy( & classe::mon_attribut_statique
| , data
| , sizeof( classe::mon_attribut_statique )
| );

Je vois deux problemes, le second etant de loin le plus important :
- le gros tableau existe 2 fois : dans data et dans l'attribut statique
- je dois lancer un memcpy, qui va se retrouver en dehors de toute
fonction/methode => ce code-la ne va pas compiler.

Tu vois des contournements (err, workarounds ;-) ?

Daniel
--
http://yo.dan.free.fr/
Avatar
Daniel Déchelotte
Rien de tres interessant, mais c'est resolu, et comme "on" m'a aide, je
donne "par politesse et pour info" la solution que j'ai choisie.


| classe::mon_attribut_statique int[24]; // par exemple?

Je ne pouvais pas changer le type de mon attribut statique : c'est un int*
et rien d'autre. Mais ce que j'ai retenu est similaire :

// debut
// _MAKE_INT32 est une petite macro pour reconstruire un int sur la
// plateforme a partir des 4 octets qui le compose

static const int _data [] = {
_MAKE_INT32 (0xaa, 0xbb, 0xcc, 0xdd),
// et une ligne par entier
};

const char *data = (char *) _data;
classe::mon_attribut_statique = _data;
// fin

Dans le vrai code, c'est encore plus porcasse, parce que ce n'est pas un
tableau d'int mais de structures, donc si on inverse l'ordre de deux de
ses attributs, il faut changer le code qui genere ce code. Bah, je vais me
piquer d'un petit commentaire, et voila.

En attendant, le programme marche subitement beaucoup mieux :o)
et JE PEUX PARTIR EN WEEK-END ! Yes !!

Merci Ivan.

Daniel
--
http://yo.dan.free.fr/