2016-09-23 1 views
0

Ist es möglich, eine Zeile Nummer in eingebettetem C, die außerhalb der Funktion ist, aufzurufen?Gehen Sie zu einer Zeilennummer in eingebettetem C außerhalb der Funktion

Einfache goto Label-Befehle können nicht arbeiten, weil ich in der if-Anweisung Schleife bin: Ich habe die Funktion neu gestartet werden soll, sobald der Fehler größer als ist 200.

void followWall(void) 
{ 

begin: 

    int desired = getADC();              //store the first ADC reading as the desired distance from the wall 
    int right = 200;                //pre set all variables to be called in the drive function 
    int left = 200;                //ints are needed here for bit masking later on to stop overflow 
    char rightH = 0; 
    char leftH = 0; 
    float k = 0.5;                //constant to times the error to fine tune the response 
    drive(rightH,right,leftH,left);            //drive the robot to the pre set variables 

    while(bumpFlag == 0)              //while the robot has not been bumped or encounted a cliff 
    { 
     int actual = getADC();             //call a new ADC reading everytime at start of while as the current reading 
     rightH = 0; 
     leftH = 0;                //set variables back to default to stop constant increase and decrease in variables 
     left = 200; 
     right = 200; 
     char error = abs(actual-desired);          //calculate the error by minusing the actual distance to the desired 

     if(motorAngle < 180)              //wall on left between 1st and 2nd quadrant 
     { 
      if(error > 200) 
      { 
       stop(); 
       moveStepper(33,0); 
       goto begin; 
      } 
      if (actual > desired)             
      { 
       right -=((error)*k);            
       left += ((error)*k);            
      } 
      else if (actual < desired)           
      { 
       left -=((error)*k);            
       right +=((error)*k);            
      } 
     } 
     else if (motorAngle > 180)            
     { 
      if(error > 200) 
      { 
       stop(); 
       moveStepper(33,1); 
       goto begin; 
      } 
      if (actual > desired)             
      { 
       left -=((error)*k);            
       right +=((error)*k);            
      } 
      else if (actual < desired)           
      { 
       right -=((error)*k);            
       left +=((error)*k);            
      } 

     } 
    drive(rightH,right,leftH,left);              bumpSensor();                
    setLCDCursor(0x09); 
    writeLCDNumber(convert(actual));           //constantly write the converted AC value on the LCD 
    } 
    stop();                  //stop the robot 
} 
+2

Nein; der Compiler kennt Zeilennummern kaum oder interessiert sie nicht; Der 'goto'-Mechanismus in Standard-C ist auf Bezeichnungen in der aktuellen Funktion beschränkt (z. B.' setjmp() 'und' longjmp() 'nicht - sie sind kein" goto "-Mechanismus, sondern ein" Zurückgehen "-Mechanismus); Warum willst du es machen? und Sie müssten innerhalb einer Funktion zu Code springen (Code und Labels können nicht außerhalb von Funktionen existieren), und das Einrichten des Callstacks über einen 'Inter-Funktions-Goto' wäre bestenfalls haarig und schlecht beraten und ... Allgemein , Das ist keine gute Idee! –

+0

Die Lösung ist ein richtiges Programm-Design, missbrauchen 'goto' wie das ist eine sehr schlechte Idee. Wenn Sie diesen Code betrachten, ist dies jedoch das geringste Ihrer Probleme. Warum verwenden Sie Gleitkommazahlen für triviale Berechnungen wie diese? Warum verwenden Sie 'char', um ganzzahlige Werte zu speichern? Kennen Sie die implementierungsdefinierte Signedness von char- und impliziten Integer-Promotions? Warum benutzt du nicht stdint.h? Usw. Dieser Code muss komplett überarbeitet werden. – Lundin

+0

Beobachtung: die Zeilen wie 'rechts - = ((Fehler) * k);' nehmen Sie etwas lesen. Es sieht so aus, als würdest du einen Zeiger "k" dereferenzieren und das Ergebnis zwingen, "error" einzugeben. Eine nähere Untersuchung zeigt jedoch, dass "k" ein "char" ist und "error" ein "float" ist, also ist es eigentlich eine einfache Multiplikation auf der RHS. Die Klammern sind alles überflüssig: es könnte geschrieben werden als 'right - = error * k;', was einfacher zu verstehen ist. –

Antwort

2

Sie sollten Ihren Code neu strukturieren ein vermeiden GEHE ZU. Eine weitere Schleife wird benötigt. Etwas wie das.

void followWall(void) 
{ 
    repeat = 0; 
    do // add this loop here 
    { 
     ... 
     ... 
     while(bumpFlag == 0) 
     { 
     repeat = 0; 
     .. 
     .. 
     if(motorAngle < 180) 
     { 
      .. 
      if(error > 200) 
      { 
      .. 
      .. 
      repeat = 1; 
      break; 
      } 
     } 
     else if (motorAngle > 180) 
     { 
      .. 
      if(error > 200) 
      { 
      .. 
      .. 
      repeat = 1; 
      break; 
      } 
     } 
     } 
    } while (repeat == 1); 
}  
Verwandte Themen