Forum: Mikrocontroller und Digitale Elektronik Switch Case und Character


von Daniel F. (fedex998)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
ich arbeite zur Zeit mit Atmel Studio 7.0 und einem Arduino Nano mit 
Atmega328P.

Ich bin dabei ein einstelliges 7-Segment-Display mit einem 
Schieberegister anzusteuern.
Das funktioniert auch ganz gut. Ich kann in mein:

char muster[] = {...}

1 und 0 eingeben und die jeweiligen Segmente leuchten auf. ALLES SUPER.

Jetzt dachte ich mir, damit ich die Zahlen 0-9 ausgeben kann pack ich 
das in eine switch-case Abfrage. Jedoch kommt da immer die 
Fehlermeldungen:

crosses initialization of 'char muster [8]'
'char muster [8]' previously declared here

Könnt ihr mir bitte sagen was ich bei der switch case abfrage falsch 
mache.

Vielen Dank!!

von catweazle (Gast)


Lesenswert?

char * muster;

case 1:
muster = {0,1,...};
break;
case 2:
muster = {1,0,...};

von STK500-Besitzer (Gast)


Lesenswert?

Daniel F. schrieb:
> Jetzt dachte ich mir, damit ich die Zahlen 0-9 ausgeben kann pack ich
> das in eine switch-case Abfrage. Jedoch kommt da immer die
> Fehlermeldungen:
>
> crosses initialization of 'char muster [8]'
> 'char muster [8]' previously declared here

Eine Deklaration kann nur ein Mal erfolgen.
Deine Switc-Case-Geschichte kannst du dir sparen, wenn du ein Array mit 
10 Einträgen und einer Breite von 8 verwendest.

von Peter D. (peda)


Lesenswert?

Man muß das Fahrrad nicht immer wieder neu erfinden, bzw. nicht mit 5 
rechteckigen Rädern.

Für 7S-Konvertierung und SPI-Ausgabe gibt es reichlich Codebeispiele.

von Peter D. (peda)


Lesenswert?

STK500-Besitzer schrieb:
> Deine Switc-Case-Geschichte kannst du dir sparen, wenn du ein Array mit
> 10 Einträgen und einer Breite von 8 verwendest.

Vorzugsweise 8 Bit (uint8_t), das vereinfacht die SPI-Ausgabe.

von Rolf M. (rmagnus)


Lesenswert?

Daniel F. schrieb:
> Könnt ihr mir bitte sagen was ich bei der switch case abfrage falsch
> mache.

Du kannst nicht abhängig von einer Bedingung unterschiedliche Variablen 
erzeugen und dann später dann an einer Stelle die benutzen, die vorher 
halt erzeugt wurde.

Ich würde die 8 Bit für das Muster ja einfach in einem uint8_t speichern 
statt in einem Array aus char.

von Dirk B. (dirkb2)


Lesenswert?

Im Scope von switch definierst du eine Variable erneut.
Das geht nicht. Zumal die beim Ende vom switch ungültig wird.

von Dirk B. (dirkb2)


Lesenswert?

Rolf M. schrieb:
> Du kannst nicht abhängig von einer Bedingung unterschiedliche Variablen
> erzeugen

Das geht schon - also unterschiedliche - nur dieselbe Variable mehrmals 
geht nicht.

von Carl D. (jcw2)


Lesenswert?

Rolf M. schrieb:
> Daniel F. schrieb:
>> Könnt ihr mir bitte sagen was ich bei der switch case abfrage falsch
>> mache.
>
> Du kannst nicht abhängig von einer Bedingung unterschiedliche Variablen
> erzeugen und dann später dann an einer Stelle die benutzen, die vorher
> halt erzeugt wurde.
>
> Ich würde die 8 Bit für das Muster ja einfach in einem uint8_t speichern
> statt in einem Array aus char.

Zumal man diese 8Bit als Konstante auch so schreiben kann:
1
muster = 0b01101001;
Und damit optisch jedes einzelne Bit sehen kann;

von Rolf M. (rmagnus)


Lesenswert?

Dirk B. schrieb:
> Rolf M. schrieb:
>> Du kannst nicht abhängig von einer Bedingung unterschiedliche Variablen
>> erzeugen und dann später dann an einer Stelle die benutzen, die vorher
>> halt erzeugt wurde.
>
> Das geht schon - also unterschiedliche - nur dieselbe Variable mehrmals
> geht nicht.

Nein, auch wenn es verschiedene Variablen wären, würde das nicht so 
gehen. Wenn man jeder einen anderen Namen gibt, wird die gleiche 
Fehlermeldung kommen.
Wie sollte das auch funktionieren? Was soll passieren, wenn du nach dem 
switch versuchst auf eine Variable zuzugreifen, die in einem der nicht 
ausgeführten cases definiert wurde?

von Dirk B. (dirkb2)


Lesenswert?

Rolf M. schrieb:
> Nein, auch wenn es verschiedene Variablen wären, würde das nicht so
> gehen. Wenn man jeder einen anderen Namen gibt, wird die gleiche
> Fehlermeldung kommen.

Warum sollte
crosses initialization of 'xxx'
'xxx' previously declared here
kommen, wenn man es erstmals definiert.


Rolf M. schrieb:
> Was soll passieren, wenn du nach dem
> switch versuchst auf eine Variable zuzugreifen, die in einem der nicht
> ausgeführten cases definiert wurde?

Das ist ein anderes Problem (welches ich aber schon angesprochen hatte).

von Rolf M. (rmagnus)


Lesenswert?

Dirk B. schrieb:
> Rolf M. schrieb:
>> Nein, auch wenn es verschiedene Variablen wären, würde das nicht so
>> gehen. Wenn man jeder einen anderen Namen gibt, wird die gleiche
>> Fehlermeldung kommen.
>
> Warum sollte
> crosses initialization of 'xxx'
> 'xxx' previously declared here
> kommen, wenn man es erstmals definiert.

Ok, der zweite Fehler natürlich nicht. Der erste aber schon.

> Rolf M. schrieb:
>> Was soll passieren, wenn du nach dem
>> switch versuchst auf eine Variable zuzugreifen, die in einem der nicht
>> ausgeführten cases definiert wurde?
>
> Das ist ein anderes Problem (welches ich aber schon angesprochen hatte).

Das ist genau das Problem. Eine Variable kann nicht an einer bestimmten 
Stelle vom Programm abhängig von einer Bedingung definiert oder nicht 
definiert sein.

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.