2016-04-25 17 views
0

Ich habe ein Bitfeld angegeben, wie unten angegeben.Bitfeld in C kann nicht global initialisiert werden

struct { 
    volatile uint8_t screenflag:1; 
    volatile uint8_t logoflag:1; 
    volatile uint8_t oledflag:1; 
    volatile uint8_t animationflag:1; 
    volatile uint8_t clockdialflag:1; 
    volatile uint8_t update_screen:1; 
    volatile uint8_t BLE_activity:1; 
    uint8_t ble_status:1; 
} oled_flag; 

Aber als ich versuchte, Element von Bitfield out of Main() -Funktion zu initialisieren, zeigt es folgende Fehler beim Kompilieren.

....\Src\main.c(95): warning: #77-D: this declaration has no storage class or type specifier oled_flag.screenflag=1; ....\Src\main.c(95): error: #147: declaration is incompatible with "struct oled_flag" (declared at line 92)
oled_flag.screenflag=1; ....\Src\main.c(95): error: #65: expected a ";" oled_flag.screenflag=1; ....\Src\main.c(96): warning: #77-D: this declaration has no storage class or type specifier
oled_flag.logoflag=0; ....\Src\main.c(96): error: #147: declaration is incompatible with "struct oled_flag" (declared at line 95) oled_flag.logoflag=0; ....\Src\main.c(96): error: #65: expected a ";" oled_flag.logoflag=0; ....\Src\main.c(97): warning:

77-D: this declaration has no storage class or type specifier oled_flag.oledflag=1; ....\Src\main.c(97): error: #147: declaration

is incompatible with "struct oled_flag" (declared at line 96) oled_flag.oledflag=1; ....\Src\main.c(97): error: #65: expected a ";" oled_flag.oledflag=1; ....\Src\main.c(98): warning:

77-D: this declaration has no storage class or type specifier oled_flag.animationflag=0; ....\Src\main.c(98): error: #147:

declaration is incompatible with "struct oled_flag" (declared at line 97) oled_flag.animationflag=0; ....\Src\main.c(98): error: #65: expected a ";"
oled_flag.animationflag=0; ....\Src\main.c(99): warning: #77-D: this declaration has no storage class or type specifier
oled_flag.clockdialflag=1; ....\Src\main.c(99): error: #147: declaration is incompatible with "struct oled_flag" (declared at line 98) oled_flag.clockdialflag=1; ....\Src\main.c(99): error: #65: expected a ";"
oled_flag.clockdialflag=1; ....\Src\main.c(100): warning: #77-D: this declaration has no storage class or type specifier

etc ..

Der Initialisierungscode ist:

oled_flag.screenflag=1; 
oled_flag.logoflag=0; 
oled_flag.oledflag=1; 
oled_flag.animationflag=0; 
oled_flag.clockdialflag=1; 
oled_flag.update_screen=0; 
oled_flag.BLE_activity=0; 
oled_flag.ble_status=1; 

Aber wenn ich Elemente von Bit-Feld in Main() Funktion initialisieren, es funktioniert gut.

+0

'Ein Mitglied, das nicht ein bisschen darstellen DOES Feld kann von jedem Datentyp sein und kann das flüchtige oder const Qualifikationsmerkmal haben. – sjsam

+0

Also was ist eigentlich "oled_flag"? –

+0

Folgender Kommentar # 1 Ich frage mich, warum dein Compiler sich nicht darüber beschwert hat? Oder ist es schlau genug, es zu vernachlässigen? – sjsam

Antwort

2

Sie können nicht haben Aussagen außerhalb einer Funktion in C. Sie müssen die Anweisungen innerhalb einer Funktion bewegen oder die globale Variable zusammen mit seiner Deklaration initialisieren:

struct { 
    volatile uint8_t screenflag:1; 
    volatile uint8_t logoflag:1; 
    volatile uint8_t oledflag:1; 
    volatile uint8_t animationflag:1; 
    volatile uint8_t clockdialflag:1; 
    volatile uint8_t update_screen:1; 
    volatile uint8_t BLE_activity:1; 
    uint8_t ble_status:1; 
} oled_flag = { 
    .screenflag = 1, 
    .logoflag = 0, 
    .oledflag = 1, 
    .animationflag = 0, 
    .clockdialflag = 1, 
    .update_screen = 0, 
    .BLE_activity = 0, 
    .ble_status = 1 
}; 
+0

Bin ich richtig zu verstehen, dass dies die Initialisierungsmethode des neuesten C-Standards ist? Wäre die Initialisierung in älteren Versionen '{1,0,1,0,1,0,0,1}'? (Nur neugierig.) –

+0

@PaulOgilvie die vorgesehenen Initializer, die ich verwendet habe, sind seit C99 verfügbar (der neueste C-Standard ist C11). In Versionen vor C99 müssten Sie in der Tat die Syntax aus Ihrem Kommentar verwenden. – Kninnug

+0

Danke, kompiliert. Es ist eine neue Information für mich. Ich dachte, die Elemente von bitfeild könnten genauso initialisiert werden, wie Variablen mit eingebautem Datentyp initialisiert werden. –