Как сделать, чтобы функция, которую я использую в 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).

Другие вопросы по тегам