The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
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,...)




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

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