Forum: Compiler & IDEs struct wert zuweisen


von Wolfgang H. (hastekene)


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

von Sven P. (Gast)


Lesenswert?

Nein, das geht so nicht.

Die Größe deiner Struktur ist nicht definiert. Ansonsten könnte man mit 
Zeigern spielen:
1
#include <stdio.h>
2
3
int main() {
4
        struct la {
5
                unsigned _1:1;
6
                unsigned _2:1;
7
                unsigned _3:1;
8
                unsigned _4:1;
9
                unsigned _5:1;
10
                unsigned _6:1;
11
                unsigned _7:1;
12
                unsigned _8:1;
13
        };
14
15
        unsigned char v = 8;
16
        struct la *z = (struct la *) &v;
17
18
        printf("bit 1 = %i\n", z->_1);
19
        printf("bit 2 = %i\n", z->_2);
20
        printf("bit 3 = %i\n", z->_3);
21
        printf("bit 4 = %i\n", z->_4);
22
        printf("bit 5 = %i\n", z->_5);
23
        printf("bit 6 = %i\n", z->_6);
24
        printf("bit 7 = %i\n", z->_7);
25
        printf("bit 8 = %i\n", z->_8);
26
27
        return 0;
28
}

von gast (Gast)


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

von Sven P. (Gast)


Lesenswert?

Oder so.

von Wolfgang H. (hastekene)


Lesenswert?

Danke ,
genau was ich gesucht habe geht prima

von Johann L. (gjlayde) Benutzerseite


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

von Marcus H. (mharnisch) Benutzerseite


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.kui0098a/armccref_ciajccbj.htm

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:
1
union
2
{
3
    unsigned char byte;
4
    struct
5
    {
6
        unsigned _1:1;
7
        unsigned _2:1;
8
        unsigned _3:1;
9
        unsigned _4:1;
10
        unsigned _5:1;
11
        unsigned _6:1;
12
        unsigned _7:1;
13
        unsigned _8:1;
14
    } bits;
15
} lamp;
16
17
18
lamp.byte = 0;
19
lamp.bits._1 = 1;

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

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.