Hi an alle, irgendwie hadere ich gerade mit der If Syntax. Ich habe 3 Bedingungen. Wenn eine davon zutrifft soll keine der anderen mehr durchgegangen werden. Ich benutze WinAVR mit GCC. Gibt es beim GCC kein "else if" wie in C#? Diese würde genau das machen soweit ich mich erinnere. Aber wenn ich in GCC "else if" versuche zu kompilieren mekkert er, dass ich ein else ohne if gemacht habe. Dies hat bei meinem Beispiel den Hintergrund, dass nicht sofort nach dem 2ten If in das 3te gesprungen werden soll. Aufgrund der erfüllten Bedingung würde dies passieren. Da es sich aber um eine zeitrelevante Anwendung handelt geht mir dieser Sprung zu schnell. Es soll nach jedem If bei dem die Bedingung zutrifft alle anderen Ifs ignoriert werden. Ich habe es auch schon mit goto probiert, aber das hat mehr Probleme als Nutzen gebracht. Irgendwie tat dann der Code nicht mehr das was ich wollte. Ich hatte auch schon an einen case gedacht, aber ich wüsste nicht wie ich eine so komplexe Bedingung dort unterbringen könnte. Mit einem Case kann man doch nur eine Variable bedienden, oder täusche ich mich da? Der Case hätte den Vorteil, dass ich mit einem break aus dem kompletten Case aussteigen könnte. Vielleicht kann mir hier jemand weiter helfen? if((test >=1 && test <=5) && var1==0){ // do soemthing var1=1; } if((test >=10 && test <=15) && var1==1){ // do soemthing var2=1; } if((test >=10 && test <=15) && var2==1){ // do soemthing var3=1; } Vielen Dank.
El Nino schrieb: > Ich benutze WinAVR mit GCC. > Gibt es beim GCC kein "else if" wie in C#? > Diese würde genau das machen soweit ich mich erinnere. > Aber wenn ich in GCC "else if" versuche zu kompilieren mekkert er, dass > ich ein else ohne if gemacht habe. Meine Kristallkugel sagt mir gerade, dass Du zwischen schließender geschweifter Klammer des if()-Blocks und dem else ein Semikolon hingeschrieben hast. Mach das weg da. Viele Grüße, Simon
else if geht doch:
1 | if((test >=1 && test <=5) && var1==0) |
2 | {
|
3 | // do soemthing
|
4 | var1=1; |
5 | }
|
6 | else if((test >=10 && test <=15) && var1==1) |
7 | {
|
8 | // do soemthing else
|
9 | var2=1; |
10 | }
|
11 | else if((test >=10 && test <=15) && var2==1) |
12 | {
|
13 | // else do soemthing else
|
14 | var3=1; |
15 | }
|
Welche Werte haben Var1, Var2 und Var3 denn vorher? Ohne diese Information ist der ganze Code erst mal Gnampf. Übrigens finde ich es ganz nett, wenn an solchen Stellen der Code mit geschweiften Klammern aufgehübscht wird:
1 | if (x) |
2 | {
|
3 | }
|
4 | else
|
5 | {
|
6 | if (y) |
7 | {
|
8 | }
|
9 | else if(z) |
10 | {
|
11 | }
|
12 | }
|
Dann kann nicht nur der in C denkende Geek sofort erkennen, was gemeint ist, sondern auch der Wald- und Wiesenprogrammierer von Meier-Müller-Schulze IT.
Philipp Klostermann schrieb: > Übrigens finde ich es ganz nett, wenn an solchen Stellen der Code mit > geschweiften Klammern aufgehübscht wird: Das macht dann auch deutlich, das es eben kein "elseif" gibt, sondern nur if und else. Oliver
Peter schrieb: > else if geht doch: >
1 | > if((test >=1 && test <=5) && var1==0) |
2 | > { |
3 | > // do soemthing |
4 | > var1=1; |
5 | > } |
6 | > else if((test >=10 && test <=15) && var1==1) |
7 | > { |
8 | > // do soemthing else |
9 | > var2=1; |
10 | > } |
11 | > else if((test >=10 && test <=15) && var2==1) |
12 | > { |
13 | > // else do soemthing else |
14 | > var3=1; |
15 | > } |
16 | >
|
Komisch dann muss ich da bei meinem Code irgendeinen Fehler mit der Klammer gemacht haben. Bei mir hat er immer gemeckert, dass das else if nicht geht. Die Variablen var1, var2 und var3 haben zu Beginn des Programms den Wert 0. Dann werde ich nochmal probieren ob die Fehlermeldung bei "else if" nochmal auftaucht.
El Nino schrieb: > Die Variablen var1, var2 und var3 haben zu Beginn den Wert 0. Das ist dem Compiler erst mal egal. Es sei denn, diese Variablen würden im Hauptprogramm verwendet und nur in ISR verändert, aber nicht als volatil deklariert. Dann optimiert er die unteren beiden Zweige einfach raus... > ob die Fehlermeldung bei "else if" nochmal auftaucht. Und insbesondere, WELCHE dort auftaucht...
El Nino schrieb: > Die Variablen var1, var2 und var3 haben zu Beginn des Programms den Wert > 0. Dann geht er nur in das erste if und zwar dann wenn test zusätzlich zwischen 1 und 5 ist. Die Klammer bei (test >=1 && test <=5) && var1==0 ist übrigens unnötig, da logische unds kommutativ sind.
Lothar Miller schrieb: >> ob die Fehlermeldung bei "else if" nochmal auftaucht. > Und insbesondere, WELCHE dort auftaucht... Jepp, und den Originalcode der den Fehler verursacht, der fehlt nämlich auch.
El Nino schrieb: > Komisch dann muss ich da bei meinem Code irgendeinen Fehler mit der > Klammer gemacht haben. Höchst wahrscheinlich > Bei mir hat er immer gemeckert, dass das else if > nicht geht. Nun ja, ein dezidiertes "else if" gibt es ja in C auch nicht. Wendet man ganz strende Formatierrichtlinien an, dann schreibt sich das so if( Bedingung ) mach was; else if( andere Bedingung ) mach was anderes; else if( noch eine andere Bedingung ) mach etwas komplett anderes; Jedes weitere if ist also einfach nur unter das else des if einer Stufe weiter aussen eingschachtelt. Da das aber schnell unübersichtlich wird und man bei weiteren Schachtelungstiefen unweigerlich immer weiter an den rechten Rand gedrückt wird, macht man hier meistens eine Ausnahme von der strengen Formatierung und weicht die Regel etwas auf, so dass man das abhängige "if" in dieselbe Zeile wie das "else" hochzieht. if( Bedingung ) mach was; else if( andere Bedingung ) mach was anderes; else if( noch eine andere Bedingung ) mach etwas komplett anderes; Logisch gesehen macht das auch keinen Unterschied. Ganz im Gegenteil: in der letzten Schreibweise wird auch deutlicher, dass es sich hier konzeptionell nur um die Auswahl eines bestimmten Codepfades aus mehreren möglichen handelt, abhängig von gewissen Bedingungen. Das ist etwas, was in der strengen Formatierung so nicht so leicht zu sehen ist. Für den Compiler macht das aber keinen Unterschied. Aufgrund der Sprachregeln ist das einfach nur ein if, welches die abhängige Anweisung des darüberliegenden else darstellt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.