Forum: Mikrocontroller und Digitale Elektronik Compiler meckert, dass ich ein ";" vergessen habe.


von ämpl (Gast)


Lesenswert?

hallo,

ich programmiere mit Keil µVision ein STM32 Discovery Board. Ich möchte 
binär! die LED 12 und 13 einschalten. Jetzt kommt aber die 
Fehlermeldung, dass ich ein ";" vergessen habe. Aber das habe ich hier 
doch drin?

1
#include "stm32f4xx.h"
2
3
int main ()
4
{
5
  
6
  
7
  //Taktversorgung für Port D anschalten
8
  RCC->AHB1ENR |= (1<<3);
9
  
10
  //Konfiguration für Port D
11
  GPIOD->MODER |= (1<<24);
12
  GPIOD->MODER |= (1<<26);
13
  GPIOD->MODER |= (1<<28);
14
  GPIOD->MODER |= (1<<30);
15
  
16
  //LED12 und LED13 einschalten
17
  GPIOD->BSRRL |= 0b11;
18
  
19
    
20
  
21
  do
22
  {
23
    
24
  }
25
  while (1);
26
}

Fehlermeldung:
***********************************************
main.c(17): error:  #65: expected a ";"
        GPIOD->BSRRL |= 0b11;
main.c: 0 warnings, 1 error
***********************************************

von ecke (Gast)


Lesenswert?

Vermutlich kennt der Keil CC keine Binärkonstanten.
0bXXX ist ein GCC-ismus.

von ich (Gast)


Lesenswert?

Ich vermute, er kommt mit dem "0b11" nicht zerecht und erkennt das nicht 
als Zahl.

von (prx) A. K. (prx)


Lesenswert?

Versteht Keil 0b11? Das gibts in Standard-C nicht.

von Torben H. (jera)


Lesenswert?

ämpl schrieb:
> do
>   {
>
>   }


Muss hier nicht ein ";" hin? Mit dem ";" sollte dass dann eine leere 
Anweisung sein. So ist es keine, oder irre ich mich?

von Bernd (Gast)


Lesenswert?

Könnte es sei, dass 0b11 vom Compiler nicht unterstützt wird?

von Steven M. (8023)


Lesenswert?

was passiert denn, wenn du es einklammerst?

von hopix (Gast)


Lesenswert?

Torben H. schrieb:
> Muss hier nicht ein ";" hin?

Torben hat schon recht
in eine do - while Schleife gehört auch eine (von mir aus auch leere) 
Anweisung

Hopix

von ämpl (Gast)


Lesenswert?

Bernd schrieb:
> Könnte es sei, dass 0b11 vom Compiler nicht unterstützt wird?

Weiß ich leider nicht, hex versteht er aber auf jeden Fall.

von Fpgakuechle K. (Gast)


Lesenswert?


von ämpl (Gast)


Lesenswert?

Steven M. schrieb:
> was passiert denn, wenn du es einklammerst?

Dann kommt folgende Fehlermeldung:
main.c(18): error:  #18: expected a ")"
        GPIOD->BSRRL |= (0b11);
main.c: 0 warnings, 1 error

hopix schrieb:
> Torben hat schon recht
> in eine do - while Schleife gehört auch eine (von mir aus auch leere)
> Anweisung

Daran liegt es aber nicht. Denn in hex funktioniert das Programm.

von Ich (Gast)


Lesenswert?

Meine Güte. Dann schreib es halt in hex. So wie es sich gehört. Ohne 
diese ganzen dämlichen Compilererweiterungen.

von (prx) A. K. (prx)


Lesenswert?

Torben H. schrieb:
> Muss hier nicht ein ";" hin?

Nein. Die Klammern dürfen leer sein.

von Hopix (Gast)


Lesenswert?

Leere Schleife? C Conform ist das aber nicht.

wie sieht es denn in HEX aus?

muß binärvergleich nicht mindesten 8 bit haben?

versuchs mal mit 0b0000011

Ich kenne Keil Compiler nicht aber binär vertragen nicht alle.
Hopix

von Jim M. (turboj)


Lesenswert?

Auf einem 32-Bitter sollte man sich die 0b-Schreibweise, die IIRC nur 
auf AVR-GCC funktionert schnell abgewöhnen. Die meisten Register sind 
32-Bittig, da kommt man zu schnell durcheinander.

Dein geposteter Code enthält außerdem zuviele Magische Zahlen. Für die 
meisten Flags gibt es passende #defines in den Headern, dann wird der 
Code viel besser lesbar.

