-         

Ergebnis 1 bis 6 von 6

Thema: Problem mit Programmierung

  1. #1

    Problem mit Programmierung

    Anzeige

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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.07.2006
    Ort
    Bielefeld
    Beiträge
    166
    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)

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Ich habe das mal etwas umformatiert, damit die Fehler leichter zu finden sind:

    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 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.
    So viele Treppen und so wenig Zeit!

  4. #4
    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.

    Zitat Zitat von Felix G
    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?

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    30
    Beiträge
    674
    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
    Code:
    else if (t1 & 0x38 || t2 & 0x07)
                MotorRwd();
                
             Msleep(1000);
             break;
    Code:
    else if (t1 & 0x38 || t2 & 0x07) {
         MotorRwd();
         Msleep(1000);
         break; 
    }
    schreiben.

    Mir ist noch aufgefallen, dass du in deinem Testausdruck bei if
    Code:
    (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
    Code:
    ((t1 & 0x38) || (t2 & 0x07))
    Durch diese Klammerung wird der Ausdruck auch ein bisschen übersichtlicher.

  6. #6
    Warum ließt er die PollSwitch Funktion zweimal ein? wenn ich das Manual richtig interpretiere addieren sich doch die beiden Werte (S 71)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •