www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Case-Anweisung mit Zeichen


Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie sitz ich mal wieder auf dem Schlauch. Ich will mittels 
Case-Anweisung in Abhängigkeit meiner Eingangssignale verschiedene 
Funktionen ausführen. Jedoch sobald ich einen Zeichen mehrmals verwende, 
hier 'D' 'P' und 'L' 'P', kommt es zu einer Fehlermeldung. Wie kann ich 
das umgehen? Habt ihr irgend eine Idee?

switch (p[0] & p[1])
{
  case 'D' & 'P':
  ...
  break;

  case 'G' & 'C':
  ...
  break;

  case 'L' & 'P':
  ...
  break;
}

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kannst Du mal die Fehlermeldung geben?

Gruß
Tom

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die gewünschte Fehlermeldung:

354:     case 'L' & 'P':
E 102: duplicate case or default label

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht doch alles in der Fehlermeldung.
Die Case-Anweisung kann nur ein Zeichen überprüfen.

Geht nur so:
if(!strncmp(p, "DP", 2))
{
...
}
else if(!strncmp(p, "GC", 2))
{
...
}
else if(!strncmp(p, "LP", 2))
{
...
}

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mach mal Klammern um die & in den CASE Zweigen. nicht dass case die 
beiden Werte einzeln auswertet.

Tom

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest dir mal überlegen, was du da eigentlich genau machst!

& ist der bitweise Und-Operator.
> p[0] & p[1]

Das hier heißt mit nichten "lieber Compiler, nimm doch mal bitte das 
Zeichen p[0] und das Zeichen p[1] und mach das nachfolgende einfach für 
beide".

Sondern die beiden Zeichen werden bitweise verknüpft zu einem neuen. In 
dem neuen sind alle Bits gesetzt, wo jeweils in beiden Ausgangszeichen 
auch die Bits gesetzt waren.

Das selbe gilt für die case-Labels. Zum Glück meckert der Compiler da 
rechtzeitig.

Autor: NoOne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn es unbeding eine switch Anweisung sein soll:

switch (p[0] | (p[1]<<8))
{
  case 'D' | ('P'<<8):
  ...
  break;

  case 'G' | ('C'<<8):
  ...
  break;

  case 'L' | ('P'<<8):
  ...
  break;
}

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NoOne schrieb:
> Wenn es unbeding eine switch Anweisung sein soll:
> ...


Hör doch auf, Anfängern so ein Unsinn zu zeigen! Was soll der Blödsinn?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Du solltest dir mal überlegen, was du da eigentlich genau machst!
>
> & ist der bitweise Und-Operator.
Nö.. in VHDL ist das & der Verkettungsoperator für Vektorliterale. Wo 
steht das er C oder was syntaktisch kompatibles nutzt? ;P

