Как я могу безопасно преобразовать целое число ascii обратно в связанный символ ascii, используя curses в C ++? - PullRequest
0 голосов
/ 16 февраля 2020

Мне не удалось найти надежное решение для моей проблемы, я просто пытаюсь создать некоторую функцию, которая:

  • занимает позицию строк и столбцов в терминал.

  • вызывает mvinch (window_object, rows, cols) , который возвращает целое число без знака, соответствующее символу в терминале в этой позиции.

  • возвращает символ ascii, связанный с этим беззнаковым int, эффективно приводя его обратно к типу char.

Вот пример моего кода на c ++ 11:

char Kmenu::getChrfromW(size_t const y, size_t const x,
                        bool const save_cursor) const {
  size_t curr_y, curr_x;
  getyx(_win, curr_y, curr_x);
  char ich = mvwinch(_win, y, x);
  char ch = ich;
  if (save_cursor)
    wmove(_win, curr_y, curr_x);
  return ch;
}

Если, например, символ в терминале в позиции 2,3 является буквой 'a', я хочу, чтобы эта функция возвращала букву 'a'.

Я попробовал решение, описанное здесь:

Преобразовать число ASCII в символ ASCII в C

, который эффективно преобразует целое число как char.

к сожалению, я получаю еще целое число: при тестировании с экраном, заполненным 'w, я получаю целое число 119.

Страница man для функции curses mvwinch () описывает функцию, возвращающую chtype , которую компилятор распознает как unsigned int.

Есть ли встроенная функция curses, которая возвращает символ напрямую, без приведения к unsigned int, или каким-либо другим способом, которым я могу этого достичь?

Редактировать: ch to ich, как в актуальный код

1 Ответ

0 голосов
/ 17 февраля 2020

A chtype содержит символ вместе с другими данными. Заголовок curses.h имеет несколько символов, которые полезны для извлечения этих битов. Если вы замаскируете его с помощью A_CHARTEXT и приведете его к char, вы получите символ:

char c = (char)((A_CHARTEXT) & n);

Ваш пример не должен компилироваться, поскольку он объявляет ch дважды. Возможно, вы имели в виду следующее:

char Kmenu::getChrfromW(size_t const y, size_t const x,
                        bool const save_cursor) const {
  int curr_y, curr_x;  // size_t is inappropriate...
  getyx(_win, curr_y, curr_x);
  char ch = (char)((A_CHARTEXT) & mvwinch(_win, y, x));
  // char ch = ich;
  if (save_cursor)
    wmove(_win, curr_y, curr_x);
  return ch;
}

Страница руководства для mvwinch упоминает маску A_CHARTEXT в разделе Атрибуты Предполагая, что читатель знаком с такими вещами:

   The following bit-masks may  be  AND-ed  with  characters  returned  by
   winch.

   A_CHARTEXT     Bit-mask to extract character
   A_ATTRIBUTES   Bit-mask to extract attributes
   A_COLOR        Bit-mask to extract color-pair field information
...