微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ncurses 链表未显示在屏幕中

如何解决ncurses 链表未显示在屏幕中

我制作了一个链表并用 4 个“#”字符填充它,我想用 ncurses 库在屏幕上打印它们,因为我正在尝试制作一个蛇游戏,但不知道为什么它不打印,这是代码

#include<ncurses.h>
#include<stdlib.h>

struct snake{

    char piece;
    struct snake *nextPiece;

};

struct snake *addNewPiece(const char piece){

    struct snake *newPiece = NULL;
    newPiece = malloc(sizeof(struct snake));

    if(newPiece != NULL){
        newPiece->nextPiece = NULL;
        newPiece->piece = piece;
    }else{

        endwin();
        printf("mem aloc failure,the program Couldn't alloc the memory correctly");
    }
    return newPiece;

}

int main(){

    int i = 0;

    struct snake *first = NULL;
    struct snake *added = NULL;

    initscr();
    noecho();

    int yMaxStd,xMaxStd;

    getmaxyx(stdscr,yMaxStd,xMaxStd);

    WINDOW* win = newwin(20,50,(yMaxStd/2)-10,10);
    Box(win,0);
    refresh();
    wrefresh(win);
    leaveok(win,true);

    int yMaxWin,xMaxWin;

    getmaxyx(win,yMaxWin,xMaxWin);
    wmove(win,yMaxWin/2,yMaxWin/2);

    //llenar lista con 4 #
    while(i<=4){
        if(first == NULL){
            first = addNewPiece("#");
            if(first != NULL){
                added = first;
            }
        }else{
            added->nextPiece = addNewPiece("#");
            if(added->nextPiece != NULL){
                added = added->nextPiece;
            }
        }
    }

    if(first == NULL){
        endwin();
        printf("Men alloc failure.");
    }

    printinscreen(first,win);


    getch();
    endwin();
    return 0;

}

void printinscreen(struct snake *piece,WINDOW* win){ 

    struct snake *t;

    t = piece;

    int y = 5,x = 5;

    if(t == NULL){
        endwin();
    }else{
        while(t != NULL){
            mvwprintw(win,y,x,t);
            t = t->nextPiece;
            y--;
        }
    }


}






我知道我正在完善链表的链接过程,因为我测试它在另一个文件中使用 stdio.h 打印它并且它工作

解决方法

你的程序有几个错误,我已经修复了。最严重的是你的代码不能用C++编译。如果打算在C++下编译,首先需要修复编译错误。

  1. ERROR Error: Angular JIT compilation failed: '@angular/compiler' not loaded! - JIT compilation is discouraged for production use-cases! Consider AOT mode instead. - Did you bootstrap using '@angular/platform-browser-dynamic' or '@angular/platform-server'? - Alternatively provide the compiler with 'import "@angular/compiler";' before bootstrapping. ,这里需要转换:newPiece = malloc(sizeof(struct snake));,一般不推荐在c++中使用newPiece = (snake *)malloc(sizeof(struct snake));,使用malloc

    更自然>
  2. new 将字符串文字作为 first = addNewPiece("#"); 参数传递,这里需要传递一个字符。

  3. char,你对API有误解,应该修正为mvwprintw(win,y,x,t);,你需要在使用库API之前查看document,看看它是什么类型的参数期待

  4. 您在打印屏幕后忘记刷新屏幕!

  5. 你没有在 for 循环中增加索引,这是一个无限循环。

你的代码有点c风格,如果你想用C++写,需要重构,一些建议:

  • 使用mvwprintw(win,"%c",t->piece);来存储snake body,那么我们就不需要手动管理内存了。并避免了容易出错的链表处理。然后可以简化大部分代码。
  • 使用日志库并打印日志以帮助调试

固定代码应该可以工作,我的控制台上有一条垂直的蛇。

std::vector

看到 PO 的评论后,我们知道问题被错误地标记为 #include <ncurses.h> #include <stdlib.h> struct snake { char piece; struct snake *nextPiece; }; struct snake *addNewPiece(const char piece) { struct snake *newPiece = NULL; newPiece = (snake *)malloc(sizeof(struct snake)); if (newPiece != NULL) { newPiece->nextPiece = NULL; newPiece->piece = piece; } else { endwin(); printf("mem aloc failure,the program couldn't alloc the memory correctly"); } return newPiece; } void printinscreen(struct snake *piece,WINDOW *win); int main(int argc,char *argv[]) { int i = 0; struct snake *first = NULL; struct snake *added = NULL; initscr(); noecho(); int yMaxStd,xMaxStd; getmaxyx(stdscr,yMaxStd,xMaxStd); WINDOW *win = newwin(20,50,(yMaxStd / 2) - 10,10); box(win,0); refresh(); wrefresh(win); leaveok(win,true); int yMaxWin,xMaxWin; getmaxyx(win,yMaxWin,xMaxWin); wmove(win,yMaxWin / 2,yMaxWin / 2); // llenar lista con 4 # while (i <= 4) { if (first == NULL) { first = addNewPiece('#'); if (first != NULL) { added = first; } } else { added->nextPiece = addNewPiece('#'); if (added->nextPiece != NULL) { added = added->nextPiece; } } ++i; } if (first == NULL) { endwin(); printf("Men alloc failure."); } printinscreen(first,win); refresh(); wrefresh(win); getch(); endwin(); return 0; } void printinscreen(struct snake *piece,WINDOW *win) { struct snake *t; t = piece; int y = 5,x = 5; if (t == NULL) { endwin(); } else { while (t != NULL) { mvwprintw(win,t->piece); t = t->nextPiece; y--; } } } ,c 版本代码:

c++

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。