Forum: Mikrocontroller und Digitale Elektronik Switch schachteln


von Sören Rohweder (Gast)


Lesenswert?

Spricht etwas gegen solch eine konstruktion und wenn ja was?

das ganze auf einem avr-gcc

switch(class_G){
  case 0xD3:
  //-------------------
        // Check out Status Messages
  //-------------------
  switch(ctype_G){
    case TY_UTC_TIME:
      SCH_Add_Task(recvTime,2,0);
    break;
  }//ctype_G
        //-------------------
        break;//Terminal Status Messages
}//class_G

von holger (Gast)


Lesenswert?

Da spricht nichts dagegegen wenn du zu einem { auch
das passende } einfügst.

von Sören Rohweder (Gast)


Lesenswert?

Mh... das hab ich doch eigentlich und wenn nich würde ja wenisgtens der 
compiler maulen ... oda ?

von Axel (Gast)


Lesenswert?

Was meinst du genau? Was soll der Code machen?

Dagegen spricht nix, aber bei einer switch-Anweisung wird der Compiler 
eher eine if-else-Kaskade generieren, wenn die case-Werte zu weit 
auseinander liegen als eine Sprungtabelle anzulegen.

von holger (Gast)


Lesenswert?

Vergiss mein Post gngngngn

von Sören Rohweder (Gast)


Lesenswert?

Also wenn class_G = 0xD3 ist dann soll er den nächsten switch abarbeiten 
(ctype_G) mehr eigentlich nicht.

Er Springt nur immer raus ohne den nächsten Switch anzuspringen obwohl 
class_G den Wert 0xD3 hat

von Axel (Gast)


Lesenswert?

Meine Erfahrung ist, das Debuggen mir printf() keine Sünde ist, wenn man 
sich einfach nicht mehr zu helfen weiss und der Code einfach nicht das 
macht, was er soll. Manchmal kommt das die Erleuchtung recht schnell :)

von Sören Rohweder (Gast)


Lesenswert?

Hehe der ist gut, ich hab nichts wo ich hinprinten könnte ...

von Axel (Gast)


Lesenswert?

Hmm....hat der Controller keinen UART oder einen Port-Pin übrig? Und 
auch keine JTAG oder einen Debugger da? Schau dir halt mal den assembler 
code an, den der gcc aus dem source generiert. Vielleicht wird dann 
klar, was da passiert.

von holger (Gast)


Lesenswert?

Oder vergiss meinen letzten Post doch nicht ;)
Immer diese "ich spar mir ne Zeile zugunsten der
Unübersichlichkeit" Mentalität. Die geht mir auf den
Keks.

switch(a)
 {
 }



>Also wenn class_G = 0xD3 ist dann soll er den nächsten switch abarbeiten
>(ctype_G) mehr eigentlich nicht.

>Er Springt nur immer raus ohne den nächsten Switch anzuspringen obwohl
>class_G den Wert 0xD3 hat

Dann pack den nächsten switch() in eine Unterroutine.
Funktioniert das so wirklich nicht. Müsste man glatt mal
ausprobieren ;)

von Sören Rohweder (Gast)


Lesenswert?

das ne gute idee ... danke

und schönen abend noch

von Karl H. (kbuchegg)


Lesenswert?

> Funktioniert das so wirklich nicht. Müsste man glatt mal
> ausprobieren ;)

Klar funktioniert das. Warum auch nicht?
Nur: Der Code ist sicher wieder nicht der Originalcode
sondern irgendwas für das Posting zurecht gemachtes.
Mit dem Effekt, dass im Originalcode wieder irgendein
anderes Problem vorliegt und der switch-case muss es
dann ausbaden :-)

von Sören Rohweder (Gast)


Lesenswert?

nein es ist der original code davor ist nur eine Bedingung(if) ob der 
switch überhaupt angesprungen werden soll.
Kann es daran liegen das class_G ein char ist ?

von Karl H. (kbuchegg)


Lesenswert?

Sören Rohweder wrote:
> nein es ist der original code davor ist nur eine Bedingung(if) ob der
> switch überhaupt angesprungen werden soll.
> Kann es daran liegen das class_G ein char ist ?

Nein.


>Er Springt nur immer raus ohne den nächsten Switch anzuspringen obwohl
>class_G den Wert 0xD3 hat

Was bedeutet das?
Welcher nächster switch.

Zeig doch mal ein bischen mehr aus der Umgebung und was
genau wann passiert.



von Sören Rohweder (Gast)


Lesenswert?

So nun hab ich es selber herausgefunden:
class_G ist ein 'char' den kann man nicht gegen ein unsigend Hex Wert 
vergleichen da der Compiler in den Assembler einen check einbaut, der 
auf das Negativ Bit überprüft.

Ich hab mir das gerade im Assembler nochmal angeschaut, leider bin ich 
da nun nicht vollends durchgestiegen, weiss aber das es funktioniert 
wenn ich den char vorher nach int caste.

von Karl H. (kbuchegg)


Lesenswert?

signed und unsigned mischen (ob ein char signed oder unsigned ist
ist implementationsabhängig) führt immer wieder zu Problemen
und Überraschungen.

Daher solltest du dir angewöhnen:
Wenn du auf Byte-Ebene arbeitest dann gibt es nur 'unsigned char'
oder uint8_t. Alles andere führt über kurz oder lang immer
wieder zu Problemen.

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.