2016-05-25 5 views
-1

Я создаю базовый движок терминальных приложений с ncurses. Я создал базовый класс окон, в котором хранится окно, с которым вы работаете, и позволяет писать на нем. Теперь, я делаю класс ColorWindow, который наследует от BasicWindow, и должен позволить вам писать с цветами. За абстракции, я initilizing цвет пар мне нужно в одном из методов класса, вот пример кода:Цветные пары в ncurses не работают должным образом в классах

EDIT: Я пишу здесь весь код

#include <ncurses.h> 
#include <unistd.h> 
#include <signal.h> 
#include <stdio.h> 
#include <string.h> 
#include <iostream> 
#include <iomanip> 
#include <locale> 
#include <sstream> 
#include <string> 

class ColorWindow : public BasicWindow { 
private: 
    int npairs; 
    bool canColor; 
    void initializePairs() { 
     init_pair(1, COLOR_RED, COLOR_BLACK); 
     init_pair(2, COLOR_GREEN, COLOR_BLACK); 
     init_pair(3, COLOR_YELLOW, COLOR_BLACK); 
     init_pair(4, COLOR_BLUE, COLOR_BLACK); 
     init_pair(5, COLOR_MAGENTA, COLOR_BLACK); 
     init_pair(6, COLOR_CYAN, COLOR_BLACK); 
     init_pair(7, COLOR_WHITE, COLOR_BLACK); 

     npairs = 8; 
    } 

    public: 
    ColorWindow() { 
     if(has_colors()) { 
      initializePairs(); 
      this->canColor = true; 
     } 
     else { 
      this->canColor = false; 
     } 
    } 

    ColorWindow(int he, int wi, int stx, int sty) : BasicWindow(he, wi, stx, sty) { 
     if(has_colors()) { 
      initializePairs(); 
      this->canColor = true; 
     } 
     else { 
      this->canColor = false; 
     } 
    } 

    int addColorPair(int foreground, int background) { 
     if(foreground < 0 || foreground > 7 
       || background < 0 || background > 7) 
       return -1; 

     init_pair(npairs, foreground, background); 
     npairs++; 

     return npairs-1; 
    } 

    bool ColorWindow::writeStringWithColor(int x, int y,const char* message, int pair) { 
     if(!isInLimits(x, y)) 
      return false; 

     if(pair >= npairs) 
      return false; 

     if(canColor) 
      return false; 

     wattron(getContainer(), COLOR_PAIR(pair)); 
     mvwprintw(getContainer(), x, y, message); 
     wattroff(getContainer(), COLOR_PAIR(7)); 
    } 

    bool changeColor(int color, int r, int g, int b) { 
     if(!can_change_color()) 
      return false; 

     if(color < 0 || color > 7 || r < 0 || r > 1000 
      || g < 0 || g > 1000 || b < 0 || b > 1000) 
      return false; 

     init_color(color, r, g, b); 

     return true; 
    } 

}; 

class BasicWindow { 
    private: 
    WINDOW* container; 
    int startx, starty, height, width; 

    public: 
    BasicWindow() { 
     this->height = 20; 
     this->width = 84; 
     this->starty = (LINES - height)/2; /* Calculating for a center placement */ 
     this->startx = (COLS - width)/2; 
    } 

    BasicWindow(int he, int wi, int stx, int sty) { 
     this->height = he; 
     this->width = wi; 
     this->starty = sty; 
     this->startx = stx; 
    } 


    WINDOW* createNewContainer() { 
      this->container = newwin(height, width, starty, startx); 

      wrefresh(this->container);  /* Show that box  */ 

      return getContainer(); 
    } 

    WINDOW* getContainer() { 
      return this->container; 
    } 

    bool writeString(int x, int y, const char* message) { 
     if(!isInLimits(x, y)) 
      return false; 

      mvwprintw(this->container, x, y, message); 
     } 


    void refreshContainer() { 
     refresh(); 
     wrefresh(this->container);  /* Show that box  */ 
    } 

    void destroyWindow() { 
     wborder(this->container, ' ', ' ', ' ',' ',' ',' ',' ',' '); 

     wrefresh(this->container); 
     delwin(this->container); 
    } 

    bool isInLimits(int x, int y) { 
     if(x < 0 || x >= this->width-1) { 
      return false; 
     } 
     if(y < 0 || y >= this->height-1) { 
       return false; 
     } 
     return true; 
}; 

И вот основная:

#include <iostream> 
#include <unistd.h> 
#include <ncurses.h> 
#include "windows.h" 

int main() { 
    ColorWindow cw = ColorWindow(20, 80, 0, 0); 


    initscr();   /* Start curses mode  */ 
    cbreak();   /* Line buffering disabled, Pass on 
         * everty thing to me  */ 
    keypad(stdscr, TRUE); 
    start_color(); 

    WINDOW* container; 

    container = cw.createNewContainer(); 
    cw.writeStringWithColor(0, 10, "Hello everyone in color!!", 2); 
    cw.refreshContainer(); 
    sleep(2); 
    endwin(); 

    return 0; 
} 

Он инициализирует цветной режим, но ничего не показывает, как если бы выбрана пара BLACK BLACK.

Если кто-нибудь может дать мне подсказку о том, что я делаю неправильно, я буду его оценивать.

+0

Пример до сих пор не компилируется. –

+0

Наконец, я загрузил ВСЕ код и makefile в этот репозиторий github. https://github.com/Shirkamdev/physic_simulator – Shirkam

ответ

0

Выполнение кода (и отслеживание его использования Ncurses' debug-trace feature), есть только один вызов init_pair, используя номер пары, которая, как представляется, исходить от неинициализированного значения, например, 7978 в этой части предложения:

called {init_pair(0x193e250,7978,5,7) 
return }0 

и быстрое сканирование из источников показывает, что соответствует этому методу:

/* PUBLIC METHODS */ 
int ColorWindow::addColorPair(int foreground, int background) { 
     if(foreground < 0 || foreground > 7 
       || background < 0 || background > 7) 
       return -1; 

     init_pair(npairs, foreground, background); 
     npairs++; 

     return npairs-1; 
} 

и npairs никогда не устанавливается на ноль в конструкторе.

Вы можете найти valgrind полезно для просмотра этого типа проблемы.

+0

Ну, это была ошибка при копировании кода. Я отредактировал так, теперь он показывает весь мой код. – Shirkam

 Смежные вопросы

  • Нет связанных вопросов^_^