【问题标题】: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++ 对虚函数所做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 2010-10-28
      • 2012-04-16
      • 2020-12-30
      • 1970-01-01
      相关资源
      最近更新 更多