【问题标题】:How To Make A Function That Returns An Ncurses Function如何制作返回 Ncurses 函数的函数
【发布时间】:2017-03-26 04:18:51
【问题描述】:

我对编程完全陌生。我正在尝试制作一个非常基本的 Ncurses 游戏。我的问题是我有一些非常重复的代码,我在其中获取一个字符串,计算它的长度,将其除以 2,然后从列数中减去。我这样做是为了让我的文本在屏幕上居中。我想通过制作一个函数来使这更容易,但我不知道如何制作一个返回 Ncurses 函数 mvprintw(y,x,string) 的函数

这是我的代码,以便您更好地理解:

#include <iostream>
#include <ncurses.h>
#include <string.h>

int main(){

initscr();

int x,y;

    getmaxyx(stdscr, y, x);
    mvprintw(0,x/2-(strlen("************")/2), "************");
    mvprintw(1,x/2-(strlen("Welcome")/2), "Welcome");
    mvprintw(2,x/2-(strlen("************")/2), "************");
    refresh();
    getch();

endwin();
return 0;
}

【问题讨论】:

  • 你的代码是 C(除了&lt;iostream&gt; 是没用的)。关于您的标题(与您的代码无关),在 C++11 中,您将使用 closuresreturn 一个函数(作为某个值)。可能与lambdas & std::function

标签: c++ function types return ncurses


【解决方案1】:

你弄清楚你想要执行的操作所依赖的参数,所以你知道要传递什么。然后就像编写操作一样简单,同时用参数名称替换实际参数。

void center_text(int y, int x, char const* text) {
  mvprintw(0,x/2-(strlen(text)/2), text);
}

一旦你有了它,就用它吧:

getmaxyx(stdscr, y, x);
center_text(0, x, "************");
center_text(1, x, "Welcome");
center_text(2, x, "************");

【讨论】:

  • 好的,我明白了,所以返回类型是无效的,里面的语句会做我想要的。我不知道为什么我没有看到。谢谢!
【解决方案2】:

我相信,这就是你所需要的:

void centered(const char* str, int &x){
    static int count = 0;
    mvprintw(count,x/2-(strlen(str)/2), str);
    count++;
}

....

centered("************", x)
centered("Welcome", x)
centered("************", x)

但是你应该在尝试编写函数之前了解它们(显然)

【讨论】:

    【解决方案3】:

    这是一个可以完成这项工作的函数:

    static void printCentered(int y, int x, char * text) {
        mvprintw(y, x - (strlen(text) / 2), text);
    }
    

    我修改了居中计算假设 x 代表中心线。 然后你可以使用这个函数而不是直接调用 mvprintw。

    printCentered(0, x, "***************");
    printCentered(1, x, "Welcome");
    printCentered(2, x, "***************");
    

    【讨论】:

    • 其实第三个形式参数最好是const char* text
    • 如果我理解正确,x 是行的宽度,所以要使文本居中,表达式应该是(x - strlen(text)) / 2x/2 - strlen(text)/2
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2019-02-01
    • 2010-12-05
    • 1970-01-01
    • 2014-05-17
    • 2015-10-31
    相关资源
    最近更新 更多