www.mikrocontroller.net

Forum: Compiler & IDEs C-Frage


Autor: Carola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo C-Spezialisten,

ich habe ein Problem mit fogendem wohl nicht ganz ANSI-konformen
Programmschnipsel:

typedef union uREG08
    {
    uint8_t  byte;
    struct      {
      uint8_t _0 :1;
      uint8_t _1 :1;
      uint8_t _2 :1;
      uint8_t _3 :1;
      uint8_t _4 :1;
      uint8_t _5 :1;
      uint8_t _6 :1;
      uint8_t _7 :1;
      }bit;
    }tREG08;

Was bedeutet z.B.

uint8_t _0 :1;

wie schreibt man das ANSI konform?

Vielen Dank

Carola

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich habe ein Problem mit fogendem wohl nicht ganz ANSI-konformen
> Programmschnipsel:

Wie kommst du darauf?

> Was bedeutet z.B.
>
> uint8_t _0 :1;

Es bedeutet, daß in der Struct ein Element mit Namen _0 angelegt wird,
das nur ein einziges Bit breit is.

> wie schreibt man das ANSI konform?

Genauso.

Autor: Carola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rolf:

Vielen Dank!

ist dann bei uint8_t _0 :1

_0 eine Variable?


Carola

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, die Variable legst Du mit:

tREG08 val;

an. Sie heist dann 'val'. Zugriff auf die Bestandteile diese Variable
geht dann per:

val.bit._0 = 1;

Oder eben:

uint8_t x = val.byte;

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

Bewertung
0 lesenswert
nicht lesenswert
_0 ist ein Strukturelement (member).

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der führende Unterstrich im Element-Namen ist übrigens wirklich
nicht ganz standardkonform, da führende Unterstriche für ,,die
Implementierung'' reserviert sind (sprich: für Compiler und
Bibiothek).  Ersetze die Unterstriche besser durch ein ,b' zum
Beispiel, also auf die Bits kann man dann zugreifen mit val.bit.b0.

Btw., der Standard überlässt die Bitreihenfolge der jeweiligen
Implementierung.  Der entsprechende Code ist also zwar
standardkonform, aber mitnichten portabel.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der führende Unterstrich im Element-Namen ist übrigens wirklich
> nicht ganz standardkonform, da führende Unterstriche für ,,die
> Implementierung'' reserviert sind (sprich: für Compiler und
> Bibiothek).

Das stimmt nicht. Reserviert sind nur führende Unterstriche, auf die
ein Großbuchstabe oder ein weiterer Unterstrich folgt. Alles andere,
was mit Unterstrich anfängt, ist zwar teilweise auch reserviert, aber
auf struct-Members trifft es nicht zu.

> Btw., der Standard überlässt die Bitreihenfolge der jeweiligen
> Implementierung.  Der entsprechende Code ist also zwar
> standardkonform, aber mitnichten portabel.

Naja, "mitnichten" ist doch etwas übertrieben. Es ist zwar in der
Norm (nicht Standard) nicht festgelegt, aber kennst du eine
Implementation, auf der das anders als oben erwartet ist? Ich gebe zu,
daß es bei 16 oder mehr bits wieder anders aussieht, wegen little
endian vs. big endian.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Reserviert sind nur führende Unterstriche, auf die ein Großbuchstabe
> oder ein weiterer Unterstrich folgt. Alles andere, was mit
> Unterstrich anfängt, ist zwar teilweise auch reserviert, aber auf
> struct-Members trifft es nicht zu.

OK, hast Recht.  Allerdings sind die Regeln für den Rest so wenig
einprägsam, dass ich mir das eher nicht im Kopf behalten würde und auf
führende Unterstriche generell verzichten würde.

Erlaubt:

struct foo {
  int _bar;
};

Nicht erlaubt:

struct _foo {
  int bar;
};

Um das rauszufinden, muss ich aber wirklich erst im Standard
nachgucken.  (Klar, bei näherem Hinsehen ist eine gewisse Logik drin,
das _bar da oben kann mit nichts aus der Bibliothek kollidieren, da es
zum namespace von struct foo gehört und nur in diesem eine Bedeutung
hat.)

> Es ist zwar in der Norm (nicht Standard) nicht festgelegt, aber
> kennst du eine Implementation, auf der das anders als oben erwartet
> ist?

Hab' ich mir nie die Mühe gemacht, das anzusehen.  Da sie als
implementation defined bezeichnet werden, nehme ich sie für derartige
Zwecke einfach nicht, sondern nehme lieber gewöhnliche Bitmasken.  (An
dieser Stelle soll dem Vernehmen nach Ada einfach mal schlauer gewesen
sein.)  Bitfields sind trotzdem hin und wieder recht nett, z.B. wenn
man Platz sparen will und ein paar globale Interruptflags braucht,
denen man dann nicht jedem ein Byte spendieren möchte.

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.