c / ncurses - 使用具有不同程序部分的getch

时间:2015-03-07 13:39:01

标签: c keyboard ncurses getch

我正在编写一个带有菜单和不同部分(创建/查看等)的简单ncurses程序,所有这些都使用键盘。目前我有一个getkey例程,然后切换以确定键盘输入的部分,如下所示:

ch = getch();

if(menu){
    switch(ch){
...

if(create){
    switch(ch){
...

if(view){
    switch(ch){
...

这是最好的方法,或者我应该为每个部分(menu_getkey(),view_getkey()等)提供不同的getkey例程 - 这是最好的方法吗?

1 个答案:

答案 0 :(得分:0)

这进入了一些设计(因此可能有点主观),但我认为你的方法很好。它允许您在深入了解详细信息之前处理接近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;
        }
    }
}

您的个人case可能需要更多逻辑,但您明白了。

功能短有助于提高可读性。现代编译器非常智能,只能调用一次内联函数(删除函数调用并直接插入代码),因此不要担心性能问题。 (如果有人挑剔这个 - 是的,它需要对不同编译单元中的函数进行链接时优化。)

让你更新的函数指针总是指向当前的输入焦点,而不是switch是另一种选择,但这里有点过分。它有点像C ++对虚函数的作用。