Я программирую робота на C, и у меня возникла проблема, которую я не могу понять.
Единственный способ решить эту проблему - использовать множество goto
операторов.
Я пытаюсь найти способ сэкономить, записывая более 100 goto
точек и утверждений, а также операторы if и т. Д., И мне интересно, есть ли способ перейти к значению строки. например -
string Next = "beginning";
goto Next;
beginning:
Есть ли способ goto
значение Next
или подставить значение Next
в оператор goto
?
Если есть способ сделать это, тогда я смогу просто изменить значение Next
для каждой команды движения, а затем goto
независимо от значения строки Next
.
Другими словами, просто преобразовав строку в goto
идентификатор или подставив ее вместо единицы.
Спасибо за помощь!
-EDIT-
Многие из вас, ребята, предлагают использовать операторы switch. Я не уверен, что это сработает из-за того, как я его запрограммировал. Структура программы здесь -
кстати, этот код включает в себя только то, что у меня есть на самом деле, мой реальный код до сих пор превышает 500 строк. Кроме того, команды вождения в основном упрощены. но основная концепция здесь, легче понять, чем то, что я имел бы.
task main()
{
//integer list
int forwardDrivingSelector = 0;
int backwardDrivingSelector = 0;
int rightRotatingSelector = 0;
string nextCommand;
int waitTime = 0;
int countup = 0;
//driving commands
driveForward:
while(forwardDrivingSelector == 1)
{
motor[leftMotor] = 127;
motor[rightMotor] = 127;
countup++;
wait1Msec(1);
if(countup == waitTime)
{
countup = 0;
goto nextCommand;
}
}
driveBackward:
while(backwardDrivingSelector == 1)
{
motor[leftMotor] = -127;
motor[rightMotor] = 127;
countup++;
wait1Msec(1);
if(countup == waitTime)
{
countup = 0;
goto nextCommand;
}
}
rightRotate:
while(rightRotatingSelector == 1)
{
motor[leftMotor] = 127;
motor[rightMotor] = -127;
countup++;
wait1Msec(1);
if(countup == waitTime)
{
countup = 0;
goto nextCommand;
}
}
//autonomous driving code
//first command, drive forward for 1000 milliseconds
forwardDrivingSelector = 1;
nextCommand = "secondCommand";
waitTime = 1000;
goto driveForward;
secondCommand:
forwardDrivingSelector = 0;
//second command, rotate right for 600 milliseconds
rightRotatingSelector = 1;
nextCommand = "thirdCommand";
waitTime = 600;
goto rightRotate;
thirdCommand:
rightRotatingSelector = 0;
//third command, drive backwards for 750 milliseconds
backwardDrivingSelector = 1;
nextCommand = "end";
waitTime = 750;
goto driveBackward;
end:
backwardDrivingSelector = 0;
}
так. как это работает
у меня есть список целых чисел, включая селекторы управляющих команд, целые числа countup и waitTime, а также строку, о которой я говорил, nextCommand.
Далее следуют водительские команды. в моем реальном коде у меня около 30 команд, и все они подключены к пульту дистанционного управления, и его более 400 строк предназначены только для команд управления.
Далее идет автономный код. причина, по которой я настроил это так, состоит в том, что автономная часть кода будет короткой, простой и точной. в значительной степени, чтобы добавить команду к коду управления, вы включаете селектор, сообщаете строке nextCommand, какой будет следующая команда, устанавливаете waitTime (то есть, сколько времени она выполняет команду, в миллисекундах), затем вы делаете код goto команда вождения, которую вы вводите. команда вождения определяет количество времени, которое вы ввели, затем выполняет команду nextCommand;
Теоретически это работало бы, если бы был способ заставить оператор goto интерпретировать строку как идентификатор, чтобы ее можно было изменить.
Есть около 4 простых способов, которые я могу придумать прямо сейчас, которые могли бы легко обойти это, но они сделали бы код действительно очень длинным и беспорядочным.
Теперь, когда у вас есть лучшее понимание моего вопроса, есть еще какие-то комментарии? :)
кстати - я использую программу под названием robotC, и я программирую робота vex. так что я ДОЛЖЕН использовать простой, базовый, C, и я не могу использовать какие-либо дополнения или что-нибудь ... что является еще одной причиной, по которой это сложно, потому что я не могу иметь несколько классов и тому подобное ...