Forum: Compiler & IDEs Boolean in C


von Finja (Gast)


Lesenswert?

Hallo,

Gibt es bei AVR-Studio/AtmelStudio in C gar kein Datentyp der ein bit 
enthält?
Boolean oder so?
bool und boolean werden bei mir nicht erkannt, hat jemand einen Tipp?

von Peter II (Gast)


Lesenswert?

#include <stdbool.h>

aber warum nicht uint8_t nehmen? Platz sparst du damit eh nicht.

von Finja (Gast)


Lesenswert?

Peter II schrieb:
> aber warum nicht uint8_t nehmen? Platz sparst du damit eh nicht.

Warum spar ich keinen Platz?
Boolean ist 1 Bit, uint8_t wohl 8 Bits?

von Mike (Gast)


Lesenswert?

Finja schrieb:
> bool und boolean werden bei mir nicht erkannt, hat jemand einen Tipp?

Nicht nur in AVR-Studio/AtmelStudio gibt es in C keinen boolean 
Datentyp, wenn du ihn nicht selbst definierst.
Die logischen Prüfungen in C sind Tests auf "ungleich 0"

Guck mal in dein C-Buch oder frage Google.

von Peter II (Gast)


Lesenswert?

Finja schrieb:
> Warum spar ich keinen Platz?
> Boolean ist 1 Bit, uint8_t wohl 8 Bits?

aber 1bit lässt sich nicht adressieren.

von Mike (Gast)


Lesenswert?

Finja schrieb:
> Warum spar ich keinen Platz?
> Boolean ist 1 Bit, uint8_t wohl 8 Bits?

Ohne großen Zwergenaufstand kann dein µC aber nur ganze Speicherstellen 
adressieren. Und in dem Datenblatt von deinem µC kannst du gucken, wie 
groß die sind.

von Finja (Gast)


Lesenswert?

Mike schrieb:
> Ohne großen Zwergenaufstand kann dein µC aber nur ganze Speicherstellen
> adressieren. Und in dem Datenblatt von deinem µC kannst du gucken, wie
> groß die sind.

Die sind dann gewöhnlich vermutlich 8 bit groß oder?
Keine Lust das ganze Datenblatt durchzukramen ..

