Forum: Mikrocontroller und Digitale Elektronik boolean in C Hilfe


von Ben (Gast)


Lesenswert?

Habe heute mit erstaunen festgestellt dass es gar keinen "boolean" in C 
gibt! bräuchte die aber eigetnlich unbedingt um Platz zu sparen. weiss 
da jemand eine Abhilfe, was benutzt man anstatt bool in C?

von Stefan M. (Gast)


Lesenswert?

Nimm

#include <stdbool.h>

und verwende den Datentyp bool. true und false sind dann auch definiert.

mfg, Stefan.

von Greg (Gast)


Lesenswert?

Hallo Ben,

ich benutze dann   unsigned char

Gruß,
Greg.

von Klaus F. (kfalser)


Lesenswert?

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

Boolean sparen nicht unbedingt Platz. Es wird von der Implementierung 
abhängen, aber ich vermute der Platzbedarf entspricht einem integer, 
bestenfalls aber ein Byte.

von Stephan (Gast)


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.

von Stefan M. (Gast)


Lesenswert?

@Stephan: Oh, ich hab da was überlesen. Entschuldige bitte. Fühlst Du 
Dich etwa auf den Schlips getreten? Dein Problem. Deinen Kommentar 
hättest Du Dir auch sparen können.

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


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

von Michael Wilhelm (Gast)


Lesenswert?

@ Karl Heinz,

wird bei einem Bitfeld nicht vom Compiler gleich ein int angelegt? Meine 
ich mal gelesen zu haben.

MW

von Johannes M. (johnny-m)


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.

von Karl H. (kbuchegg)


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.

von Rolf Magnus (Gast)


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.

von Andy Y. (merlin129)


Lesenswert?

Ich weiß ist alt, aber vielleicht juckt es jemand:

typedef enum {
    false = 0,
    true
} t_bool;

Das setzt allerdings voraus das true == 1 ist und nicht true =< 1...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Andreas Pantle schrieb:
> Das setzt allerdings voraus das true == 1 ist und nicht true =< 1...

Und deswegen ist das Unfug. In C ist alles, was nicht 0 ist, "true".

Warum Du das jetzt nach nur sieben Jahren noch rauskramen musstest, 
wirst auch nur Du wissen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.