Bonjour,
J'ai un drôle de problème d'affectation.
Contexte: pour me détendre un peu, j'explorais la question d'un type numérique décimal et à virgule fixe (je veux dire "fixed-point", pas sûr du terme en français). Le codage est en BCD compressé, c'est-à-dire avec un chiffre par quartet. Chaque nombre est un entier non signé de 32 bits (type défini "Natural"), donc au max 8 chiffres. Bon, ça marche: je peux lire et écrire des nombres (facile en passant par l'ascci), et même faire des additions!
Je me suis vite rendu compte que c'est super galère d'accéder à des chiffres dans un demi-octet, aussi bien en lecture qu'en écriture, même en-dehors des histoires de shift et masques, simplement les prendre l'un derrière l'autre, et dans l'ordre inverse en plus pour toute opération.
Alors mon but là était de définir un type de nombre dans lequel sont distincts les quartets/chiffres: D'abord un type struct "Bidigit" de la taille d'un octet mais comprenant 2 digits "low" et "high" définis grâce aux champs de bits de C. Et du coup un Natural est un tableau fixe de 4 Bidigits.
(Je voudrais aussi savoir quel est le coût en temps d'avoir une struct de 2 quartets comme ça, plutôt qu'un octet, et un tableau de 4 octets plutôt qu'un entier non-signé de 32 bits.)
(J'ai aussi un itérateur de digits qui me les passe un par un pour les opérations : ça, ça marche, et c'est super pratique; mais il reste à accéder aux chiffres en écriture.)
Les types de nombres sont comme ci-dessous, avec un example qui montre mon problème :
Alors là, je pige plus rien. Je peux pas assigner un T à un T ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 // type for a pair of digits in an octet typedef struct Bidigit { unsigned char high : 4 ; unsigned char low : 4 ; } Bidigit ; // a natural is 4 bidigits typedef Bidigit Natural [4] ; int main () { Natural n1 = {{0,1},{2,3},{4,5},{6,7}} ; Natural n2 ; n2 = n1 ; // ********** erreur ??? ********** return EXIT_SUCCESS ; } ==> natural2.c:229:7: error: incompatible types when assigning to type Natural from type struct Bidigit *
Denis
PS: j'ai esayé juste pour voir de "caster" de force n1 en Natural, et ça me donne une erreur de gcc que je comprends pas non plus :
Qu'est-ce que ça veut dire ? (Je comprends la lettre, mais pas le pourquoi du comment.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 int main () { Natural n1 = {{0,1},{2,3},{4,5},{6,7}} ; Natural n2 ; n2 = (Natural) n1 ; return EXIT_SUCCESS ; } ==> natural2.c:229:9: error: cast specifies array type
PPS : J'ai essayé de ruser, mias j'arrive pas à tromper gcc :
ma donne la même erreur "incompatible types when assigning to type ‘Natural’ from type ‘struct Bidigit *’".
Code : Sélectionner tout - Visualiser dans une fenêtre à part n2 = *((Natural*)(&n1)) ;
Partager