The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"ncurses программа валится в кору"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"ncurses программа валится в кору" 
Сообщение от Mercurius emailИскать по авторуВ закладки(ok) on 10-Фев-05, 13:30  (MSK)
в функции runMenu при вызове touchwin (вызываю wRef, она вызывает touchwin) программа выпадает в корку.
Где баг - понять не могу. Гугль молчит...

в остальных случаях всё нормально... Я понимаю, что проблема в /dev/hands, но где багу-то искать? :)

ниже кусок кода:
(части кода потырены с мануалов по ncurses, найденных на просторах гугля)

void wCreate (WINDOW *pwin, int nlines, int ncols, int yl, int xl, const char *title, int wattr)
{
pwin = newwin(nlines, ncols, yl, xl);
wattrset(pwin, wattr);
wClrscr(pwin);
box(pwin, 0, 0);
wCenterTitle(pwin, title);
wRef(pwin);

}

/* Creates a menu - rewritten 'cause a very strange bug. */
int runMenu (WINDOW *pwin, int nlines, int ncols, int yl, int xl, const char *title, int fattr, int battr, char* mitems[])
{
ITEM **items;
MENU *menu;
WINDOW *bwin, *uwin;
int c;
int n_ch;
int ssch;
int curch = -1; /* -1 - nothing chosen */

/* Calculate amount of items, NULL must be at the end */
for (n_ch = 0; mitems[n_ch]; n_ch++);

/* Allocate memory */
items = (ITEM **)calloc(n_ch+1,sizeof(ITEM *));
for (ssch = 0; ssch < n_ch; ++ssch) {
items[ssch] = new_item(mitems[ssch], NULL);
}
items[n_ch] = (ITEM *)NULL; /* finish */

menu = new_menu ((ITEM **)items);

bwin = (WINDOW *)malloc(sizeof (WINDOW));
wCreate (bwin, nlines, ncols, yl, xl, title, battr);

set_menu_win (menu, bwin);
set_menu_sub (menu, bwin);

/* Set menu colors */
set_menu_fore(menu, fattr);
set_menu_back(menu, battr);

post_menu (menu);

wRef (bwin);

return (curch);
}

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "ncurses программа валится в кору" 
Сообщение от dimus Искать по авторуВ закладки(??) on 10-Фев-05, 13:40  (MSK)
А успешность выделения памяти проверять уже не модно?
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "ncurses программа валится в кору" 
Сообщение от Mercurius emailИскать по авторуВ закладки(ok) on 10-Фев-05, 15:36  (MSK)
>А успешность выделения памяти проверять уже не модно?

если ты имеешь в виду calloc, то там всё нормально - я проверял ;)
а newwin при создании окна сама, насколько я понял из мана по курсам, выделяет память ;)

кора происходит в wtouchln, которая из touchwin (или wrefresh? не помню ;) вызывается ;)


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "ncurses программа валится в кору" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 10-Фев-05, 17:15  (MSK)
>в функции runMenu при вызове touchwin (вызываю wRef, она вызывает touchwin) программа
>выпадает в корку.
>Где баг - понять не могу. Гугль молчит...
>
>в остальных случаях всё нормально... Я понимаю, что проблема в /dev/hands, но
>где багу-то искать? :)

Поясните пожалуйста смысл следующих строчек:

bwin = (WINDOW *)malloc(sizeof (WINDOW));
wCreate (bwin, nlines, ncols, yl, xl, title, battr);

При передаче указателя bwin в функцию wCreate можно изменять данные, на который этот указатель ссылается, но не само значение указателя. Поэтому после вызова функции wCreate, bwin будет иметь тоже самое значение, что и до ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а на какой-то мусор.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "ncurses программа валится в кору" 
Сообщение от Mercurius emailИскать по авторуВ закладки(ok) on 10-Фев-05, 17:25  (MSK)
>При передаче указателя bwin в функцию wCreate можно изменять данные, на который
>этот указатель ссылается, но не само значение указателя. Поэтому после вызова
>функции wCreate, bwin будет иметь тоже самое значение, что и до
>ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а
>на какой-то мусор.

Да, баг :) согласен ;)
если malloc выкинуть - то же самое получается... корка -_-


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "ncurses программа валится в кору" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 10-Фев-05, 17:28  (MSK)
>>При передаче указателя bwin в функцию wCreate можно изменять данные, на который
>>этот указатель ссылается, но не само значение указателя. Поэтому после вызова
>>функции wCreate, bwin будет иметь тоже самое значение, что и до
>>ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а
>>на какой-то мусор.
>
>Да, баг :) согласен ;)
>если malloc выкинуть - то же самое получается... корка -_-

Естественно корка -  теперь оно еще ссылается на неинициализированную область памяти :)))

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "ncurses программа валится в кору" 
Сообщение от Mercurius emailИскать по авторуВ закладки(ok) on 10-Фев-05, 17:35  (MSK)
>
>Естественно корка -  теперь оно еще ссылается на неинициализированную область памяти
>:)))

А как же с первым окном проходит? newwin разве не инициализирует всё как надо? :)


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "ncurses программа валится в кору" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 10-Фев-05, 17:37  (MSK)
>>
>>Естественно корка -  теперь оно еще ссылается на неинициализированную область памяти
>>:)))
>
>А как же с первым окном проходит? newwin разве не инициализирует всё
>как надо? :)
Внутри функции wCreate  все нормально, но после выхода из нее значение bwin принимает исходное значение... Вы что новичок на C  что-ли?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "ncurses программа валится в кору" 
Сообщение от Mercurius emailИскать по авторуВ закладки(??) on 10-Фев-05, 21:52  (MSK)
>Внутри функции wCreate  все нормально, но после выхода из нее значение
>bwin принимает исходное значение... Вы что новичок на C  что-ли?
>

не новичок, просто давно не программировал, и не помню, почему так ;)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "ncurses программа валится в кору" 
Сообщение от Soldier Искать по авторуВ закладки(??) on 11-Фев-05, 07:53  (MSK)
>>Внутри функции wCreate  все нормально, но после выхода из нее значение
>>bwin принимает исходное значение... Вы что новичок на C  что-ли?
>>
>
>не новичок, просто давно не программировал, и не помню, почему так ;)
>

Ну так книжки почитайте, сразу вспомните :)

Вобщем здесь навскидку можно так:
1) Если использовать С++, то декларировать wCreate так:
void wCreate (WINDOW * &pwin, ...
2) Для С
a) декларировать wCreate так:
  void wCreate (WINDOW ** pwin,...,  
  внутри wCreate заменить pwin на *pwin (*pwin = newwin(...) и т.д.),
  вызывать wCreate так:  wCreate(&bwin,...)
b) декларировать wCreate так:
  WINDOW * wCreate (int nlines, int ncols, int yl, int xl, const char *title, int wattr)  
Внутри wCreate задекларировать переменную WINDOW *pwin,  в конце добавить строчку return pwin, вызывать wCreate так: bwin=wCreate(nlines,...)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру