Forum: Compiler & IDEs Klammerausdruck switch, welche Typen sind erlaubt?


von Udo S. (Firma: allround) (1udo1)


Lesenswert?

Hallo,

ich möchte den Klammerausdruck in der switch-Anweisung leserlich machen. 
Am liebsten würde ich im case-zweig eine Zeichenkette benutzen, also 
oben ,unten, rechts usw. Das sind die Motorpositionen.

Mit einer Integer-Variablen ist mir der Code klar. Aber der Einsatz 
einer String Variablen ist mir überhaupt nicht klar.

Wenn ich das richtig ausdrücke, dann handelt es sich wohl um eine 
Stringvariable im Klammerausdruck der switchanweisung, oder?


Beispiel

1
void(funk);
2
3
volatile uint16_t count=0;
4
5
volatile char str[6]; // ist bestimmt falsch deklariert, 
6
                      // ich weiss nicht,
7
                     //wie man den richtigen Typ deklariert
8
9
// --------------------- Timerinterrupt -----------------------
10
11
12
ISR(TIMER0_OVF_vect) 
13
{             
14
     
15
  switch(char str[6])
16
  { 
17
  case oben:  anweisung1; // So will ich es haben. 
18
                         //  Geht das überhaupt?
19
            
20
  case unten:  anweisung2;
21
22
        }  // Ende switch
23
24
} // Ende ISR
25
26
27
// --------------------- Hauptprogramm -----------------------
28
29
int main(void)
30
{
31
32
void(funk);
33
34
}
35
36
// --------------------- Funktion -----------------------
37
38
39
void funk()
40
{
41
    switch(count)
42
    {
43
    case  000: char str[oben];    break;  // Motor oben
44
          
45
    case  200: char str[unten];  break;  // Motor unten  
46
47
    // bin völlig ratlos, was hier stehen müsste!
48
          
49
    } // Ende switch
50
  
51
} // Ende funk

von Oliver (Gast)


Lesenswert?

Udo Scharnitzki schrieb:
> Aber der Einsatz
> einer String Variablen ist mir überhaupt nicht klar.

Was daran liegen dürfte, daß switch mit Strings schlicht nicht geht. Da 
bleibt dir nichts anderes übrig, als mit if /if else /else zu arbeiten. 
Sollte aber in deinem C-Buch stehen.

von Klaus W. (mfgkw)


Lesenswert?

In einem switch kannst du nur Zeiger, ganze Zahlen oder enum verwenden, 
keine Strings - also abzählbare Datentypen.
Keine float, keine Strings, keine Katzen...

Als Ausweg geht etwas wie if( !strcmp( string, "erster" ) ) { ... } else 
if( !strcmp( string, "zweiter" ) ) { ... } ...

Näheres steht in jedem guten C-Buch :-)

von Sudo (Gast)


Lesenswert?

Nimm doch einen Enum. Das ist sozusagen ein Int-Wert wird aber über 
Symbole angesprochen
1
 enum {LINKS, RECHTS, OBEN, UNTEN, STOP}MotorAnsteuerung;

LINKS entspricht dann 0
RECHTS 1
Oben 2
.
.
.

Gruß Matthias

von B. S. (bestucki)


Lesenswert?

In C gibt es keine Strings (als Datentyp), es gibt nur char-Arrays. Du 
könntest höchstens ein Zeichen deines Strings mit switch auswerten.

Wenn ich den Rest deines Codes anschaue: Besorg dir ein C-Buch

von Karl H. (kbuchegg)


Lesenswert?

@ TO

> Was daran liegen dürfte, daß switch mit Strings schlicht nicht geht.
> Da bleibt dir nichts anderes übrig, als mit if /if else /else zu
> arbeiten. Sollte aber in deinem C-Buch stehen.


Was jetzt nicht heissen soll, dass der Ansatz mit den Strings sauber 
ist. Da liegt schon der Murks begraben. Du brauchst keine Strings.
Wahrscheinlich hattest du vorher eine Lösung, die mit Zahlen gearbeitet 
hat. Richtig?

Was du also brauchst ist eine Möglichkeit, wie du Zahlen so 'verstecken' 
kannst, dass sie nicht mehr als Zahlen sondern als Bezeichnungen 
auftauchen.

Sudo hat schon eine (gute) Lösungsmöglichkeit aufgezeigt.

Eine andere, mit der Anfänger zunächst mal besser zurecht komment, ist
1
#define OBEN   0
2
#define UNTEN  1
3
4
5
volatile uint8_t Command;
6
7
ISR( ... )
8
{
9
  switch(Command)
10
  {
11
    case OBEN:
12
       ....
13
14
    case UNTEN:
15
       ....
16
  }
17
}
18
19
....
20
21
void funk()
22
{
23
    switch(count)
24
    {
25
      case  000: Command = OEBN;    break;
26
      case  200: Command = UNTEN;   break;
27
    } // Ende switch
28
  
29
} // Ende funk

Alles was du getan hast, ist mit dem Präprozessor eine Textersetzung zu 
vereinbaren. D.h. dort wo in deinem ursprünglichen Code zb 1 gestanden 
ist, kannst du jetzt UNTEN schreiben und der Präprozessor ersetzt dieses 
'UNTEN' dann wieder durch die Zahl, ehe compiliert wird.

Für den Compiler hat sich daher am Code eigentlich nichts geändert. Sehr 
wohl aber für dich als Mensch. Denn für dich macht es einen Unterschied 
ob dort Zahlen direkt stehen, oder Wörter mit denen du was anfangen 
kannst.

