Я программирую робота на C и столкнулся с проблемой, которую не могу понять.
Единственный способ решить эту проблему — использовать множество операторов goto
. Я пытаюсь найти способ избежать написания более 100 goto
точек и операторов, операторов if и т. д., и мне интересно, есть ли способ перейти к значению строки. Например-
string Next = "beginning";
goto Next;
beginning:
Есть ли способ goto
значение Next
или подставить значение Next
в оператор goto
?
Если есть способ сделать это, то я смогу просто изменить значение Next
для каждой команды движения, а затем goto
независимо от значения строки Next
.
Другими словами, просто преобразовать строку в идентификатор goto
или подставить его вместо одного.
Спасибо за помощь!
-РЕДАКТИРОВАТЬ-
Многие из вас, ребята, предлагают использовать операторы 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, какая следующая команда, устанавливаете время ожидания (которое указывает, как долго выполняется команда в миллисекундах), затем вы заставляете код перейти к команда движения, которую вы вводите.
Теоретически все это работало бы, если бы был способ заставить оператор goto «интерпретировать» строку как идентификатор, чтобы ее можно было изменить.
Есть около 4 простых способов, которые я могу придумать прямо сейчас, которые могут легко обойти это, но они сделают код действительно очень длинным и загроможденным.
Теперь, когда вы лучше поняли мой вопрос, что-нибудь еще? :)
Кстати, я использую программу под названием robotC, и я программирую робота vex. поэтому я ДОЛЖЕН использовать простой, базовый, C, и я не могу использовать какие-либо надстройки или что-то еще... это еще одна причина, по которой это сложно, потому что я не могу иметь несколько классов и тому подобное...
goto
- person Kevin   schedule 09.01.2012