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:> 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.
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.
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
voidgetnewpulse(){
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.
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.