【问题标题】:c/ncurses - using getch with different program sectionsc/ncurses - 将 getch 与不同的程序部分一起使用
【发布时间】:2015-03-07 13:39:00
【问题描述】:
我正在编写一个简单的 ncurses 程序,其中包含一个菜单和不同的部分(创建/查看等),所有这些都使用键盘。目前我有一个 getkey 例程,然后切换以确定键盘输入用于哪个部分,如下所示:
ch = getch();
if(menu){
switch(ch){
...
if(create){
switch(ch){
...
if(view){
switch(ch){
...
这是执行此操作的最佳方法还是我应该为每个部分设置不同的 getkey 例程(menu_getkey()、view_getkey() 等) - 最好的方法是什么?
【问题讨论】:
标签:
c
keyboard
ncurses
getch
【解决方案1】:
这涉及到一些设计(因此可能有点主观),但我认为你的方法很好。它允许您在深入了解细节之前处理接近getch() 的常见输入逻辑,并且通常如果可能的话,在单个位置处理事件(例如键盘输入)通常是一个好主意 - 具有多个事件循环往往随着程序的增长变得混乱。
类似的写法如下:
enum { MENU, CREATE, VIEW } input_focus = MENU;
...
void input_loop(void) {
for (;;) {
int ch = getch();
/* Put common input logic here. */
switch (input_focus) {
case MENU:
handle_menu_input(ch);
break;
case CREATE:
handle_create_input(ch);
break;
case VIEW:
handle_view_input(ch);
break;
}
}
}
您的个人cases 可能需要在其中包含更多逻辑,但您明白了。
简短的函数有助于提高可读性。现代编译器足够聪明,可以内联只调用一次的函数(删除函数调用并直接插入代码),所以不用担心性能。 (如果有人挑剔地读到这个——是的,它需要对不同编译单元中的函数进行链接时间优化。)
拥有一个您更新的函数指针以始终指向当前输入焦点而不是拥有switch 将是另一种选择,但在这里它有点矫枉过正。这有点像 C++ 对虚函数所做的。