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
volatileuint16_tcount=0;
4
5
volatilecharstr[6];// ist bestimmt falsch deklariert,
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.
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 :-)
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
@ 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
volatileuint8_tCommand;
6
7
ISR(...)
8
{
9
switch(Command)
10
{
11
caseOBEN:
12
....
13
14
caseUNTEN:
15
....
16
}
17
}
18
19
....
20
21
voidfunk()
22
{
23
switch(count)
24
{
25
case000:Command=OEBN;break;
26
case200: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.
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.
@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.
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.
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.