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, 13:40 , 10-Фев-05 (1)
А успешность выделения памяти проверять уже не модно?
- ncurses программа валится в кору, Mercurius, 15:36 , 10-Фев-05 (2)
>А успешность выделения памяти проверять уже не модно? если ты имеешь в виду calloc, то там всё нормально - я проверял ;) а newwin при создании окна сама, насколько я понял из мана по курсам, выделяет память ;) кора происходит в wtouchln, которая из touchwin (или wrefresh? не помню ;) вызывается ;)
- ncurses программа валится в кору, Soldier, 17:15 , 10-Фев-05 (3)
>в функции 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, 17:25 , 10-Фев-05 (4)
>При передаче указателя bwin в функцию wCreate можно изменять данные, на который >этот указатель ссылается, но не само значение указателя. Поэтому после вызова >функции wCreate, bwin будет иметь тоже самое значение, что и до >ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а >на какой-то мусор. Да, баг :) согласен ;) если malloc выкинуть - то же самое получается... корка -_-
- ncurses программа валится в кору, Soldier, 17:28 , 10-Фев-05 (5)
>>При передаче указателя bwin в функцию wCreate можно изменять данные, на который >>этот указатель ссылается, но не само значение указателя. Поэтому после вызова >>функции wCreate, bwin будет иметь тоже самое значение, что и до >>ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а >>на какой-то мусор. > >Да, баг :) согласен ;) >если malloc выкинуть - то же самое получается... корка -_- Естественно корка - теперь оно еще ссылается на неинициализированную область памяти :)))
- ncurses программа валится в кору, Mercurius, 17:35 , 10-Фев-05 (6)
> >Естественно корка - теперь оно еще ссылается на неинициализированную область памяти >:))) А как же с первым окном проходит? newwin разве не инициализирует всё как надо? :)
- ncurses программа валится в кору, Soldier, 17:37 , 10-Фев-05 (7)
>> >>Естественно корка - теперь оно еще ссылается на неинициализированную область памяти >>:))) > >А как же с первым окном проходит? newwin разве не инициализирует всё >как надо? :) Внутри функции wCreate все нормально, но после выхода из нее значение bwin принимает исходное значение... Вы что новичок на C что-ли?
- ncurses программа валится в кору, Mercurius, 21:52 , 10-Фев-05 (8)
>Внутри функции wCreate все нормально, но после выхода из нее значение >bwin принимает исходное значение... Вы что новичок на C что-ли? >не новичок, просто давно не программировал, и не помню, почему так ;)
- ncurses программа валится в кору, Soldier, 07:53 , 11-Фев-05 (9)
>>Внутри функции 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,...)
|