Как сделать, чтобы функция, которую я использую в c, контролировалась переменной
Это мой первый год vex.
Я беру на себя роль программиста. У меня была эта идея для быстрого автономного создания, записи драйвера. Вместо обычного дампа массива / отладчика необработанных потоков уровней мощности у меня появилась идея извлечь функции из движения драйвера. Я не буду вдаваться в подробности, и я сам могу написать код, но мне нужна помощь.
Есть одна вещь, которую я не могу сделать просто из-за отсутствия у меня опыта программирования.
Я хочу создать цикл for, который проверяет каждую кнопку джойстика одну за другой.
Например:
struct button
{
bool pressed;
}
for(int i = 0; i>12; i++) //12 is number of buttons on the joystick
{
struct button button<cycle through buttons>;
}
Я хочу, чтобы потом было:
struct button button6U;
struct button button6D;
struct button button6R;
etc.
Тогда я хочу это:
for(int i = 0; i>12; i++) // 12 is number of buttons on the joystick
{
if(VexRT[<currentButton>])
{
button<currentButton>.pressed = true;
}
}
Я понятия не имею, как это сделать, с подстановочным знаком, изменяющим фактическое имя переменной, в которую я пишу.
Пара мыслей: оператор for не будет знать, как изменить порядок кнопок джойстика. Так что я думаю, что мне может понадобиться это:
orderOfButtons
{
VexRT[6U];
VexRT[6D];
VexRT[6R];
// etc.
}
Я просто не могу понять, как иметь переменную, определяющую, что VexRT[]
Кнопка, с которой я читаю.
Любая помощь будет оценена! Благодарю.
3 ответа
Похоже, вы хотите массив:
#define NUMBER_OF_BUTTONS 12
...
struct button VexRT[NUMBER_OF_BUTTONS];
Если вы хотите использовать символические константы для ссылки на определенные кнопки в массиве, вы можете использовать перечисление:
enum btn_id { BTN_6U, // maps to 0
BTN_6D, // maps to 1
BTN_6R, // maps to 2
...
}
Константы перечисления представлены как целые числа, и по умолчанию они начинаются с 0 и увеличиваются на 1. Вы можете инициализировать их различными значениями, если хотите, и несколько констант перечисления могут отображаться на одно и то же значение. Я пользуюсь этим, когда хочу определить "первое" и "последнее" перечисление для цикла, например:
enum btn_id {
BTN_6U,
BTN_FIRST = BTN_6U, // both BTN_FIRST and BTN_6U will map to 0
BTN_6D,
BTN_6R,
...
BTN_whatever,
BTN_LAST
};
Таким образом, VexRT[BTN_6U]
карты для VexRT[0]
, VexRT[BTN_6D]
карты для VexRT[1]
, так далее.
Обратите внимание, что таким образом, вам не нужно перебирать все кнопки, чтобы установить одну:
enum btn_id currentButton = BTN_6D;
...
VexRT[currentButton].pressed = true;
Если вы хотите перебрать весь набор, вы можете использовать
for ( enum btn_id i = BTN_FIRST; i < BTN_LAST; i++ )
{
VexRT[i].pressed = false;
}
Я думаю, что вы пытаетесь получить доступ к событиям, исходящим от джойстика. Вы можете просто просмотреть массив значений и записать их. Я думаю, что каналы на джойстике просто доступны как: vexRT[x], где x - 1-12. Если вы просто хотите сохранить последнее значение для каждого канала, вы можете сделать это:
int value[12];
for(i=0; i<12; i++)
{
value[i] = vexRT[i];
}
Если вы хотите сохранить все значения, чтобы их можно было отобразить или воспроизвести или что-то еще, вам потребуется более сложная структура данных для их хранения, например, список массивов значений.
Я также нашел документацию, в которой говорится, что значения доступны, например, как vexRT[Chx], где x равно 1-12, так что вы можете альтернативно создать строку и использовать ее для доступа к каналам джойстика внутри цикла:
string *s = (char *)malloc(5*sizeof(char)); //5 is the max length of the null terminated string
for() . . . {
sprintf(s,"Ch%d", i);
value[i] = vertRT[s];
}
Итак, что вы хотите, чтобы сэмплировать пользовательский ввод (с некоторой заданной скоростью), затем записать его в массив, а затем воспроизвести его позже? Если у вас есть функции, которые управляют VEX (я не знаком с этим), каждая из которых связана с вводом, вы можете использовать массив указателей на функции для создания выходных данных.
#define MAX_ACTION 12
#define MAX_RECORDED 200
// Declare your array of function pointers
int (*action[MAX_ACTION])(void);
// Declare your stored array of recorded actions
int recorded[MAX_RECORDED];
...
// Assign function pointers to associated functions
action[0] = go_forward;
action[1] = turn_right;
...
// Record your actions into some array
while (...)
{
// Record the action
recorded[i++] = get_action();
// Sample delay
}
...
// Playback the actions
for (i=0;i<RECORDED;i++)
{
(*action[recorded[i]])();
// delay here
}
PS Ваш цикл for обратный (я<12 не я>12).