Forum: Mikrocontroller und Digitale Elektronik Semikolon nach if-Abfrage?


von Semikolon (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
ich hab hier mal ein kleines, aber ungeschicktes Programm geschrieben, 
welches zwei Pulse der Länge nach miteinander vergleichen soll:

Datei hängt an.

In Zeile 52 ist das Sonderbare...
"else (numd < 0); {"

Der Compiler ist erst zufrieden, wenn das Semikolon nach der If-Abfrage 
folgt. Das scheint mir aber nicht korrekt zu sein.

Ich schätze, man kann am Code erkennen, dass ich mich sonst in 
Assembler-Derivaten herumtreibe.
Für weitere Verbesserungen und Fragen des Codes bin ich natürlich offen.

Beste Grüße
 Fabian

von Irgendwer (Gast)


Lesenswert?

Semikolon schrieb:
> "else (numd < 0); {

sicher das du nicht eigentlich
1
else if (numd < 0) {
schreiben wolltest?

von Semikolon (Gast)


Lesenswert?

Genau das ist ja das Problem!
Fehlt das Semikilon genau an dieser Stelle, so stellt sich der Compiler 
quer.

von Felix A. (madifaxle)


Lesenswert?

Hinter einem else (ohne ein folgendes if) gehört keine Bedingung wie bei 
dir. Weg mit der Klammer samt Inhalt und es sollte gehen.

von Irgendwer (Gast)


Lesenswert?

Semikolon schrieb:
> Fehlt das Semikilon genau an dieser Stelle, so stellt sich der Compiler
> quer.

Bei dir dürfte keine Semikolon fehlen sonder das Wörtchen "if"

von Semikolon (Gast)


Lesenswert?

Na klar. Das war's.
Ich dachte immer, bei der untersten Abfrage in solch einer if-else 
Struktur steht nur noch ein else. Jetzt ist es eben:

void getnewpulse(){
    if(numa < 0){
        numa=(numa+pulsecount)-terminate;
        pulsecount = 0;
    }
    else if (numb < 0) {
        numb=(numb+pulsecount)-terminate;
        pulsecount = 0;
    }
    else if (numc < 0) {
        numc=(numc+pulsecount)-terminate;
        pulsecount = 0;
    }
    else if (numd < 0) {
        numd=(numd+pulsecount)-terminate;
        pulsecount = 0;
    }
}

Und es läuft. Anderseits läuft es auch MIT dem Semikolon ;)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Semikolon schrieb:
> Anderseits läuft es auch MIT dem Semikolon

Aber nicht so, wie Du es Dir denkst. Der Anweisungsblock nach dem 
Semikolon wird dann nämlich immer ausgeführt, egal, was vorher an 
irgendeiner if/else-Stelle ausdecodiert wurde.

von Semikolon (Gast)


Lesenswert?

Noch eine Frage:
In dem oben angehängten Programmteil:

Der Sketch verwendet 676 Bytes (2%) des Programmspeicherplatzes. Das 
Maximum sind 32.256 Bytes.
Globale Variablen verwenden 11 Bytes (0%) des dynamischen Speichers, 
2.037 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 
Bytes.


Wo kommen denn die lokalen Variablen her? Und wieso verwenden diese so 
viel Platz? Was kann ich da tun?

von Sebastian V. (sebi_s)


Lesenswert?

Semikolon schrieb:
> Ich dachte immer, bei der untersten Abfrage in solch einer if-else
> Struktur steht nur noch ein else.

Ja gibt es auch, dann aber ohne Bedingung. Also etwa:
1
if(numa < 0){
2
    numa=(numa+pulsecount)-terminate;
3
    pulsecount = 0;
4
}
5
else
6
{
7
    // whatever
8
}
Bist du dir außerdem sicher, dass du hier wirklich ein else if haben 
möchtest? Wenn ich mir so den Code anschaue könntest du auch nur ein if 
wollen.

von Semikolon (Gast)


Lesenswert?

Ah alles klar. Das sind noch die kleinen Feinheiten, an die ich mich 
noch rantasten muss. Danke

von Peter II (Gast)


Lesenswert?

Semikolon schrieb:
> Ich dachte immer, bei der untersten Abfrage in solch einer if-else
> Struktur steht nur noch ein else.

ja aber dann darf auch keine Bedingung mit da stehen.

von Sebastian V. (sebi_s)


Lesenswert?

Semikolon schrieb:
> Der Sketch verwendet 676 Bytes (2%) des Programmspeicherplatzes. Das
> Maximum sind 32.256 Bytes.
> Globale Variablen verwenden 11 Bytes (0%) des dynamischen Speichers,
> 2.037 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048
> Bytes.

Was hier als lokale Variablen bezeichent wird soll wohl der Stack sein. 
Außerdem sagt die Meldung, dass 2037 Bytes für lokale Variablen 
verbleiben und nicht wirklich verbraucht werden. Wieviel tatsächlich 
verbraucht wird lässt sich oft gar nicht so einfach voraus sagen.

: Bearbeitet durch User
von Semikolon (Gast)


Lesenswert?

Sebastian V. schrieb:
> Semikolon schrieb:
>> Ich dachte immer, bei der untersten Abfrage in solch einer if-else
>> Struktur steht nur noch ein else.
>
> Ja gibt es auch, dann aber ohne Bedingung. Also etwa:if(numa < 0){
>     numa=(numa+pulsecount)-terminate;
>     pulsecount = 0;
> }
> else
> {
>     // whatever
> }Bist du dir außerdem sicher, dass du hier wirklich ein else if haben
> möchtest? Wenn ich mir so den Code anschaue könntest du auch nur ein if
> wollen.

Ja, da ich mehr als 2 Mögliche Zustände habe mit verschiedenen 
Variablen, dachte ich eine solche if-Abfrage sei unumgänglich.

von Klaus (Gast)


Lesenswert?

Semikolon schrieb:
> Na klar. Das war's.
> Ich dachte immer, bei der untersten Abfrage in solch einer if-else
> Struktur steht nur noch ein else. Jetzt ist es eben:

Ja. Da hast Du auch richtig gedacht. Im Gegensatz dazu, hast Du 
allerdings noch einen Ausdruck hinter das else gesetzt. Nun kann hinter 
einem else durchaus eine einzelne, aus einem Ausdruck bestehende 
Anweisung stehen - die dann durch ein Semikolon abgeschlossen wird. Die 
wird dann ausgeführt, wenn keiner der vorherigen Fälle zutrifft. Der 
Block allerdings, der dann i der geschweiften Klammer folgt, wird in 
Deiner Version immer ausgeführt. Egal, welche Bedingung vorher zutraf 
oder nicht zutraf.

Was Du aber wolltest, war eine weitere Bedingung. Daher ist das if 
nötig.
Bei der Gelegenheit, rate ich Dir auch einmal zu überlegen oder zu 
testen, ob wirklich sämtliche Fälle abgedeckt sind. Was ist wenn keine 
der Variablen numx kleiner 0 ist?

>     }
>     else if (numd < 0) {
>         numd=(numd+pulsecount)-terminate;
>         pulsecount = 0;
>     }
> }
>

