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?
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
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.
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
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.
@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.
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);
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++.
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 ;-)
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.
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.
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);
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?