subpad返回NULL

时间:2015-09-22 22:27:56

标签: c ncurses

我坚持用ncurses来解决问题:当我尝试在主屏幕上创建子板时,我收到NULL指针作为结果,errno = 0。

测试示例:

#include <curses.h>
#include <assert.h>

int main(int, char**) {
    initscr();

    WINDOW *pad = subpad(stdscr, 10, 10, 6, 1);
    assert(pad);
    delwin(pad);

    endwin();

    return 0;
}

用以下内容编译:

$ g++ -g -O0 -o pad ./main.cpp -lncurses

在断言之前我有以下状态:

(gdb) run
Starting program: /tmp/ncurses/pad 

Breakpoint 1, main () at ./main.cpp:10
10      assert(pad);
(gdb) p pad
$1 = (WINDOW *) 0x0
(gdb) p errno
$2 = 0
(gdb) 

Man page表示只能使用errno = ENOMEM返回NULL。

我使用Debian Jessie 64bit,gcc 4.9,libncurses 5.9。

我的问题是:我做错了什么以及为什么我得到NULL指针而不是supbad?

1 个答案:

答案 0 :(得分:2)

subpad()期望父垫作为第一个参数,而不是WINDOW(stdscr),尽管对窗口和垫的引用存储在WINDOW *中实际上它们之间存在一些差异(垫缺少屏幕坐标且无法刷新用wrefresh)。

从联机帮助页:

  

“垫子就像一个窗户,除了它不受限制   屏幕尺寸,并不一定与特定部分相关联   屏幕。“

所以你应该先创建父垫:

WINDOW *ppad, *subpad;

ppad = newpad(50,50);
if (ppad == NULL) {
    /* always check for null */
}

/* create the subpad */
subpad = subpad(ppad, lines, cols, y, x);
if(subpad == NULL ) {
    /* always check for null */
}   

addstr("Subpad created\n");
refresh();

/* just a pause... */
getch();