-         

Ergebnis 1 bis 6 von 6

Thema: Aus einer if-Funktion "ausbrechen"

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25

    Aus einer if-Funktion "ausbrechen"

    Anzeige

    Hallo allerseits,
    ich steh gerade vor folgendem Problem. Der Asuro soll, wenn die Linie verlassen sollte (data[0] > x && data[1] > x ; das mit den werten funktioniert schon das Problem liegt wo anders), den Boden absuchen (links drehen, rechts drehen, vorwärts fahren und wieder drehen). Sobald er wieder auf der Linie ist soll er aufhören zu drehen oder was auch immer und ganz normal mit der while-schleife (Linienverfolgung) weitermachen. Bin leider nicht so erfahren in sachen programmieren. Kann man eine while schleife in einer while schleife machen? Hier mal der "Such-Code":

    Code:
    							if (T9>700 && T10>700)		// Werte wenn beide Liniensensoren über weiß sind => Linie suchen
    						{							
    										MotorDir(FWD,FWD);
    									MotorSpeed(0,150);
    								for (i=0; i<=1000; i++)
    									{Sleep(72);}
    									
    										MotorDir(FWD,FWD);
    									MotorSpeed(150,0);
    								for (i=0; i<=2000; i++)
    									{Sleep(72);}
    									
    										MotorDir(FWD,FWD);
    									MotorSpeed(0,150);
    								for (i=0; i<=100; i++)
    									{Sleep(72);}
    									
    										MotorDir(FWD,FWD);
    									MotorSpeed(150,150);
    								for (i=0; i<=500; i++)
    									{Sleep(72);}
    						}
    müsste es heißen: while(T9>700 && T10>700) ?

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    20.04.2008
    Ort
    Bremen
    Alter
    27
    Beiträge
    85
    Hallo,

    Man kann wenn man will hunderte while schleifen ineindern machen
    So wie ich das sehe müsstest du einfach statt der if Abfrage ein while draus machen dann sollte es funktionieren, er sucht dann nämlich solange (while) eine linie bis der Wert für des Weiß wieder anders wird, er also eine Linie findet.

    beste Grüße
    the.speciali
    Wer den Himmel auf Erden sucht hat im Erdkundeunterricht geschlafen!

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25
    Habs jetz mit while funktioniert aber immer noch nicht, d.h. er "arbeitet" den ganzen block ab und stopt nicht wenn er über die linie fährt.

    Code:
    Code:
    while(1)
    	{
    
    	LineData(data);
    	T9=data[0];
    	T10=data[1];
    	
    	{Sleep(72);}
    							while (T9>700 && T10>700)		// Werte wenn beide Liniensensoren über weiß sind => Linie suchen
    						{							
    										MotorDir(FWD,FWD);
    									MotorSpeed(0,150);
    								for (i=0; i<=1000; i++)
    									{Sleep(72);}
    									
    										MotorDir(FWD,FWD);
    									MotorSpeed(150,0);
    								for (i=0; i<=2000; i++)
    									{Sleep(72);}
    									
    										MotorDir(FWD,FWD);
    									MotorSpeed(0,150);
    								for (i=0; i<=1000; i++)
    									{Sleep(72);}
    									
    										MotorDir(FWD,FWD);
    									MotorSpeed(150,150);
    								for (i=0; i<=200; i++)
    									{Sleep(72);}
    						}
    					
    							 if ((T9<=700 && T9>=530) && (T9<=700 && T10>=580))     // Werte für die der Asuro optimal auf der Linie ist
    							{
    										MotorDir(FWD,FWD);
    									MotorSpeed(180,180);
    										{Sleep(72);}
    						} .......
    Woran könnte es liegen?

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    20.04.2008
    Ort
    Bremen
    Alter
    27
    Beiträge
    85
    Also die while Schleife hat da manchmal so seine Probleme mit logischen Operatoren wie "&&". Also wenns geht weglassen oder hier bei "while (T9>700 && T10>700)" zusätzliche Klammern reinmachen etwa so: "while ((T9>700) && (T10<700))".

    Kommen wir zum nächsten Problem: Die If Abfrage wird so nicht funktionieren. Denn es müssen alle zwei Sensoren einen "schwarzen" Wert erhalten bevor er anhält^^ Also da müsste ein Oder ("||") rein. Und natürlich nicht die Klammern vergessen

    Dann sollte es funktionieren, wenn nicht einfach nochmal nachfragen, dann sehen wir weiter .

    beste Grüße
    the.speciali
    Wer den Himmel auf Erden sucht hat im Erdkundeunterricht geschlafen!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    25
    das mit while funktioniert auch nicht. Wieder "arbeitet" er den ganzen block durch und hört nicht auf zu "suchen".
    weiß jemand rat zur lösung des Problems?

    das programm geht übrigens noch weiter hab bloß den wichtigen ausschnitt hier gepostet. Linienverfolgen funktioniert auch soweit bloß das "suchen" nicht aus o.g. gründen.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.11.2003
    Beiträge
    1.111
    Damit das funktioniert, muss er nach jeder Teilbewegung prüfen, ob die Bedingung erfüllt ist. Dein Code prüft EINMAL ganz am Anfang die Bedingung und dann läuft der Block durch, je nach Ergebnis.
    Wie wäre es mit
    Code:
    Ende = 0;
    while (! (Bedingung == weiß) || Ende){
        drehe LINKS_10ms;
        Zaehler++;
        if(Zaehler >= ZaehlerMax){
             Zaehler = 0;
             Ende = 1;
        }
    }
    Ende = 0;
    while(! (Bedingung == weiß) || Ende){
        fahre VOR_10ms;
        Zaehler++;
        if(Zaehler >= ZaehlerMax){
           Zaehler = 0;
           Ende = 1;
        }
    }
    usw.
    Erst links und dann wieder rechts drehen führt natürlich auch nicht zum Ziel, wenn er nicht zwischendurch zB mal vor fährt.
    Viel Spaß

Berechtigungen

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