bonjour,
comment declarer une variable qui ne peux prendre que deux valeurs 0 ou 1? Int et Char sont inutilement grands.
merci
-----
bonjour,
comment declarer une variable qui ne peux prendre que deux valeurs 0 ou 1? Int et Char sont inutilement grands.
merci
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
Salut
si tu utilises HITECH comme compilateur le contenant bit existe comme int, char, etc. sinon prend la suggestion de la précédente réponse.
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
Exemple;
Code:FLAG EQU 0x20 #DEFINE BIT0 FLAG,0 #DEFINE BIT1 FLAG,1 #DEFINE BIT2 FLAG,2 #DEFINE BIT3 FLAG,3 SetBit macro Bit bsf bit endm ResetBit macro Bit bcf bit endm main: BTFSC PORTB,0 SetBit BIT0 BTFSS PORTB,1 ResetBit BIT1 BTFSS PORTB,0 ResetBit BIT0 BTFSC PORTB,1 SetBit BIT1 goto Main
De toute facon même si on peut déclarer un bit seul, le compilo traduira en monopolisant un octet ,il a pas le choix.
Si ca se trouve (ca me vient a l'esprit pendant que je tape) un compilo bête monopolisera 2 octets si tu déclare 2 bits, etc...
Donc autant utiliser des char et isoler un bit, d'autant que ca respecte le C ANSI.
bonjour,
voici une fct qui recoit en argument des int (pour l'instant) mais qui sont en realité des bits.
Code:void step_dir(int *a,int *b,int *c,int *d,int *pos){ if(*a==0&*b==1&*c==0&*d==1){*a=0;*b=1;*c=1;*d=0;} else if(*a==0&*b==1&*c==1&*d==0){*a=1;*b=0;*c=1;*d=0;} else if(*a==1&*b==0&*c==1&*d==0){*a=1;*b=0;*c=0;*d=1;} else if(*a==1&*b==0&*c==0&*d==1){*a=0;*b=1;*c=0;*d=1;} *pos=*pos+1; } void init(int *a,int *b,int *c,int *d,int *e,int *f,int *g,int *h,int *capt1,int *capt2,int *pos1,int *pos2){ while(*capt1!=1){ step_dir(*a,*b,*c,*d,*pos1); delay_ms(100); } while(*capt2=1){ step_dir(*e,*f,*g,*h,*pos2) delay_ms(100); } *pos1=0; *pos2=0; } void main(void) { TRISD=0b00000000; TRISC=0b00000111; int position1,position2; while(1){ if(RC2==1){init(RD0,RD1,RD2,RD3,RD4,RD5,RD6,RD7,RC0,RC1,position1,position2);} } }ça tombe bien, j'ai 8 bits (a-h).Donc autant utiliser des char et isoler un bit, d'autant que ca respecte le C ANSI.
comment je peux changer ma declaration?
merci
Ben super, tu peux donc faire un truc du genre :ça tombe bien, j'ai 8 bits (a-h).
Bon courageCode:char lesBits; ... ... /* Test du bit 0 : */ if(lesBits & 0x01) { /* Le bit 0 est à 1 */ } else { /* Le bit 0 est à 0 */ } /* Test du bit 3 */ if(lesBits & 0x0F) { /* Le bit 3 est à 1 */ } else { /* Le bit 3 est à 0 */ }
Voila, ce que j'utilise ne général :
Et tu utilise comme cela :Code:#define uChar unsigned char typedef union _uChar_b { struct { unsigned b0:1; unsigned b1:1; unsigned b2:1; unsigned b3:1; unsigned b4:1; unsigned b5:1; unsigned b6:1; unsigned b7:1; }; uChar value; }; #define uChar_Bits union _uChar_b
Test, c'est du pifomètre là aussi ...Code:uChar_Bits Toto; // #define flag0 (Toto.b0) #define flag1 (Toto.b1) [...] //init des flag Toto.value = 0x00; [...] if( flag0 ) flag1 = 0; else flag0 = 0;
Si tu préfère complètement masquer l'union, tu peux aussi faire :
Code:uChar_Bits _Toto; #define Toto (_Toto.value) #define flag0 (_Toto.b0) #define flag1 (_Toto.b1) // Toto = 0x00;
Dernière modification par Seb.26 ; 19/03/2008 à 13h17.
<< L'histoire nous apprend que l'on apprend rien de l'histoire. >>
merci à tous,
autre question: ma facon d'utiliser les pointeurs est elle correcte svp?
merci
Niet !
En entrée de ta fonction init tu as des pointeurs sur des entiers. Donc quand tu appel la fonction, tu dois y mettre dedans l'ADDRESSE d'un entier.
Donc l'appel serait plutot :Puis vient l'appel de step_dir, cette fonction prend en parametre également des pointeurs sur des entiers, or : e, f, g,... sont déja des pointeurs, donc l'appel se ferait plutot comme ceci :Code:init(&RD0, &RD1, ...);
Code:step_dir(e,f,g,...)
Par contre :
Ca c'est juste, tu t'interesse bien à CE QUI EST POINTE.Code:while(*capt1!=1) while(*capt2=1) *pos1=0; *pos2=0;
Pareil dans la fonction step_dir, l'utilisation est bonne.
Conclusion tu t'es juste un petit peu mélangé dans les appels de fonction.
Bon courage