boolean in C Hilfe

Gast #727038
Lesenswert?

@ Stefan May
Das nächste mal lies doch bitte die Fragestellung, dann wirst du dir 
solche Antworten in Zukunft verkneifen.

So nun zu Ben's Problem. Ein bit allein brauchen das wird schwer, hast 
du abere meherere bits so kannst du diese in einem Bitfeld ablegen.
z.B.

struct{
   unsigned bit7 : 1;
   unsigned bit6 : 1;
   unsigned bit5 : 1;
   unsigned bit4 : 1;
   unsigned bit3 : 1;
   unsigned bit2 : 1;
   unsigned bit1 : 1;
   unsigned bit0 : 1;
}bits

So brauchst du ein Byte und kannst es mit bis zu 100% ausnutzen.
#727049
Lesenswert?

> eigetnlich unbedingt um Platz zu sparen. weiss
> da jemand eine Abhilfe,

Wenns ums Platz sparen geht, hilft dir weder ein
bool noch ein unsigned char. In beiden Fällen verbraucht
jeder einzelne boolean nach wie vor 1 Byte.

Platz sparen (im SRAM) kann man eigentlich nurnoch, indem
mehrere Boolean gemeinsam in ein Byte gequetscht werden,
man also die nicht benutzten Bits eines Bytes für andere
Bollean weiterbenutzt. Allerdings erkauft man sich diesen
Platzgewinn mit erhöhtem Codeaufwand und auch mit erhöhter
Laufzeit.
1
unsigned char Flags;
2

3
#define FLAG1     0x01
4
#define FLAG2     0x02
5
#define FLAG3     0x04
6

7
#define IS_TRUE(x)  (( Flags & (x) ) == x )
8
#define IS_FALSE(x) (( Flags & (x) ) == 0 )
9

10
#define SET_TRUE(x)  ( Flags |= (x) )
11
#define SET_FALSE(x) ( Flags &= ~(x) )
12

13

14
int main()
15
{
16
  if( IS_TRUE( FLAG1 ) ) {
17
    SET_TRUE( FLAG2 );
18
    SET_FALSE( FLAG1 );
19
  }
20
}

Man kann sich selbst alternativ das Leben einfacher machen, indem
man eine struct definiert
1
struct {
2
  unsigned char Flag1 : 1;   // 1 Bit eines unsigned char als Variable
3
  unsigned char Flag2 : 1;   // noch 1 Bit derselben unsigned char
4
} Flags;
5

6
int main()
7
{
8
  Flags.Flag1 = 1;
9

10
  if( Flags.Flag1 ) {
11
    Flags.Flag2 = 0;
12
    Flags.Flag1 = 1;
13
  }
14
}

Wie gesagt: die Schreibweise wird einfacher. Aber im Hintergrund
passiert dasselbe wie in der ersten Lösung, nur das diesmal sich
der Compiler slbsttätig um die richtige Maskierung kümmert.
Gast #727058
Lesenswert?

>bräuchte die aber eigetnlich unbedingt um Platz zu sparen.

Da frage ich doch mal zurück: Warum? Was für einen Minicontroller 
verwendest du, daß da ca. 10 byte mehr so große Probleme machen?

Oliver
#727069
Lesenswert?

Michael Wilhelm wrote:
> wird bei einem Bitfeld nicht vom Compiler gleich ein int angelegt? Meine
> ich mal gelesen zu haben.
Ich meine, mich erinnern zu können, das mit dem WINAVR mal ausprobiert 
und dabei festgestellt zu haben, dass zumindest besagter Compiler 
Bitfelder tatsächlich in Vielfachen von 8 Bit ablegen kann.
#727104
Lesenswert?

Michael Wilhelm wrote:
> @ Karl Heinz,
>
> wird bei einem Bitfeld nicht vom Compiler gleich ein int angelegt? Meine
> ich mal gelesen zu haben.

Da bin ich mir auch immer unsicher. Ich hab auch schon gelesen
dass der Datentyp des Members immer int sein muss. Allerdings
scheinen sich hier die Aussagen etwas zu widersprechen und
C-Standard hab ich keinen da um in der 'letzten Instanz' nach-
zuschlagen.
Gast #727112
Lesenswert?

> Da frage ich doch mal zurück: Warum? Was für einen Minicontroller
> verwendest du, daß da ca. 10 byte mehr so große Probleme machen?

Die Antwort darauf weiß ich zwar nicht, aber die kleinsten von gcc 
unterstützten AVRs haben 64 Bytes RAM, und da muß ja auch noch der Stack 
rein.
Außerdem könnte man auch mal größere Arrays brauchen, in denen jedes 
Element mehrere solcher booleschen Werte enthält.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren