PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Programmierung



|Marcel|
12.10.2006, 20:35
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:)

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 ;
}}

Der Asuro sollte so lange geradeaus fahren, bis er auf ein Hindernis stößt,
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

michael.bend
12.10.2006, 21:09
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)

Felix G
12.10.2006, 21:43
Ich habe das mal etwas umformatiert, damit die Fehler leichter zu finden sind:


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 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")

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.

|Marcel|
13.10.2006, 14:57
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.



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.


Habe ich das richtig verstanden, man kann einen Testausdruck nur eine Anweisung zuweisen?

Pascal
13.10.2006, 15:29
Habe ich das richtig verstanden, man kann einen Testausdruck nur eine Anweisung zuweisen?

Streng genommen ja, aber ein Block gilt in diesem Zusammenhang auch als Anweisung. Du müsstest dann statt


else if (t1 & 0x38 || t2 & 0x07)
MotorRwd();

Msleep(1000);
break;



else if (t1 & 0x38 || t2 & 0x07) {
MotorRwd();
Msleep(1000);
break;
}

schreiben.

Mir ist noch aufgefallen, dass du in deinem Testausdruck bei if


(t1 & 0x38 || t2 & 0x07)

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 lieber


((t1 & 0x38) || (t2 & 0x07))

Durch diese Klammerung wird der Ausdruck auch ein bisschen übersichtlicher.

asuro_freak2
21.10.2006, 22:08
Warum ließt er die PollSwitch Funktion zweimal ein? wenn ich das Manual richtig interpretiere addieren sich doch die beiden Werte (S 71)