von amateur (Gast)


Lesenswert?

switch/case arbeitet nur mit ganzen Zahlen (+/-).

Das Beispiel von Karl Heinz mach im Grunde genommen nichts anderes als:

ISR
case 0: ...
case 1: ...

und in der Hauptroutine
case   0: Command = 0; break;
case 200: Command = 1; break;

Der wichtigste Unterschied ist der, den Code von Karl Heinz kannst Du in
4 1/2 Jahren noch relativ gut lesen, meine Ausführungen führen dann 
bestenfalls zum Hürdenspringen (Was ist 0? Was war noch mal 1 ...).
Die Funktion ist aber die Gleiche.

von Udo S. (Firma: allround) (1udo1)


Lesenswert?

@Karl-Heinz

Danke Dir Karl-Heinz!

Mit den Zahlen hat mein Programm einwandfrei funktioniert.


Deine Antwort ist eine Antwort, die ich mir vom Forum wünsche. Es geht 
also

doch; bloß man braucht jemanden, der etwas von der Materie versteht und

einem Selbststudierendem sodann und wann auf die Sprünge hilft. Eine 
solche

Antwort hilft Zeit zu sparen. Andere Forumsmitglieder empfehlen, das

Tutorium zu lesen oder ein C-Buch zu kaufen!!! Dort steht es auch 
irgendwo

verklausuliert oder verallgemeinert in den Weiten der Seiten. Bloß wo

genau diese Frage beantwortet sein könnte, das geben manche "Helfer" 
nicht

genau an. Das Forum ist doch dazu da weiterzuhelfen, wenn es irgendwo

klemmt, obwohl man schon etliche Threads durchgelesen hat.

Deshalb noch einmal einen besonderen Dank an Karl-Heinz, der schon des

Öfteren hier im Forum sachliche Hilfe geleistet hat! Das muss mal gesagt

werden.

Möchte den vorhergehenden Mitgliedern natürlich für die Antworten 
danken,

deren Tips mir später dienlich sein können.

von Thomas E. (thomase)


Lesenswert?

Udo Scharnitzki schrieb:
1
>     case  000: char str[oben];    break;  // Motor oben 
2
>     case  200: char str[unten];  break;  // Motor unten
3
>     // bin völlig ratlos, was hier stehen müsste!
4
>     } // Ende switch
5
> } // Ende funk
6
>

Lass die führenden Nullen weg! Auch wenn es schön tabellarisch 
übersichtlich aussieht. In diesem Falle kein Problem, weil 0 ist immer 
0. Egal in welchem Zahlensystem. Aber wenn da z.B. 020 steht, liest der 
Compiler 16(dezimal). Mit einer führenden Null wird eine Oktalzahl 
eingeleitet.

mfg.

von Karl H. (kbuchegg)


Lesenswert?

Udo Scharnitzki schrieb:

> Tutorium zu lesen oder ein C-Buch zu kaufen!!!

Oh, das empfehle ich dir auch!
Und zwar ganz dringend und eindrücklich.

Denn das, was du hier gefragt hast, das ist eine absolut leichte Übung 
für jeden, der seine Programmiersprache ordentlich gelernt hat.

Ich hab aber noch niemanden gesehen, der C durch anlassbezogenes 
Erfragen von Viertelwissen in Foren gelernt hat. In C gibt es hunderte 
Kleinigkeiten, die du ALLE wissen und beherrschen musst und auf die du 
nie kommst, wenn du keine ordentliche Literaturgrundlage hast. Von den 
absoluten Fallen red ich erst mal gar nicht.

Und dann landet man dann eben immer wieder bei jenen, die nicht glauben 
dass sie ein Buch brauchen, und dann eben genau all das nicht wissen und 
sich selbst damit das Leben als Programmierer unendlich schwer machen. 
Zumal es dann auch als Helfer nicht so einfach ist: Was weiß er, was 
weiß er nicht? Kann ich voraussetzen, dass er die banalen Dinge alle 
weiß. Oder doch nicht?

> verklausuliert oder verallgemeinert in den Weiten der Seiten.

Arbeite dein C-Buch von Anfang an seiten- und kapitelweise durch. Ein 
ordentliches Buch hat am Ende jedes Kapitels Übungsaufgaben für dich, 
mit denen du prüfen kannst, ob du den Kapitelinhalt verstanden hast oder 
nicht. Wenn du mit dem Buch durch bist, bist du zwar noch kein Profi, 
aber so in der Richtung 'gehobener Amateur' kann man das dann schon 
gelten lassen. Ohne Buch jedoch, schaffst du vielleicht den Übergang von 
Krabbelstube in den Kindergarten. Weiter kommst du aber in absehbarer 
Zeit nicht. Dazu fehlt dann einfach zu viel.
Und ja! Man muss, man kann und man soll eine Programmiersprache 
systematisch lernen. Ein Buch leistet das.


> genau an. Das Forum ist doch dazu da weiterzuhelfen, wenn es irgendwo
> klemmt,

Ja, wenn es klemmt.
Das Forum ist aber nicht dazu da, dir C von den Grundlagen her 
beizubringen. Wer in einem Physikforum eine mathematische Frage 
aufbringt, von dem muss man ausgehen können, dass er Formeln umformen 
kann.

von (prx) A. K. (prx)


Lesenswert?

Klaus Wachtler schrieb:
> In einem switch kannst du nur Zeiger

Keine Zeiger.

von Klaus W. (mfgkw)


Lesenswert?

stimmt, dachte es falsch.

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.