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
}
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! –
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
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. –