Semikolon nach if-Abfrage?

Gast #4372973
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
Angehängte Dateien:
Gast #4372996
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 ;)
Gast #4373007
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?
#4373008
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.
#4373017
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.
Gast #4373019
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.
Gast #4373022
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.
#4373030
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.
Gast #4373032
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.