Und in PHP funktionirt ein switch/case auch auf Zeichenketten oder auf 
boolean werten:
switch(true) {
 case a == b:

 case a == 7:

.
.
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus schrieb:
> Hör doch auf, Anfängern so ein Unsinn zu zeigen! Was soll der Blödsinn?

Das ist überhaupt kein Unsinn, habe ich selber auch so gemacht.

Ein 16Bit Vergleich ist deutlich schneller und codesparender als 
strncmp.


Peter

Autor: avion23 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Klaus schrieb:
>> Hör doch auf, Anfängern so ein Unsinn zu zeigen! Was soll der Blödsinn?
>
> Das ist überhaupt kein Unsinn, habe ich selber auch so gemacht.
>
> Ein 16Bit Vergleich ist deutlich schneller und codesparender als
> strncmp.
>
>
> Peter

Kann da noch jemand etwas zu sagen? Ich sehe keinen Fehler und 
Seiteneffekte dürften auch keine auftreten.
Zwei Bytes vergleichen muss ich eh und genau das ist hier der Fall, also 
auch optimale Laufzeit.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avion23 schrieb:
> Peter Dannegger schrieb:
>> Klaus schrieb:
>>> Hör doch auf, Anfängern so ein Unsinn zu zeigen! Was soll der Blödsinn?
>>
>> Das ist überhaupt kein Unsinn, habe ich selber auch so gemacht.
>>
>> Ein 16Bit Vergleich ist deutlich schneller und codesparender als
>> strncmp.
>>
>>
>> Peter
>
> Kann da noch jemand etwas zu sagen?

Ja.
Solange du C-Anfänger bist solltest du in erster Linie danach trachten 
sauberen C-Code zu schreiben und erst in zweiter Linie auf die 
effizienteste Lösung schielen.

Und besorg dir ein C-Buch

Edit: Seh gerade, du bist nicht der ursprüngliche Fragesteller. Die 
Antwort war für diesen gedacht.

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die rege Beteiligung, dank eurer Hilfe läuft jetzt alles wie 
es soll.

Jetzt zu einer 2. Frage. Ich schicke mittels RS232 Geschwindigkeits- und 
Zeitdaten zu meinem Controller (z.B V6000T500) und möchte diese 
speichern. Diese kann ich jetzt in die dafür festgelegten Variablen 
speichern, bis hier ist alles kein Problem.

Jedoch wie realisiere ich es, wenn ich jetzt meinen oben genannten 
Befehl (VxxxxTxxx) mehrfach hinter ein ander schicke und speichern will?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens Sch schrieb:

> Jedoch wie realisiere ich es, wenn ich jetzt meinen oben genannten
> Befehl (VxxxxTxxx) mehrfach hinter ein ander schicke und speichern will?

besorg dir ein C-Buch und arbeite es durch.

Das Array, genauso wie eine Struktur sind schon lange erfunden und 
werden im ersten Drittel deines zu erwerbenden C-Buches besprochen. Die 
restlichen 2/3 deines noch zu kaufenden C-Buches verwenden diese 
C-Sprachmittel dann extensiv um darauf aufbauend weitere C-Sprachmittel 
dem Leser bekannt zu machen bzw. Konzepte zu vermitteln.

Von den hunderten kleinen Fallen, die es in C gibt, reden wir erst mal 
gar nicht. Auch die kommen in deiner Literatur vor und werden erwähnt 
bzw. Lösungsmöglichkeitne angeboten, was man tun kann, damit es nicht zu 
Problemen kommt.

So ein C-Buch hat nur Vorteile. Nur haben und durcharbeiten müsste man 
halt eines.

Autor: Thomas Burkhart (escamoteur)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
D.h. in dem vom Comiler angemäkelten Case Fall kommt beim Bitweise & 
zufällig das gleiche raus. Hatte im ersten Moment den Denkfehler, dass 
da ja jedesmal was anderes rauskommen müsste, aber das ist ja nicht der 
Fall.

Gruß
Tom

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl Heinz

Das wäre vielleicht besser. Habe gerade im Netz "C in 21 Tagen" 
gefunden. Das werde ich mir wohl mal zu gemüte führen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Solange du C-Anfänger bist solltest du in erster Linie danach trachten
> sauberen C-Code zu schreiben und erst in zweiter Linie auf die
> effizienteste Lösung schielen.

Was ist an einem Switch denn "nicht sauber"?

Ich finde so ein Switch auch deutlich besser lesbar, als umständliche 
if-else-Monster.

Und als Anfänger sollte man erst recht lernen, wie man 2 Bytes in 16Bit 
wandelt und zurück. Denn solche Grundlagen braucht man alle Nase lang.


Peter

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Hilfe! Jetzt zu einer neuen Frage:

Ich verwende die oben beschrieben case-Anweisung und möchte bei einem 
bestimmten Befehl in einer while-Schleife verbleiben, bis ein weiterer 
Befehl mich da wieder raus holt. Jedoch funktioniert es nicht so wie es 
soll. D.h. ich komme rein aber nicht mehr hinaus!

switch (p[0] | (p[1]<<8))
{
  case 'D' | ('P'<<8):
  ...
  break;

  case 'G' | ('C'<<8):
  ...
  break;

  case 'L' | ('P'<<8):
  x=2;
  while(x!=1)
  {
    if(p[0]=='1'){...}
    else if(p[0]=='2'){...}
    else if(p[0]=='3'){...}
    else if(p[0]=='4'){...x=1;}
  }
  break;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens Sch schrieb:

>   x=2;
>   while(x!=1)
>   {
>     if(p[0]=='1'){...}
>     else if(p[0]=='2'){...}
>     else if(p[0]=='3'){...}
>     else if(p[0]=='4'){...x=1;}
>   }


und wie kriegt p[0] innerhalb dieser while Schleife einen neuen Wert?

Ich werde das Gefühl nicht los, das der komplette Ansatz (inklusive dem 
case) schon verkorkst ist.

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Prinzipiell wollte ich den mittels Hyperterminal etc. schicken. Aber das 
funktioniert ja nicht;)!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens Sch schrieb:
> Prinzipiell wollte ich den mittels Hyperterminal etc. schicken. Aber das
> funktioniert ja nicht;)!

Nein.

Wo in

>   x=2;
>   while(x!=1)
>   {
>     if(p[0]=='1'){...}
>     else if(p[0]=='2'){...}
>     else if(p[0]=='3'){...}
>     else if(p[0]=='4'){...x=1;}
>   }

ist eine Anweisung, so dass man sagen kann: Hier kriegt p[0] einen neuen 
Wert, hier ist die Stelle an der etwas passiert, so dass als Folge davon 
die Schleife verlassen wird, indem x auf 1 gesetzt wird.

Variablen ändern nicht magisch ihren Wert, nur weil du im Hyperterminal 
auf eine Taste drückst.


Jetzt bin ich mir ganz sicher. Der ganze Ansatz (inklusive case) ist 
verkorkst.

Autor: Jens Sch (jenser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Neue Idee!

Ich verwende meine Case-Anweisung wie bisher, da diese ja auch 
funktioniert und sich mittels Hterm ansprechen lässt. Nur lass ich 
diesmal die While-Schleife weg und realisiere alles am Funktionsende mit 
if-Schleifen.

if(x1==1){
  switch (p[0] | (p[1]<<8))
  {
    case 'D' | ('P'<<8):
    ...
    break;

    case 'G' | ('C'<<8):
    ...
    x2=1;
    x1=0;
    break;

    case 'L' | ('P'<<8):
    ...
    x3=1;
    x1=0;
    break;
  }
}
if(x2==1){...}
else if(x2==1){...}
else if(x3==1){...}

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nunja.. falls p[] neb globales array ist und der Inhalt in der rs232 ISR 
geändert wird sehe ich eigentlich kein Problem dabei.

Allerdings ist vielleicht ne Zustandsmaschine besser geeignet für sowas?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.