Bonjour,
comment fait -on des vecteurs de bits en C?
Version imprimable
Bonjour,
comment fait -on des vecteurs de bits en C?
Salut
Code:
1
2
3
4
5
6
7 struct ma_structure_a_champs_de_bit { unsigned champ1 : 1; unsigned champ2 : 1; unsigned champ3 : 1; };
Comment doit-on utiliser ce vecteur après?
Sur quel site peut-on trouver un exemple de code sur les vecteurs de bits?
Merci.
Ensuite , j'aimerais faire des blocs comme en VHdl qui communique entre eux avec des bits de validations. est-ce possible en c? Si oui comment doit-on faire? merci.
Tu n'as pas de type bit en C. Le C est incapable d'accéder directement à des objets de taille qui ne sont pas un multiple du byte.Citation:
Envoyé par sandball22
Tu peux soit utiliser des tableaux de char, soit te batir une couche qui manipule des bits.
C'est pas vraiment possible... Il y a des bidouilles...Citation:
Envoyé par sandball22
typedef struct _Phase
{
unsigned char Tab[3]; /3*8=24bits
} Phase;
Voila ma structure comment fait-on ensuite pour initialiser ne valeur pour la phase?
Phase= 00000000000000000000000; ?
Merci de votre aide.
telle qu'est faite ta structure, ce serait soit
soitCode:
1
2 Phase phase1={0,0,0};
Mais ce dont tu as besoin est plus quelque chose du genreCode:
1
2
3
4
5 Phase phase 1; phase1.tab[0]=0; phase1.tab[1]=0; phase1.tab[2]=0;
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 typedef union{ unsigned char vecteur; struct _mesBits{ unsigned bit00 : 1; unsigned bit01 : 1; unsigned bit02 : 1; unsigned bit03 : 1; unsigned bit04 : 1; unsigned bit05 : 1; unsigned bit06 : 1; unsigned bit07 : 1; } }tMyType; tMyType myVar; myVar._mesBits.bit00 = 1; myVar._mesBits.bit01 = 0; myVar._mesBits.bit02 = 1; ... printf("%d",myVar.vecteur); // affiche 5 // Pour éclaicir le code tu peux faire un truc du genre #define CHIP_SELECT myVar._mesBits.bit00 #define CLOCK myVar._mesBits.bit01 #define READ_EN myVar._mesBits.bit02 // Ensuite si tu fais myVar.vecteur = 5; // tu auras // CHIP_SELECT == 1 // CLOCK == 0 // READ_EN == 1 // à vrai
Ici, ta structure encapsule un tableau de unsized char dont la taille vaut 3 bytes. Rien ne dit que sa taille en bits soit de 24. En tous les cas, je n'ai pas l'impression de bien saisir ton problème initial... vecteur de bits ou vecteur de bytes?Citation:
Envoyé par sandball22
Thierry
Cette façon de faire dépend de l'implantation et n'est par conséquent absolument pas portable.Citation:
Envoyé par DaffyDuck
Thierry
Bonjour Thierry,Citation:
Envoyé par mujigka
un unsigned char fait bien 8 bits non?
donc 3 unsigned char font bien 3 * 8 = 24 bits.
Peu importe si la structure fait plus que 24 bits. Le PO désire mémorise 24 bits en forme de vecteur.
Non, la taille d'un unsigned char est de 1 byte, et la taille du byte dépend de l'implantation (La constante CHAR_BIT définie dans limits.h donne le nombre de bits utilisés pour représenter un char). Mais bon, comme tu dis, ce n'est pas le plus important ici. Une manière portable d'accéder aux bits d'un tableau de unsigned char est d'utiliser les opérateurs &, |, <<, >>, ^, ~.Citation:
Envoyé par jowo
Thierry
Je suis d'accord avec toi. J'aurais dû écrire qu'un unsigned char fait au moins 8 bits.Citation:
Envoyé par mujigka
Fabio
Ben je le porte sur PC Windows, DSP Freescale, PIC, 8051 et ARM...Citation:
Envoyé par mujigka
Par contre, on ne garantie pas la taille réelle de la structure, qui elle dépend de l'architecture, mais je ne pense pas que ce soit réellement le problème ici. Je pense que le PO cherche un moyen de simuler un comportement d'une entité VHDL sur PC, et donc de faire un champ de bit comme en VHDL. La structure que je propose présente l'avantage de pouvoir faire en sorte d'accéder indépendamment à tous les bits de la structure et au vecteur entier. C'est une solution possible en sachant qu'il y en a plein.
Soit, mille excuses. J'avais compris (C unleashed + norme) que l'on ne pouvais accéder à la valeur contenue dans une union que par le champ qui avais servi à son initialisation. Selon les même sources, il me semblait que ta manière de faire est définie par l'implantation en C90, et il s'agit d'un comportement indéfini en C99.Citation:
Envoyé par DaffyDuck
Il semble que la seule exception à cette règle est lorsqu'une union contient des structures avec une séquence initiale commune. Mais, je ne suis pas un spécialiste de cette question, et je me range à ton expérience. Probablement qu'Emmanuel ou Jean-Marc Bourguet, s'ils passent par là pourront nous en dire plus.
Thierry
Sur ta machine, peut être. Ce n'est pas garanti pas le langage C qui précise 'au moins 8-bit'.Citation:
Envoyé par jowo
Sur DSP Freescale, un byte pourrait très bien faire 16 ou 32 bits...Citation:
Envoyé par DaffyDuck
Exact (à part la nuance défini par l'implémentation/indéfini que j'ai pas été vérifier).Citation:
Envoyé par mujigka
Séquence initiale commune.Citation:
Il semble que la seule exception à cette règle est lorsqu'une union contient des structures avec une séquence commune.
Tout a fait et alors? Je vois pas ou est le problème concernant la fonctionnalité de la structure. En elle-même, et je le re-précise encore, la taille de la structure n'a pas d'importance pour l'application, il ne veux pas avoir un champ de pile poil 24bits dans sa machine, car on s'en fout complètement. Ce qu'il veut c'est le simuler. Donc que sa structure fasse 24, 32 ou 48 bits, on s'en balance.Citation:
Envoyé par Emmanuel Delahaye
:oops: Corrigé! MerciCitation:
Envoyé par Jean-Marc.Bourguet
Thierry