URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 3942
[ Назад ]

Исходное сообщение
"ncurses программа валится в кору"

Отправлено Mercurius , 10-Фев-05 13:30 
в функции 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);
}


Содержание

Сообщения в этом обсуждении
"ncurses программа валится в кору"
Отправлено dimus , 10-Фев-05 13:40 
А успешность выделения памяти проверять уже не модно?

"ncurses программа валится в кору"
Отправлено Mercurius , 10-Фев-05 15:36 
>А успешность выделения памяти проверять уже не модно?

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

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



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

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

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

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


"ncurses программа валится в кору"
Отправлено Mercurius , 10-Фев-05 17:25 
>При передаче указателя bwin в функцию wCreate можно изменять данные, на который
>этот указатель ссылается, но не само значение указателя. Поэтому после вызова
>функции wCreate, bwin будет иметь тоже самое значение, что и до
>ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а
>на какой-то мусор.

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



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

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


"ncurses программа валится в кору"
Отправлено Mercurius , 10-Фев-05 17:35 
>
>Естественно корка -  теперь оно еще ссылается на неинициализированную область памяти
>:)))

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



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


"ncurses программа валится в кору"
Отправлено Mercurius , 10-Фев-05 21:52 
>Внутри функции wCreate  все нормально, но после выхода из нее значение
>bwin принимает исходное значение... Вы что новичок на C  что-ли?
>

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


"ncurses программа валится в кору"
Отправлено Soldier , 11-Фев-05 07:53 
>>Внутри функции 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,...)