von Falk B. (falk)


Lesenswert?

@Jim Meba (turboj)

>Auf einem 32-Bitter sollte man sich die 0b-Schreibweise, die IIRC nur
>auf AVR-GCC funktionert schnell abgewöhnen. Die meisten Register sind
>32-Bittig, da kommt man zu schnell durcheinander.

Auch auf einem 8-Bitter sind symbolische Namen deutlich besser.

von (prx) A. K. (prx)


Lesenswert?

Hopix schrieb:
> Leere Schleife? C Conform ist das aber nicht.

Doch.

Was nicht geht ist
  do while(1);
Da müsste es heissen:
  do ; while(1);
Ein Block entspricht aber einem Statement und darf selbst leer sein:
  do { } while(1);

von Hopix (Gast)


Lesenswert?

A. K. schrieb:
> Doch.

OK.
hab ich heute wieder was gelernt :-)

von nemesis... (Gast)


Lesenswert?

Ein Semikolon hinter einem do-, for- oder while-Schleifenbegin
wäre mir neu und meinem Referenzhandbuch auch.
Ansonsten sollte man den Debugger mal anschmeißen.

A. K. schrieb:
> C Conform ist das aber nicht.

Der TO benutzt ja auch C++.

von 1234567 (Gast)


Lesenswert?

nemesis... schrieb:
> Der TO benutzt ja auch C++.

???

Woran erkennst du das?

von Kicher (Gast)


Lesenswert?

1234567 schrieb:
> nemesis... schrieb:
>> Der TO benutzt ja auch C++.
>
> ???
>
> Woran erkennst du das?

...am "main.c" in der Fehlermeldung. Wenn es C wäre, müßte es "main.cpp" 
heißen. Oder war es doch andersrum ;-)

von Axel S. (a-za-z0-9)


Lesenswert?

Hopix schrieb:
> OK.
> hab ich heute wieder was gelernt :-)

So schön wie das ist: es wäre noch schöner gewesen wenn du das erst 
gelernt hättest und erst danach eine Anwort (nämlich: die richtige) 
hier geschrieben hättest. Für falsche Antworten kann sich der TE nix 
kaufen, und du kriegst im besten Fall eine schlechte Bewertung und 
landest im (für dich) schlimmsten Fall in einem Killfile.

von ämpl (Gast)


Lesenswert?

Danke an alle. Habe nun aber nochmal eine Frage:

Ich möchte in das Register den Wert 110000 schreiben, also das char "0".
Das hier funktioniert aber nicht:

GPIOD->BSRRL = "0";

Für mein Problem muss ich das mit einem char machen, also wäre es nett, 
wenn ihr mir weiterhelfen könntet.

von Torben K. (tokuhila)


Lesenswert?

|= 0x30?

von ich (Gast)


Lesenswert?

Nimm 0x30 statt "0".
Übrigens: Ein char wird mit '0' geschrieben statt mit "0"

von Stefan F. (Gast)


Lesenswert?

"0" ist ein String.
'0' ist ein Char.

von (prx) A. K. (prx)


Lesenswert?

nemesis... schrieb:
>> C Conform ist das aber nicht.
>
> Der TO benutzt ja auch C++.

Als ob das einen Unterschied machen würde.
Und als ob Keil C++ verstünde.

> Ein Semikolon hinter einem do-, for- oder while-Schleifenbegin
> wäre mir neu und meinem Referenzhandbuch auch.

Wenn du damit
  do ; while(1);
meinst: Zwischen do und while steht genau 1 Statement. Völlig leere 
Statements gibts aber nicht, weniger als das Semikolon geht deshalb 
nicht. Ein Compound Statement ist nicht zwingend, weshalb auch das geht, 
ist nur wenig gebräuchlich:
  do foo(); while(1);

von ämpl (Gast)


Lesenswert?

Ich muss aber ein char verwenden für mein Problem.

Stefan U. schrieb:
> "0" ist ein String.
> '0' ist ein Char.

Danke, das hat mir weitergeholfen. Nun funktioniert es soweit.

Kann mir aber bitte noch jemand sagen, wie ich eine Zahl in einen String 
umwandel?

von user (Gast)


Lesenswert?

mit itoa

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

ämpl schrieb:
> Kann mir aber bitte noch jemand sagen, wie ich eine Zahl in einen String
> umwandel?

Das steht in jeden C-Buch.

von Peter P. (peter_p781)


Lesenswert?

0b'1001'0001'0001'0010
gibts ab C++14 oder 18 oder so.

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.