ncurses getyx (win, y, x) всегда возвращает '0,0'. Почему? - PullRequest
0 голосов
/ 03 апреля 2020

РЕДАКТИРОВАТЬ 2:

, как и предполагалось, решение было скрыто на виду. Спасибо @hyde за не только полезный ответ, но и тот, который научил меня чему-то, чего я раньше не знал.

РЕДАКТИРОВАТЬ:

Я думал, что было бы полезно добавить небольшой контекст, но, возможно, это только вызвало некоторое неправильное направление. Я уверен, что решение простое и прямо под моим носом.

У меня есть функция:

cursorPosition(int y, int x)
{

getyx(_win, y, x);

}

Я хочу, чтобы эта функция изменяла y и x, чтобы она содержала позицию курсора _win, объекта окна.

он постоянно возвращает y = 0, x = 0.

Мой вопрос: чего мне не хватает?

Я оставлю оставшуюся часть поста без изменений. Но вам не нужно go дальше.

- конец передачи -

У меня есть объект класса, который использует библиотеку ncurses, и я пытаюсь чтобы получить позицию курсора на экране.

Я ясно вижу, что курсор перемещается, когда я вызываю wmove и wprintw методы в окне, но когда я проверяю позицию курсора, он читает y = 0, x = 0. Я не могу понять, почему он не получит фактическую позицию курсора. getyx(stdscr,y,x ) и getsyx(y,x), кажется, работают нормально, которые оба используют stdscr, но мне нужно использовать новое окно, а не окно stdscr.

вот некоторые (соответствующие) подробности моего кода:

Я создаю класс с именем Window.

Window - это оболочка для объекта окна ncurses, с методами для печати и изменения этого окна:

class Window

{

public: 

// if int is 1: calls initscr and creates a newwin to assign to member variable 'win'
// if int is 0: calls delwin, sets member variable '_win' to nullptr then endwin
setWin(int)

// calls setWin(0) if member variable '_win' is not already nullptr
~Window()

// retrieves the cursor position 
cursorPosition(int y, int x)

private:

WINDOW * _win = nullptr;

}

ЗДЕСЬ проблема :

cursorPosition просто оборачивается вокруг '' 'getyx (_win, y, x)' '', используя закрытую переменную-член '' '_win' ''. Позже я создам общий указатель на этот оконный объект с именем DISPLAY, и я делаю это:

DISPLAY->setWin(1);

int CURSOR_Y, CURSOR_X;

DISPLAY->cursorPosition(CURSOR_Y, CURSOR_X);

std::string yx = std::tostring(CURSOR_Y) + "  " + std::to_string(CURSOR_X);

// prints to '_win' with 'wprintw'.
DISPLAY->print(yx)

однако я всегда получаю обратно

"0 0"

И действительно, это действительно так, потому что когда я пытаюсь перемещаться по окну CURSOR_Y и CURSOR_X, все, что я выводил, находится в верхнем левом углу.

1 Ответ

1 голос
/ 03 апреля 2020

getyx et c являются макросами и внутренне принимают адрес своих параметров y и x macro . Таким образом, вы должны иметь возможность изменять исходные x и y, переданные вашей функции .

Поскольку вы используете C ++, просто используйте ссылки:

cursorPosition(int &y, int &x)

Теперь, когда макрос внутренне принимает адреса x и y, он получит адрес оригиналов, а не только локальных копий.

PS. Это еще раз демонстрирует, насколько макросы ужасны и создают запутанный код и непонятные сообщения об ошибках (просто попробуйте getyx(_win, 1, 1);, чтобы увидеть).

...