в функции 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);
}
А успешность выделения памяти проверять уже не модно?
>А успешность выделения памяти проверять уже не модно?если ты имеешь в виду calloc, то там всё нормально - я проверял ;)
а newwin при создании окна сама, насколько я понял из мана по курсам, выделяет память ;)кора происходит в wtouchln, которая из touchwin (или wrefresh? не помню ;) вызывается ;)
>в функции runMenu при вызове touchwin (вызываю wRef, она вызывает touchwin) программа
>выпадает в корку.
>Где баг - понять не могу. Гугль молчит...
>
>в остальных случаях всё нормально... Я понимаю, что проблема в /dev/hands, но
>где багу-то искать? :)Поясните пожалуйста смысл следующих строчек:
bwin = (WINDOW *)malloc(sizeof (WINDOW));
wCreate (bwin, nlines, ncols, yl, xl, title, battr);При передаче указателя bwin в функцию wCreate можно изменять данные, на который этот указатель ссылается, но не само значение указателя. Поэтому после вызова функции wCreate, bwin будет иметь тоже самое значение, что и до ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а на какой-то мусор.
>При передаче указателя bwin в функцию wCreate можно изменять данные, на который
>этот указатель ссылается, но не само значение указателя. Поэтому после вызова
>функции wCreate, bwin будет иметь тоже самое значение, что и до
>ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а
>на какой-то мусор.Да, баг :) согласен ;)
если malloc выкинуть - то же самое получается... корка -_-
>>При передаче указателя bwin в функцию wCreate можно изменять данные, на который
>>этот указатель ссылается, но не само значение указателя. Поэтому после вызова
>>функции wCreate, bwin будет иметь тоже самое значение, что и до
>>ее вызова, а значит ссылаться не на окно, созданное newwin-ом, а
>>на какой-то мусор.
>
>Да, баг :) согласен ;)
>если malloc выкинуть - то же самое получается... корка -_-Естественно корка - теперь оно еще ссылается на неинициализированную область памяти :)))
>
>Естественно корка - теперь оно еще ссылается на неинициализированную область памяти
>:)))А как же с первым окном проходит? newwin разве не инициализирует всё как надо? :)
>>
>>Естественно корка - теперь оно еще ссылается на неинициализированную область памяти
>>:)))
>
>А как же с первым окном проходит? newwin разве не инициализирует всё
>как надо? :)
Внутри функции wCreate все нормально, но после выхода из нее значение bwin принимает исходное значение... Вы что новичок на C что-ли?
>Внутри функции wCreate все нормально, но после выхода из нее значение
>bwin принимает исходное значение... Вы что новичок на C что-ли?
>не новичок, просто давно не программировал, и не помню, почему так ;)
>>Внутри функции 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,...)