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
Semikolon schrieb: > "else (numd < 0); { sicher das du nicht eigentlich
1 | else if (numd < 0) { |
schreiben wolltest?
Genau das ist ja das Problem! Fehlt das Semikilon genau an dieser Stelle, so stellt sich der Compiler quer.
Hinter einem else (ohne ein folgendes if) gehört keine Bedingung wie bei dir. Weg mit der Klammer samt Inhalt und es sollte gehen.
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"
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 ;)
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.
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?
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.
Ah alles klar. Das sind noch die kleinen Feinheiten, an die ich mich noch rantasten muss. Danke
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.
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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.