Compiler meckert, dass ich ein ";" vergessen habe.

Gast #4524668
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
***********************************************
Gast #4524695
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.
Gast #4524714
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
#4524717
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.
#4524719
@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.
Gast #4524841
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++.
#4524927
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.
Gast #4525011
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.
#4525025
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);
Gast #4525086
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.