> Und es läuft. Anderseits läuft es auch MIT dem Semikolon ;)

Na. Laufen wird es wahrscheinlich nicht. Das Verhalten wird nicht dem 
gewollten entsprechen. Siehe oben.

Ich empfehle Dir dringend ein C-Buch zu lesen.

von Sebastian V. (sebi_s)


Lesenswert?

Semikolon schrieb:
> Ja, da ich mehr als 2 Mögliche Zustände habe mit verschiedenen
> Variablen, dachte ich eine solche if-Abfrage sei unumgänglich.

Statt dem else if könntest du vielleicht auch das hier gewollt haben:
1
void getnewpulse(){
2
    if(numa < 0){
3
        numa=(numa+pulsecount)-terminate;
4
        pulsecount = 0;
5
    }
6
    if (numb < 0) {
7
        numb=(numb+pulsecount)-terminate;
8
        pulsecount = 0;
9
    }
10
    if (numc < 0) {
11
        numc=(numc+pulsecount)-terminate;
12
        pulsecount = 0;
13
    }
14
    if (numd < 0) {
15
        numd=(numd+pulsecount)-terminate;
16
        pulsecount = 0;
17
    }
18
}
Im Gegensatz zu der else if Variante wird hier jedes num* welches 
kleiner als 0 ist neu gesetzt. Bei der else if Variante immer nur 
höchstens eins.

: Bearbeitet durch User
von Klaus (Gast)


Lesenswert?

Semikolon schrieb:
> Sebastian V. schrieb:
>> Semikolon schrieb:
[...]
> Ja, da ich mehr als 2 Mögliche Zustände habe mit verschiedenen
> Variablen, dachte ich eine solche if-Abfrage sei unumgänglich.

Als Faustregel ist das falsch. Auch wenn Du nur zwei Zustände einer 
Variablen hast, kannst Du diese nur mit einer if-Anweisung und der 
entsprechenden Bedingung unterscheiden.

Die wichtigste Frage in dem Zusammenhang ist, ob sich das Verhalten 
Deines Programmes von dem Zustand mehrerer Variablen abhängt oder nicht.

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.