mikrocontroller.net

Forum: Compiler & IDEs struct wert zuweisen


Autor: Wolfgang Hopperdietzel (hastekene)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ,

ich bin gerade auf der suche nach einer eleganteren Möglichkeit

die Bits meines Structs mit einen Wert zu belegen

struct{
    unsigned _1:1;
  unsigned _2:1;
  unsigned _3:1;
  unsigned _4:1;
  unsigned _5:1;
  unsigned _6:1;
  unsigned _7:1;
  unsigned _8:1;
}volatile lamp;


lamp= 20;

bringt mir leider eine Fehlermeldung

geht es überhaupt so oder muss ich jedes bit einzeln setzen?

Danke im vorraus

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das geht so nicht.

Die Größe deiner Struktur ist nicht definiert. Ansonsten könnte man mit 
Zeigern spielen:
#include <stdio.h>

int main() {
        struct la {
                unsigned _1:1;
                unsigned _2:1;
                unsigned _3:1;
                unsigned _4:1;
                unsigned _5:1;
                unsigned _6:1;
                unsigned _7:1;
                unsigned _8:1;
        };

        unsigned char v = 8;
        struct la *z = (struct la *) &v;

        printf("bit 1 = %i\n", z->_1);
        printf("bit 2 = %i\n", z->_2);
        printf("bit 3 = %i\n", z->_3);
        printf("bit 4 = %i\n", z->_4);
        printf("bit 5 = %i\n", z->_5);
        printf("bit 6 = %i\n", z->_6);
        printf("bit 7 = %i\n", z->_7);
        printf("bit 8 = %i\n", z->_8);

        return 0;
}

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch mal

union
{
 unsigned char byte;
 struct
 {
  unsigned _1:1;
  unsigned _2:1;
  unsigned _3:1;
  unsigned _4:1;
  unsigned _5:1;
  unsigned _6:1;
  unsigned _7:1;
  unsigned _8:1;
};
}lamp;


entweder
lamp.byte = 0;
und alle bits sind wech oder einzeln setzen mit
lamp._8 = 1; und 8tes bit ist 1

byte und die _1 bis _8 belegen den selben speicherbereich
können sich also überschreiben

aber so kann man ein bitfeld komplet löschen

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder so.

Autor: Wolfgang Hopperdietzel (hastekene)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke ,
genau was ich gesucht habe geht prima

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> versuch mal
> ...
> lamp.byte = 0;
> und alle bits sind wech oder einzeln setzen mit
> lamp._8 = 1; und 8tes bit ist 1

nö, das 7-te Bit ist dann 1. Bits beginnt man bei 0 zu zählen.
Anonyme Strukturen sind eine Spezialität von GNU-C.

Johann

Autor: Marcus Harnisch (mharnisch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. schrieb:
> Anonyme Strukturen sind eine Spezialität von GNU-C.

Der RealView Compiler (u.a. Keil MDK) unterstützt das ebenfalls, wenn 
man ein bestimmtes pragma verwendet:

http://infocenter.arm.com/help/topic/com.arm.doc.k...

Gut möglich, dass die Kommandozeilenoption --gnu neben weiteren GCC 
features  auch dieses aktiviert.

Sicher bist Du auf jeden Fall, wenn Du das hier verwendest:
union
{
    unsigned char byte;
    struct
    {
        unsigned _1:1;
        unsigned _2:1;
        unsigned _3:1;
        unsigned _4:1;
        unsigned _5:1;
        unsigned _6:1;
        unsigned _7:1;
        unsigned _8:1;
    } bits;
} lamp;


lamp.byte = 0;
lamp.bits._1 = 1;

Gruß
Marcus
http://www.doulos.com/arm/

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.