Сохранение событий клавиатуры в массив с включенным графическим окном

В моем маленьком проекте появляется всплывающее окно, приветствующее пользователя и запрашивающее его имя. И именно здесь нужно нажимать клавиши и сохранять их в массив, чтобы их можно было использовать позже. За исключением случаев, когда я запускаю эту часть кода, которая должна это делать:

while (done != 0)
{
    GFX_GetKeyPress(&key);
    if (key == ALLEGRO_KEY_ESCAPE)
    {
        done = 1;
    }
    else
    {
        key = GFX_GetKeyPress(*(user.name+1));
    }
}

Когда массив скрыт в структуре:

struct user_details
{
   char name[40];
}

и вызывается в основной функции struct user_details user. Кроме того, GFX_GetKeyPress(int * keypress_ptr) — это функция из библиотеки, которая есть у нас в университете, и она используется для того, чтобы мы знали, какая клавиша нажата.

За исключением того, что когда я использую запуск кода, эта часть полностью игнорируется. Программа только сообщает пользователю, что ему нужно его имя, которое находится перед этой частью, а затем продолжает спрашивать другие вещи, которые находятся после этого. Я в основном уверен, что следовал инструкциям, которые мы получили во время наших занятий, но почему-то я не должен этого делать, и я понятия не имею, что я напортачил. Пожалуйста помоги.


person unluckysoap    schedule 18.04.2017    source источник


Ответы (2)


Если я правильно вижу ваш код, когда вы говорите key = GFX_GetKeyPress(*(user.name+1));, вы на самом деле разыменовываете второй символ в массиве CString name[40], поэтому то, что вы делаете, будет в основном эквивалентно вызову key = GFX_GetKeyPress('A');. Я очень удивлен, что вы не получили предупреждения компилятора об этом. Прежде всего, вы передаете неправильный тип (int или char). Однако, что более важно, вы передаете символьное значение там, где ожидается указатель на целое число. Наряду с тем, что я удивлен, что вы не получаете предупреждение, я глубоко потрясен тем, что ваша программа не выдала ошибку из-за попытки доступа к недопустимой памяти.

Если GFX_GetKeyPress(int * keypress_ptr) может обрабатывать буфер cstring вместо целочисленного указателя и предполагается, что вы собираетесь передать указатель на второй символ в буфере user.name, тогда все, что вам нужно сделать, это: key = GFX_GetKeyPress(user.name+1) (который передаст адрес первый элемент массива имен + 1 байт для следующего индекса.)

Я не работал с Allegro, поэтому я не уверен во всех тонкостях библиотеки, но это просто стандартное знание указателя C.

person Spencer D    schedule 18.04.2017

Чтобы добавить к ответу SpencerD, вы сохраняете только одну клавишу, а также передаете несовместимые типы и игнорируете все остальные нажатия клавиш.

Предполагая, что GFX_GetKeyPress возвращает следующий символ в буфере клавиш, что-то вроде этого было бы более подходящим:

int index = 0;
while (GFX_GetKeyPress(&key) != ALLEGRO_KEY_ESCAPE) {
   if (index < 40) {/// Hardcoded constants are bad
      user.name[index] = key;
      ++index;
   }
   else {
      break;
   }
}

Хотя модальные циклы, как правило, не рекомендуются, это должно работать.

person BugSquasher    schedule 22.03.2019