Forum: Mikrocontroller und Digitale Elektronik If Syntax Problem


von Nino K. (lnino)


Lesenswert?

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.

von Simon B. (nomis)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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
}

von bitte löschen (Gast)


Lesenswert?

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.

von Oliver (Gast)


Lesenswert?

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

von Nino K. (lnino)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

von Udo S. (urschmitt)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.