ncurses getyx(win, y, x) 总是返回 '0,0'。为什么?
ncurses getyx(win, y, x) always returning '0,0'. Why?
编辑 2:
正如所怀疑的那样,解决方案隐藏在众目睽睽之下。感谢@hyde 不仅提供了一个有用的答案,而且还教会了我一些我以前不知道的东西。
编辑:
我原以为添加一点上下文会有所帮助,但也许它只是造成了一些误导。我确信解决方案很简单,而且就在我眼皮底下。
我有一个功能:
cursorPosition(int y, int x)
{
getyx(_win, y, x);
}
我希望此函数修改 y 和 x 以包含 _win
的光标位置,一个 window 对象。
取而代之的是 returns y = 0, x = 0, 一直如此。
我的问题是我错过了什么。
我将 post 的其余部分保持不变。但你不需要更进一步。
--传输结束--
我有一个使用 ncurses 库的 class 对象,我正在尝试获取光标在屏幕中的位置。
当我在 window 中调用 wmove
和 wprintw
方法时,我可以清楚地看到光标移动,但是当我检查光标位置时,它显示为 y = 0, x = 0。我不明白为什么它不会检索实际的光标位置。 getyx(stdscr,y,x )
和 getsyx(y,x)
似乎都使用 stdscr,但我需要使用新的 window 而不是 stdscr window.
这里是我的代码的一些(相关)细节:
我创建了名为 Window
的 class。
Window 是 ncurses window 对象的包装器,具有打印和修改 window:
的方法
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
的 window 对象的共享指针,我正在这样做:
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”
确实如此,因为当我尝试使用导航 window CURSOR_Y 和 CURSOR_X 时,我输出的任何内容都在左上角。
getyx
等是宏,在内部获取它们的 y 和 x macro 参数的地址。因此,您需要能够修改传递给您的 函数 .
的原始 x
和 y
由于您使用的是 C++,因此只需使用引用:
cursorPosition(int &y, int &x)
现在,当宏在内部获取 x
和 y
的地址时,它将获取原件的地址,而不仅仅是本地副本。
PS。这再次证明了宏是多么可怕,它会产生令人困惑的代码和令人困惑的错误消息(试试 getyx(_win, 1, 1);
看看)。
编辑 2:
正如所怀疑的那样,解决方案隐藏在众目睽睽之下。感谢@hyde 不仅提供了一个有用的答案,而且还教会了我一些我以前不知道的东西。
编辑:
我原以为添加一点上下文会有所帮助,但也许它只是造成了一些误导。我确信解决方案很简单,而且就在我眼皮底下。
我有一个功能:
cursorPosition(int y, int x)
{
getyx(_win, y, x);
}
我希望此函数修改 y 和 x 以包含 _win
的光标位置,一个 window 对象。
取而代之的是 returns y = 0, x = 0, 一直如此。
我的问题是我错过了什么。
我将 post 的其余部分保持不变。但你不需要更进一步。
--传输结束--
我有一个使用 ncurses 库的 class 对象,我正在尝试获取光标在屏幕中的位置。
当我在 window 中调用 wmove
和 wprintw
方法时,我可以清楚地看到光标移动,但是当我检查光标位置时,它显示为 y = 0, x = 0。我不明白为什么它不会检索实际的光标位置。 getyx(stdscr,y,x )
和 getsyx(y,x)
似乎都使用 stdscr,但我需要使用新的 window 而不是 stdscr window.
这里是我的代码的一些(相关)细节:
我创建了名为 Window
的 class。
Window 是 ncurses window 对象的包装器,具有打印和修改 window:
的方法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
的 window 对象的共享指针,我正在这样做:
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”
确实如此,因为当我尝试使用导航 window CURSOR_Y 和 CURSOR_X 时,我输出的任何内容都在左上角。
getyx
等是宏,在内部获取它们的 y 和 x macro 参数的地址。因此,您需要能够修改传递给您的 函数 .
x
和 y
由于您使用的是 C++,因此只需使用引用:
cursorPosition(int &y, int &x)
现在,当宏在内部获取 x
和 y
的地址时,它将获取原件的地址,而不仅仅是本地副本。
PS。这再次证明了宏是多么可怕,它会产生令人困惑的代码和令人困惑的错误消息(试试 getyx(_win, 1, 1);
看看)。