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 :
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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"Daniel Déchelotte" <maitre_yodan@fr.club-internet.invalid> wrote in message
news:20031106213428.3bae0ad2.maitre_yodan@fr.club-internet.invalid...
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...
"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
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/
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 ;-) ?
| 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/
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 };
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/
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
};
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 !!
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 !!