Forum: Compiler & IDEs Problem mit CodeBlocks und util/atomic


von R. F. (inet_surfer88)


Lesenswert?

Hallo,

ich bin von AtmelStudio (Win) auf CodeBlocks und AVR-GCC(Debian9.1) 
umgestiegen.

Unter AtmelStudio habe ich in einem Programm folgende Zeile:
1
ATOMIC_BLOCK(ATOMIC_FORCEON) {sx_kopie_rueckgabewert=sx_rueckgabewert;}
Das ganze funktioniert ohne Probleme.

Die gleiche Zeile habe ich jetzt in CodeBlocks eingegeben. Hierbei 
erhalte ich folgende Ausgabe:
1
||=== Build: Release in 0036_003_v1 (compiler: GNU GCC Compiler for AVR) ===|
2
main.c||In function ‘main’:|
3
main.c|60|error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode|
4
main.c|60|note: use option -std=c99, -std=gnu99, -std=c11 or -std=gnu11 to compile your code|
5
main.c|51|warning: variable ‘sx_daten’ set but not used [-Wunused-but-set-variable]|
6
main.c|51|warning: variable ‘sx_adresse’ set but not used [-Wunused-but-set-variable]|
7
||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 1 second(s)) ===|

Die Warnungen mit den unbenutzen Variablen kann man erst mal vergessen. 
Das Programm ist noch nicht fertig geschrieben. Zeile 60 ist die oben 
stehende Zeile mit dem Atomic-Block.
Hier meine while-Schleife in main:
1
    while(1)
2
    {
3
        //Selectrix-Bus auswerten
4
        ATOMIC_BLOCK(ATOMIC_FORCEON) {sx_kopie_rueckgabewert=sx_rueckgabewert;}
5
        sx_daten=(uint8_t)sx_kopie_rueckgabewert&255;
6
        sx_kopie_rueckgabewert>>=8;
7
        sx_adresse=(uint8_t)sx_kopie_rueckgabewert&255;
8
9
10
    }

Muss ich hier in CodeBlocks noch eine Einstellung vornehmen, und wenn 
ja, wo finde ich diese?

Ich habe bereits folgendes bei den Compilereinstellungen versucht:
"Have gcc follow the 1999 ISO C language standard [-std=c99]"
Allerdings ohne Erfolg.

von R. F. (inet_surfer88)


Lesenswert?

Nachtrag: CodeBlocks Version 16.01
hatte ich vergessen

von Rainer V. (rudi994)


Lesenswert?

R. F. schrieb:
> Zeile 60 ist die oben stehende Zeile mit dem Atomic-Block.

Sicher, daß das die Zeile 60 ist?

> main.c|60|error: ‘for’ loop initial declarations are only allowed in C99
> or C11 mode|

Diese Meldung erscheint, wenn ein Code wie 'for (int i = 0; ...)' in 
einer älteren C-Version compiliert wird. In for(...) ist die 
Typdefinition für die Zählervariable nicht zulässig (es geht aber z.B. 
in C++ oder C99). Die Option "1999 ISO C language standard [-std=c99]" 
kann ich leider nicht ausprobieren, ich habe CodeBlocks 13.12. Ansonsten 
kann ich o.g. Code-Schnipsel compilieren, wenn ich es etwas umbaue und 
fehlende Teile ergänze. LG

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Rainer V. schrieb:
> Die Option "1999 ISO C language standard [-std=c99]"
> kann ich leider nicht ausprobieren, ich habe CodeBlocks 13.12.

Wenn die IDE dem Compiler und Linker keine Optionen übergeben kann, ist 
sie Schrott.
Ich kenne allerdings keine IDE, die das nicht kann.
Notfalls läßt man die IDE ein selbstgeschriebenes make ausführen.

von Peter D. (peda)


Lesenswert?

R. F. schrieb:
> Ich habe bereits folgendes bei den Compilereinstellungen versucht:
> "Have gcc follow the 1999 ISO C language standard [-std=c99]"
> Allerdings ohne Erfolg.

Versuch mal --std=gnu99

von Felix F. (wiesel8)


Angehängte Dateien:

Lesenswert?

Project -> Build Options

Links das entsprechende Target auswählen!
Bei "Other compiler options" kann es auch manuell eingetragen werden.

mfg

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Felix F. schrieb:
> Project -> Build Options

Das ist C++11, das ist für g++ (und folglich C++-Programme), was nicht 
das gleiche ist wie C11 bzw. C99.

von Felix F. (wiesel8)


Lesenswert?

Rufus Τ. F. schrieb:
> Felix F. schrieb:
>> Project -> Build Options
>
> Das ist C++11, das ist für g++ (und folglich C++-Programme), was nicht
> das gleiche ist wie C11 bzw. C99.

Das Bild war auch nur als Referenz gedacht, wo er zu suchen hat, nicht 
dass er jeden Haken genau so setzt wie ich.

mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nun, dem Eröffnungsposting nach wurde das Häkchensetzen wohl schon mal 
ausprobiert:

R. F. schrieb:
> Ich habe bereits folgendes bei den Compilereinstellungen versucht:
> "Have gcc follow the 1999 ISO C language standard [-std=c99]"

von Hmmm (Gast)


Lesenswert?

R. F. schrieb:
> Muss ich hier in CodeBlocks noch eine Einstellung vornehmen

In den Compiler Settings kannst Du unter "Other settings" das Logging 
der kompletten Toolchain-Aufrufe aktivieren und sie mit denen von Atmel 
Studio vergleichen.

von R. F. (inet_surfer88)


Lesenswert?

Hallo,

das Problem ist mittlerweile gelöst.

Es war definitiv die Zeile mit dem Atomic. Wenn ich diese Zeile gelöscht 
habe, war die Meldung weg.

Zur Lösung:
Ich musste den Haken wie im Eingangsposting beschrieben setzen.
Allerdings gibt es dieses Fenster 2 mal.

Der 1. Weg ist "Settings -> Compiler". Es öffnet sich das Fenster 
"Global Compiler Settings". Hier hatte ich den Haken gesetzt. Allerdings 
ohne Erfolg.

Der 2. Weg den ich gerade gefunden habe ist "Project -> Build options".
Es öffnet sich das Fenster"Project Build Options". Wenn ich hier den 
Haken setze, dann ist die Fehlermeldung weg.

Vielen Dank an alle für eure Beiträge und eure Mühe.

von Markus F. (mfro)


Lesenswert?

Jetzt kompiliert das Ding zwar, aber ich fürchte, die meisten der 
Beteiligten haben lediglich gelernt, wie man in der IDE Compileroptionen 
einstellt.

Ohne Internet und IDE hätte man sich auf den Hosenboden setzen und 
verstehen müssen:

1. wie und warum da plötzlich eine for-Schleife ins Programm kommt
2. warum das zu einem Fehler führt
3. was ATOMIC_BLOCK() macht
4. warum es das so macht, wie es das macht
5. warum das überhaupt da steht

Schöne neue Welt.

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.