struct wert zuweisen

OP #1273792
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
Gast #1273803
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
}
Gast #1273807
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
Persönliche Seite #1274501
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/

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren