Hallo,
schau ma mal ...
in C gibts kein or bei der If abfrage, das heisst da ||
in der Zeile:
gehört normalerweise kein ; am schluss, sonst ist die Schleife hier gleich geschlossen.Code:while (PollSwitch()==0);//...
Hallo zusammen!
Ich habe den Asuro zusammengebaut und er funktioniert soweit hervorragend. Nun habe ich aber schwierigkeiten mit der Programmierung des Roboters. Ich versuchte mich an einer simplen Motorsteuerung, doch der compiler meldet duzende Fehler, wo ich einfach keine entdecken kann! Ich nehme an erfahrenen C-Programmieren müssen die Fehler sofort auffallen! Tausend Dank fürs durchsehen.
code und fehlerstatistik:
Fehlerstatistik:Code:#include "asuro.h" int main(void) { Init(); while(1) { MotorDir(FWD,FWD); MotorSpeed(200,200); StatusLED(GREEN); while (PollSwitch()==0);//fahren bis kollision {MotorSpeed(0,0); //bei kollision, motoren abstellen StatusLED(YELLOW);//nachdenken was passiert ist: unsigned char taste; taste = PollSwitch(); if (taste == 32 or taste == 48) //links kollidiert {MotorDir(BREAK,RWD); MotorSpeed(0,120); Sleep(36);} //sollte ca 0.5sec "Pause" sein else if (taste == 16 or taste == 8 or taste == 4 or taste == 2 or taste == 18) //einige Frontalkollisionen {MotorDir(RWD,RWD); MotorSpeed(120,120); Sleep(36); MotorDir(RWD,FWD); Sleep(18);} else if (taste == 1 or taste == 3)//rechts kollidiert {MotorDir(RWD,BREAK); MotorSpeed(120,0); Sleep(36);} else//unbekanntes kollisionsmuster { while(1) {StatusLED(RED); BackLED(ON,OFF); Sleep(100); BackLED(OFF,ON); Sleep(100);} } } } //nach dem "Ausweichen" wieder fahren return 0; }
test.c: In function `main':
test.c:22: error: parse error before "or"
test.c:27: error: parse error before "else"
test.c:35: error: parse error before "else"
test.c: At top level:
test.c:41: error: parse error before "else"
test.c:46: error: parse error before numeric constant
test.c:46: warning: type defaults to `int' in declaration of `BackLED'
test.c:46: warning: function declaration isn't a prototype
test.c:46: error: conflicting types for `BackLED'
asuro.h:61: error: previous declaration of `BackLED'
test.c:46: warning: data definition has no type or storage class
test.c:47: error: parse error before numeric constant
test.c:47: warning: type defaults to `int' in declaration of `Sleep'
test.c:47: warning: function declaration isn't a prototype
test.c:47: error: conflicting types for `Sleep'
asuro.h:91: error: previous declaration of `Sleep'
test.c:47: warning: data definition has no type or storage class
test.c:48: error: parse error before numeric constant
test.c:48: warning: type defaults to `int' in declaration of `BackLED'
test.c:48: warning: function declaration isn't a prototype
test.c:48: warning: data definition has no type or storage class
test.c:49: error: parse error before numeric constant
test.c:49: warning: type defaults to `int' in declaration of `Sleep'
test.c:49: warning: function declaration isn't a prototype
test.c:49: warning: data definition has no type or storage class
test.c:57:2: warning: no newline at end of file
MAKE.EXE: *** [test.o] Error 1
Hallo,
schau ma mal ...
in C gibts kein or bei der If abfrage, das heisst da ||
in der Zeile:
gehört normalerweise kein ; am schluss, sonst ist die Schleife hier gleich geschlossen.Code:while (PollSwitch()==0);//...
mfG
vielen Dank für die schnelle Antwort!
jetzt erscheint noch die Fehlermeldung:
"MAKE.EXE: *** Warning: Clock skew detected. Your build may be incomplete."
dies: while (PollSwitch()==0);//.. ist absichtlich so; er ist in der schleife und macht die obigen befehle (fahren), solange keine kollision stattgefunden hat.
habe ich das mit Sleep(36); richtig verstanden? er sollte eine halbe sekunde die vorankommenden befehle ausführen!
grüsse beni
Mach mal ein make clean dann wird das Verzeichnis wieder aufgeräumt. Geht beim ASURO-quelltext mit der Batchdatei Test-clean.bat
Bei dem while passt was trotzdem nicht, denn die folgende Zeile beginnt mit einer geschweiften Klammer, also sollte das ; da nicht hin !
Sleep macht garnix und das in einer dauer die vom Wert abhängt, den man übergeben hat.
Wenn vorher die Motoren eingeschaltet wurden, fährt der Asuro dann solange mit diesen Werten.
Der Wert den man bei Sleep angibt berechnet sich aber etwas komplizierter, siehe Beschreibung, die dabei ist.
Ich hab jetzt nicht nachgeschaut ob das mit den 0.5 sec hinkommt !
mfG
Dankeschön für eure Antworten!
doch ich bin schon wieder auf eine solche Anfänger-Schwierigkeit gestossen
wie muss ich folgenden Code umändern? geht dies elegant, oder muss ich daraus 6 case-Fälle machen? So wie es jetzt ist, gibt er mir einen Fehler aus!
vielen Dank für eure Mühe!!Code:case 16||8||4||2||18||12: //frontal kollidiert MotorDir(FWD,RWD); MotorSpeed(140,150); Msleep(1000); break;
also du willst dohc darauf testen, ob überhaupt einer angeschlagen hat, oder?
Dann teste doch einfach auf >0.
So long
Andun
www.subms.de
Aktuell: Flaschcraft Funkboard - Informationssammlung
die Syntax von switch ist:
Die ... sind der Code, der jeweils ausgeführt werden soll.Code:switch (GANZZAHL) { case WERT1: ... case WERT2: ... case WERT3: ... default: ... }
Mit 'break' wird der switch verlassen.
Fehl das 'break', wird im nächsten case (oder default) weitergemach.
Ansonsten ist die Reihenfolge der cases, default egal.
Also:
Code:unsigned char taste; // fahren bis kollision while (0 == (taster = PollSwitch())) ; //bei kollision, motoren abstellen MotorSpeed(0,0); //nachdenken was passiert ist: StatusLED(YELLOW); switch (taste) { //links kollidiert case 32: case 48: MotorDir(BREAK,RWD); MotorSpeed(0,120); //sollte ca 0.5sec "Pause" sein Sleep(36); break; //einige Frontalkollisionen case 2: case 4: case 8: case 16: case 18: MotorDir(RWD,RWD); MotorSpeed(120,120); Sleep(36); MotorDir(RWD,FWD); Sleep(18); break; //rechts kollidiert case 1: case 3: MotorDir(RWD,BREAK); MotorSpeed(120,0); Sleep(36); break; //unbekanntes kollisionsmuster default: while(1) { StatusLED(RED); BackLED(ON,OFF); Sleep(100); BackLED(OFF,ON); Sleep(100); } } // switch (taste)
aha! grosses Dankeschön!
ich habe dieses proramm in mein PN kopiert und nach dem obengennanten geändert, es zeigt mir keine fehler an, aber wenn ich das dann geflsaht habe und schalte meinen asuro ein leuchten nur die satusled und die backled rot auf und mehr nicht...
was mache ich falsche...
und enbenbei... ich habe null erfahrung in C, nur das bisschen, was bei dem asruo dabei ist und das bringt mir meiner meinung nach nciht viel, da dort keine komplexeren programme erklärt werden und in diesem blauen heft auch sachen stehen, die mir wenig sagen...
hi
also dein fehler war, dass du in deinem programm Sleep(36); geschreiben hast.
Das ist aber keine halbe sekunde, sondern ca. 1/2 ms.
also müsstest du entweder Msleep(500);
oder eine schleife nehmen:
int a;
for( a = 0;a < 500;a++){
Sleep(72);//ca. eine ms
}
MfG
Jan
Lesezeichen