Hi Marcel,
m.E. sind Semikolon und Klammeraffe rund um das ELSE IF nicht richtig gesetzt. Probier das doch nochmal mal aus.
Viele Grüße, (Michael)
Hallo Leute,
Da ich neu in die Thematik des Programmierens eingestiegen bin, wollte ich mal an die Profis unter euch eine frage stellen.
Habe ein kleines C-Programm geschrieben, welches aber nicht das macht, was ich mir vorstelle *g Nun zur meiner Frage
Der Asuro sollte so lange geradeaus fahren, bis er auf ein Hindernis stößt,Code:int main(void) { unsigned char t1, t2; Init(); { while(0){ t1 = PollSwitch(); t2 = PollSwitch(); if(t1 == 0 && t2 == 0){ MotorFwd(); FrontLED(ON); BackLED(OFF,OFF); } else if (t1 & 0x38 || t2 & 0x07) MotorRwd(); Msleep(1000); break; } MotorStop(); return 0 ; }}
wenn die Sensoren betätigt werden, soll er 1 sec rückwärtsfahren und die Schleife beenden (also nichts mehr machen)!
Er Compeliert es mir richtig ohne Fehlerausgabe nur er bleibt nach der Sekunde nicht stehen, sondern macht in einer Endlosschleife weiter, als ob der ATMEL diesen "break" Befehl ignoriert.
Ich hoffe, dass ich diesen Teil richtig rübergebracht habe
Hoffe, dass mir einer von euch behilflich sein kann.
mfG
Marcel
Hi Marcel,
m.E. sind Semikolon und Klammeraffe rund um das ELSE IF nicht richtig gesetzt. Probier das doch nochmal mal aus.
Viele Grüße, (Michael)
Ich habe das mal etwas umformatiert, damit die Fehler leichter zu finden sind:
Was mir auf den ersten Blick ins Auge springt ist das "while(0)", denn wenn ich mich nicht sehr irre dürfte die Schleife so eigentlich garnicht ausgeführt werden. (0 entspricht ja einem logischen "false")Code:int main(void) { unsigned char t1, t2; Init(); { while(0) { t1 = PollSwitch(); t2 = PollSwitch(); if(t1 == 0 && t2 == 0) { MotorFwd(); FrontLED(ON); BackLED(OFF,OFF); } else if (t1 & 0x38 || t2 & 0x07) MotorRwd(); Msleep(1000); break; } MotorStop(); return 0 ; } }
Was mit dieser Formatierung auch leichter sichtbar wird: im "else if"-Zweig wird nur "MotorRwd()" ausgeführt, die beiden folgenden Befehle jedoch werden, unabhängig vom Zustand deiner Variablen, immer ausgeführt.
Außerdem ist der Code nach "Init()" nochmal in einem Block zusammengefasst, was eigentlich nicht nötig wäre.
So viele Treppen und so wenig Zeit!
Wollte mich nur mal schnell bedanken, für eure schnellen Antworten, da ich gleich wieder in die schule muss, kann ich die Umformulierung von Felix nicht genau unter die Lupe nehmen.
Habe ich das richtig verstanden, man kann einen Testausdruck nur eine Anweisung zuweisen?Zitat von Felix G
Streng genommen ja, aber ein Block gilt in diesem Zusammenhang auch als Anweisung. Du müsstest dann stattHabe ich das richtig verstanden, man kann einen Testausdruck nur eine Anweisung zuweisen?
Code:else if (t1 & 0x38 || t2 & 0x07) MotorRwd(); Msleep(1000); break;schreiben.Code:else if (t1 & 0x38 || t2 & 0x07) { MotorRwd(); Msleep(1000); break; }
Mir ist noch aufgefallen, dass du in deinem Testausdruck bei if
geschrieben hast. Ich weiß zwar nicht genau, welche Operatoren da die höhere Priorität haben, aber ich vermute, dass das nicht genau das macht, was du willst. Schreibe stattdessen lieberCode:(t1 & 0x38 || t2 & 0x07)
Durch diese Klammerung wird der Ausdruck auch ein bisschen übersichtlicher.Code:((t1 & 0x38) || (t2 & 0x07))
Warum ließt er die PollSwitch Funktion zweimal ein? wenn ich das Manual richtig interpretiere addieren sich doch die beiden Werte (S 71)
Lesezeichen