Dann verschwende ich ja bei meinem ATmega8 massig platz, wenn ich für 
jedes bit ein ganzes Byte blockiere :(

von TriHexagon (Gast)


Lesenswert?

Du kannst auch einen uint8_t verwenden und die einzelnen 8 Bits 
benutzen. Oder du baust dir ein struct mit Bitfeldern, dann ist es 
angenehmer die zu verwenden in C. Kommt aber das Gleiche heraus.

von BattMan (Gast)


Lesenswert?

Finja schrieb:
> Keine Lust das ganze Datenblatt durchzukramen ..

Dafür sind Datenblätter aber da. Dass man sie liest.

Finja schrieb:
> wenn ich für
> jedes bit ein ganzes Byte blockiere :(

Das kannst Du über #define regeln. Schau Dir mal die include-Datei für
deinen AVR an, dort kannst Du an PIN-Definitionen sehen, was ich damit 
meine.
Dann kannst Du mit einem Byte 8 Bits Deiner Anwendung realisieren.
Schlüsselwort: Makro.

von Finja (Gast)


Lesenswert?

TriHexagon schrieb:
> Oder du baust dir ein struct mit Bitfeldern,

Wie bau ich denn einen solchen?

von Rene H. (Gast)


Lesenswert?

Ein Boolean frisst in C immer 8 Bit.

Du kannst aber booleans zusammenfassen.
1
typedef struct {
2
   uint8_t bool_1 : 1;
3
   uint8_t bool_2 : 1;
4
   uint8_t bool_3 : 1;
5
   uint8_t bool_4 : 1;
6
7
   uint8_t bool_5 : 1;
8
   uint8_t bool_6 : 1;
9
   uint8_t bool_7 : 1;
10
   uint8_t bool_8 : 1;
11
} status_t;

Braucht ein Byte.

Gruss,
René

von Finja (Gast)


Lesenswert?

Rene H. schrieb:
> Du kannst aber booleans zusammenfassen.
> typedef struct {
>    uint8_t bool_1 : 1;
>    uint8_t bool_2 : 1;
>    uint8_t bool_3 : 1;
>    uint8_t bool_4 : 1;
>
>    uint8_t bool_5 : 1;
>    uint8_t bool_6 : 1;
>    uint8_t bool_7 : 1;
>    uint8_t bool_8 : 1;
> } status_t;
>
> Braucht ein Byte.


Kann ich damit auch ne "Boolean-Array" erstellen, bei der ein boolean 
auch wirklich nur ein Bit braucht?

von Daniel F. (df311)


Lesenswert?

Mike schrieb:
> Ohne großen Zwergenaufstand kann dein µC aber nur ganze Speicherstellen
> adressieren. Und in dem Datenblatt von deinem µC kannst du gucken, wie
> groß die sind.

gilt immer noch, daher immer noch nein - daran ändern auch ein struct 
nichts.

ich empfehle K&R

von Kaj (Gast)


Lesenswert?

Finja schrieb:
> Gibt es bei AVR-Studio/AtmelStudio in C gar kein Datentyp der ein bit
> enthält?
Das hat nichts mit der IDE zu tun!

Finja schrieb:
> ein boolean
> auch wirklich nur ein Bit braucht?
Wenniger als 1 Byte kann man nicht adressieren! Und damit gibt es auch 
keine Variablen die kleiner sind als 1 Byte. Versteh das einfach: deine 
Variablen, egal von welchem Typ, sind immer mindestens 1 Byte groß, 
immer! Weniger geht nicht!

Selbst wenn du folgendes machen würdest:
1
typedef struct {
2
   uint8_t my_bool : 1;
3
} status_t;
Eine Variable vom Typ status_t wäre trotzdem 1 Byte groß, weniger
geht nicht!

Daniel F. schrieb:
> ich empfehle K&R
Damit sind wir auch bei dem wichtigsten Hinweis an dieser stelle:

Lies ein C-Buch!

Und mit Buch meine ich auch Buch und nicht Online-Tutorial-Müll! 
Die Dinger strotzen reihenweise von Fehler, die davon zeugen, das die 
Ersteller selbst, noch nie ein C-Buch gesehen haben.

von Amateur (Gast)


Lesenswert?

Es ist möglich ein Bit-Array anzulegen. Die "Mindestgröße" ist aber 
immer ein vielfaches von 8 Bit bzw. einem Byte.

Über die zugehörigen Manipulatoren ist auch ein gezielter Zugriff 
möglich.

GANZ WICHTIG:
DIES HAT ABER NICHTS MIT DEM KLASSISCHEN DATENTYPEN BOOL BZW. BOOLEAN 
ZUTUN.

Es hindert Dich aber nichts diese Interpretation vorzunehmen.

von Jasch (Gast)


Lesenswert?

Finja schrieb:
> Peter II schrieb:
>> aber warum nicht uint8_t nehmen? Platz sparst du damit eh nicht.
>
> Warum spar ich keinen Platz?
> Boolean ist 1 Bit, uint8_t wohl 8 Bits?

Stoff zum Nachdenken: Hast Du überhaupt genügend viele Booleans damit 
das in irgendeiner relevanten Art und Weise ins Gewicht fallen würde?

Es gibt sicher Algorithmen (Sieb des Eratosthenes z.B.) wo das der Fall 
ist, aber so im Allgemeinen...

von Teo D. (teoderix)


Lesenswert?

Hier mal ein kleiner Ausschnitt aus einem meiner Pic Assembler Progis.
1
   CBLOCK 0x20 ; 
2
    DCF_Flags   ; bit0=1Sec. Bit1=DCF77_Timer Bit2=DCFBitFlag Bit3=DCF_Bit
3
                ; Bit=4 DCF_Error_Bit Bit=5 DCF_Stellen, Bit6=DCF_NeueM_Flag
4
...
5
#Define  Sec_Flag          DCF_Flags,H'0'  ; Ausnahmsweise in DCF_Flag ?!?!? 
6
#Define  DCF_Stellen_Flag  DCF_Flags,H'1'  ; wenn Hi DCF_Time OK Neue Minute beginnt
7
#Define  DCF_Port_Flag    DCF_Flags,H'2'  ; zum feststellen ob bereits Hi or Lo war
8
#Define  DCF_Bit          DCF_Flags,H'3'   ; Hi or Lo vom DCF77 Modul
9
#Define  DCF_Error_Flag   DCF_Flags,H'4'
10
#Define  DCF_Rise_Flag    DCF_Flags,H'5'  ; Hi = Timer STOP, Bit auswerten
11
#Define  DCF_Sink_Flag    DCF_Flags,H'6'  ; Hi = Timer START, Bit beginnt
12
#Define  DCF_NeueM_Flag   DCF_Flags,H'7'

Wenn ich das "zu Fuß" kann, könnte das ein Compiler auch, ob man ihn 
auch dazu bewegen kann is ne andre Sache.
Werde das mal, bei Gelegenheit, mit dem XC8 testen.
(bin nich wirklich ein C Spezialist :)

von Dirk B. (dirkb2)


Lesenswert?

Das ist abe auch ein Byte.

Und der Compiler kann das, das hat ja Rene schon gezeigt: 
Beitrag "Re: Boolean in C"

Du musst halt nur die Bezeichner ändern.
Von bool_1 in Sec_Flag
usw.

von Mano W. (Firma: ---) (manow)


Lesenswert?

Finja schrieb:
> Dann verschwende ich ja bei meinem ATmega8 massig platz, wenn ich für
> jedes bit ein ganzes Byte blockiere :(

Kann man pauschal nicht sagen, das kommt darauf an...

Was hast Du eigentlich vor? / Für was brauchst Du ein Boolean?

von Εrnst B. (ernst)


Lesenswert?

Teo Derix schrieb:
> Hier mal ein kleiner Ausschnitt aus einem meiner Pic Assembler Progis...

Genau das lässt sich wunderschön, fast 1:1 in Bitfelder übersetzen.

Dann hast du ein Byte für eine "struct DCF", und kannst mit
1
 if (DCF.Error_Flag) {
2
   DCF.Error_Flag = 0;
3
 }
4
...
5
  DCF.Bit = ! DCF.Bit;
6
...
usw.
auf die EinzelBits zugreifen.

Kannst sogar mit Bitbreiten != 1 arbeiten, und so z.B. die aktuelle 
Stunde in fünf Bits speichern, und trotzdem mit "DCF.Stunde++" darauf 
rechnen.

von Teo D. (teoderix)


Lesenswert?

Dirk B. schrieb:
> Das ist abe auch ein Byte.

Schon klar das ein einzelne bit-Variable immer min. 1 Byte braucht.
Da hab ich wohl, beim überfliegen, ein paar Schreier "das geht nicht, 
kann man nicht adressieren...", missverstanden.

Was mich an den Thema eigentlich interessiert, da der CX8 ja den 
Datentype Bit kennt, ob das auch (ohne/mit Optimierungseinstellung) 
so, bei Verwendung mehrerer Bit Variablen, zusammengefasst /optimiert 
wird?

von Εrnst B. (ernst)


Lesenswert?

Auch 8051er Mikrocontroller haben Bit-addressierbaren Speicher.

Wird halt je nach Compiler durch spezielle Erweiterungen, also 
Abweichungen vom C-Standard, umgesetzt.

AVRs haben einen solchen Speicherbereich nicht, also enthält der AVR-GCC 
auch keine Hacks, um sowas zu unterstützen.


Und ein automatisches Zusammenfassen von mehreren Booleans zu einem Byte 
macht auf AVRs auch wenig Sinn:
Der Zugriff ist langsamer, und Speicher ist normalerweise sowieso genug 
vorhanden.
(Für ungenutztes RAM gibt's kein Geld zurück!)

Und, wenn es im Sonderfall doch Sinn macht, kann der Programmierer das 
ganz ganz einfach selber machen, sh. Bitfelder.

: Bearbeitet durch User
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Εrnst B✶ schrieb:
> AVRs haben einen solchen Speicherbereich nicht, also enthält der AVR-GCC
> auch keine Hacks, um sowas zu unterstützen.

Doch, die unteren 32 IO-Register sind (zumindest in gewissen Grenzen)
bit-adressierbar.  Daher gibt es bei einigen AVRs dort auch Register
mit dem Namen GPIO<n>, bei denen an den Registerbits keinerlei
Hardware angeschlossen worden ist.

Einen eigenen Datentypen hat man denen jedoch trotzdem nicht spendiert.
Der Programmierer muss sich also selbst drum kümmern, wie er die
Aufteilung vornimmt.  Sollte bei den paar Bits, die auf diese Weise
zur Verfügung stehen, aber kein Thema sein.

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.