mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik boolean in C Hilfe


Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan May (smay4finger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm

#include <stdbool.h>

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

mfg, Stefan.

Autor: Greg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ben,

ich benutze dann   unsigned char

Gruß,
Greg.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan May (smay4finger)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.
unsigned char Flags;

#define FLAG1     0x01
#define FLAG2     0x02
#define FLAG3     0x04

#define IS_TRUE(x)  (( Flags & (x) ) == x )
#define IS_FALSE(x) (( Flags & (x) ) == 0 )

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


int main()
{
  if( IS_TRUE( FLAG1 ) ) {
    SET_TRUE( FLAG2 );
    SET_FALSE( FLAG1 );
  }
}

Man kann sich selbst alternativ das Leben einfacher machen, indem
man eine struct definiert

struct {
  unsigned char Flag1 : 1;   // 1 Bit eines unsigned char als Variable
  unsigned char Flag2 : 1;   // noch 1 Bit derselben unsigned char
} Flags;

int main()
{
  Flags.Flag1 = 1;

  if( Flags.Flag1 ) {
    Flags.Flag2 = 0;
    Flags.Flag1 = 1;
  }
}

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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl Heinz,

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

MW

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Pantle (merlin129)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.