LINUX.ORG.RU

Приложение с ncurses работает не так как ожидалось...


0

0

Привет всем!

Изучаю ncurses. Решил создать совою обертку чтобы лекго оперировать сущностями этой библиотеки используя ООП. Так вот создал я класс window и решил сделать анимацию, чтобы окошко передвигалось по верхнему краю экрана от левого края к правому, вот код класса:


class window
{

  WINDOW* m_handler;

public:

  window()
  {
     m_handler = newwin( LINES/2, COLS/2, 0, 0 );
  }

  window( int height, int width, int start_y, int start_x )
  {
     m_handler = newwin( height, width, start_y, start_x );
  }

  ~window()
  {
     wborder( m_handler, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
     if( m_handler )
     {
        delwin( m_handler );
        wrefresh( m_handler );
     }
     m_handler = NULL;
  }

  void show()
  {
     if( m_handler )
     {
        box( m_handler, 0, 0 );
        wrefresh( m_handler );
     }

  }


};

void func( int i )
{
    window win;
    win.show( 10, 10, 0, i);
    
    usleep( 100000 );
}

int main()
{
   initscr();
   cbreak();

   for( int i = 0; i < COLS - 10; ++i )
   {
      func(i);
   }

   endwin();
}   


В итоге при запуске получаю Segmentation fault:

Program terminated with signal 11, Segmentation fault.
[New process 12960]
#0  0xb7cefe91 in ?? () from /lib/tls/i686/cmov/libc.so.6
(gdb) bt
#0  0xb7cefe91 in ?? () from /lib/tls/i686/cmov/libc.so.6
#1  0xb7cf1b8d in ?? () from /lib/tls/i686/cmov/libc.so.6
#2  0xb7cf39c5 in malloc () from /lib/tls/i686/cmov/libc.so.6
#3  0xb7f12075 in _nc_hash_map () from /lib/libncurses.so.5
#4  0xb7f11344 in _nc_scroll_optimize () from /lib/libncurses.so.5
#5  0xb7f26c6d in doupdate () from /lib/libncurses.so.5
#6  0xb7f1d9c3 in wrefresh () from /lib/libncurses.so.5
#7  0x08048d4f in ngui::window::~window ()
#8  0x08048ac4 in func ()
#9  0x08048b32 in main ()

Подскажите, что я делю не так ??

  ~window()
  {
     wborder( m_handler, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
     if( m_handler )
     {
        delwin( m_handler );
        wrefresh( m_handler );
     }
     m_handler = NULL;
  }

может быть променять местами delwin и wrefresh ?

Eshkin_kot ★★
()

1. можно наставить printf и посмотреть после чего падает.

2. можно пустить дебагер и посмотреть после чего падает.

а вообще, на сколько я помню курсисы, у тебя сделано неправильно.

окну надо сказать wmove, потом wnoutrefresh и doupdate. тогда оно дергаться не будет.

> delwin( m_handler );

> wrefresh( m_handler );


delwin и refresh, имхо.

зы. про курсисы есть чудная книжка для старта (в инете и в пдф-е), но как называется я забыл :)

Rastafarra ★★★★
()

проще готовый взять http://ndk-xx.sourceforge.net/

там три строки поправить пришлось, и демо скомпилилось, показует окошки, менюшки, табы...

www_linux_org_ru ★★★★★
()

Пиши мне по Jabber: lubyagin@jabber.ru
или по почте: lubyagin@yandex.ru
Мне нужно решать подобную задачу.

pacify ★★★★★
()
Ответ на: комментарий от pacify

Либо, связаться со мной можно через Юрия Азовцева (Нижегородская граппа пользователей Linux, NNLUG), которого зовут gumanoed (см. форум www.lug.nnov.ru).

pacify ★★★★★
()
Ответ на: комментарий от Eshkin_kot

Ура! Помогла замена местами delwin и wrefresh!! Че-то я ступил :-)

Спасибо!

mindsurfer
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.