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 中调用 wmovewprintw 方法时,我可以清楚地看到光标移动,但是当我检查光标位置时,它显示为 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 参数的地址。因此,您需要能够修改传递给您的 函数 .

的原始 xy

由于您使用的是 C++,因此只需使用引用:

cursorPosition(int &y, int &x)

现在,当宏在内部获取 xy 的地址时,它将获取原件的地址,而不仅仅是本地副本。

PS。这再次证明了宏是多么可怕,它会产生令人困惑的代码和令人困惑的错误消息(试试 getyx(_win, 1, 1); 看看)。