nixp.ru v3.0

18 октября 2017,
среда,
21:45:48 MSK

DevOps с компанией «Флант»
Fatal написал 28 июня 2004 года в 19:51 (923 просмотра) Ведет себя как мужчина; открыл 123 темы в форуме, оставил 484 комментария на сайте.

Подскажите, пожалуйста, почему выдается segmentation fault из-за строки (3) и почему функция add_wch не находит определения (как пишет компилятор: не нахожу ссылки), хотя в man она описывается и говорится, что надо подключить , ниже ее прототип взят и man:

int add_wch( const cchar_t *wch );

#include

void exit_curs(int i){echo();nocbreak();endwin();exit(i);}

int main(void){

/*(1)*/ initscr();

/*(2)*/ w = newwin( 20, 20, 1, 1);

/*(3)*/ wattrset( w, A_ALTCHARSET | A_STANDOUT );

/*(4)*/ waddstr( w, «string»);

/*(5)*/ add_wch(“LINE”);

/*(6)*/ refresh();

/*(7)*/ sleep(3);

/*(8)*/ exit_curs(0);

}

Это пишет линкер. Компилировать надо так:

gcc ${CFLAGS} -o some_prog -lncurses some_src.c

или в случае bsd:

gcc ${CFLAGS} -o some_prog -lcurses some_src.c

Fatal

К примеру прога называется gr, исходник gr.c

В начале я компилировал так:

cc gr.c -o gr -lcurses -lm

Затем как говорили вы

gcc gr.c -o gr -lncurses

Но это ничего не изменило. Если вам не трудно попробуйте это пример на своей машине.

(у меня Linux Mandrake10)

Fatal

Я на BSD тоже поробовал как вы говорите:

но таже проблема не находит ссылку на add_wch, хотя в man он описан.

А я знаю. В ***** Mandrake нет по умолчанию всяких средств разработки (eg. заголовков различных бибилиотечек). Советую выкинуть mandrake и поставить нормальный дистрибутив.

Uncle Theodore

Или посмотри какие есть в Мандраке -devel пакеты, типа ncurses-devel и т.д. и поставлены ли они.

У меня линкуется без проблем (на Слаке), т.е. это не ошибка кода.

Good Luck,

UT

sas
cebka
А я знаю. В ***** Mandrake нет по умолчанию всяких средств разработки (eg. заголовков различных бибилиотечек). Советую выкинуть mandrake и поставить нормальный дистрибутив.

Я бы не стал ругать Mandrake. Нормальный дистрибутив. Впрочем, о вкусах не спорят.

Кроме того надо внимательно man читать. У меня на RH 7.3 и OS X он ясно говорит:

<<

PORTABILITY

      The ncurses library is intended to be  BASE-level  confor-

      mant  with  the  XSI Curses standard.  Certain portions of

      the EXTENDED XSI  Curses  functionality  (including  color

      support) are supported.  The following EXTENDED XSI Curses

      calls in support of wide (multibyte)  characters  are  not

      yet implemented: erasewchar, get_wstr, getn_wstr, in_wchn-

      str,  in_wchstr,   killwchar,   mvget_wstr,   mvgetn_wstr,

      mvin_wchnstr,   mvin_wchstr,   mvwget_wstr,  mvwgetn_wstr,

      mvwin_wchnstr,   mvwin_wchstr,   pecho_wchar,    slk_wset,

      term_attrs,  vid_puts, wget_wstr, wgetn_wstr, win_wchnstr,

      win_wchstr,

>>

Судя по всему ВСЕ семейство функций для работы с wide символами (включая add_wch) так же не реализованы. Документация частенько не соответствует реальному положению дел к сожалению.

Думаю, что для программиста *.h  и библиотека (otool on OS X and nm; objdump;file on Linux) должны превалировать над man.

Успехов

— sas

add_wch и правда нет. Я просто смотрел только первые две функции, а они реализованы. Просто изначально вопрос был поставлен неясно. Надо было привести вывод компилятора и линкера.

Смотрим ман:

Routine Name Index

The following table lists each curses routine and the name of the man-

ual page on which it is described. Routines flagged with `*' are

ncurses-specific, not described by XPG4 or present in SVr4.

add_wch вроде * не помечена, однако, ее действительно нет :\

Пробуем так:

> gcc -o test -lcurses test.c

test.c: In function `main’:

test.c:5: error: `w' undeclared (first use in this function)

test.c:5: error: (Each undeclared identifier is reported only once

test.c:5: error: for each function it appears in.)

Замечаем, что исходник совсем-совсем неверный

Исправляем:

#include

void exit_curs(int i){echo();nocbreak();endwin();exit(i);}

int main(void){

WINDOW *w;

/*(1)*/ initscr();

/*(2)*/ w = newwin( 20, 20, 1, 1);

/*(3)*/ wattrset( w, A_ALTCHARSET | A_STANDOUT );

/*(4)*/ waddstr( w, «string»);

/*(5)*/ add_wch(«LINE»);

/*(6)*/ refresh();

/*(7)*/ sleep(3);

/*(8)*/ exit_curs(0);

}

Пытаемся скомпилить:

/var/tmp//ccbHBF62.o: In function `main’:

/var/tmp//ccbHBF62.o(.text+0×70): undefined reference to `add_wch'

Приходим к выводу, что функция и впрямь не реализована :)

заменяем ее на addstr. Тогда работает.

2sas: у меня в манах этого не указано, потому я сразу начал грешить на Mandrake, ошибочно (?) предполагая, что не установлены libncurses-dev. Вот.

sas

Доброго времени cebka,

Я код даже и не смотрел :) Mandrake внимание привлек :)

Успехов

— sas

Fatal

Извините, я забыл поставить объявление переменной w, WINDOW*w. Просто этот кусок я вырезал из программы, где эта переменная был глобальная.

cebeka, у тебя все идет нормально, когда ты изменяешь add_wch на addstr? У меня вылетает segmentation fault из-за строки (3). И функция (4), в которой имеются параметры типа WINDOW вообще ничего не делает. А у вас изменяется шрифт функцией (3)?

Насчет реализации этой функции (add_wch(5)) : эта функция обязана быть реализована на в версиях Linux, BSD, т.к. в 1992-1994 эти функции были даже в библиотеки curses, а о ncurses и говорить нечего. Такие сведения у меня из книги Андрей «Богатырев_ Хрестоматия по программированию на Си в Unix», в которой приводится очень много интересных примеров, в том числе и пример на curses. Всем рекомендую ее прочитать, ее запросто можно найти в инете.

#include

void exit_curs(int i){echo();nocbreak();endwin();exit(i);}

int main(void){

WINDOW *w;

/*(1)*/ initscr();

/*(2)*/ w = newwin( 20, 20, 1, 1);

/*(3)*/ wattrset( w, A_ALTCHARSET | A_STANDOUT );

/*(4)*/ waddstr( w, «string»);

/*(5)*/ add_wch(«LINE»);

/*(6)*/ refresh();

/*(7)*/ sleep(3);

/*(8)*/ exit_curs(0);

}

myst

Не знаю у кого как, а у меня в /usr/share/doc/ncurses обнаружился файл ncurses-intro.html за авторством тов. Рэймонда, чего мне с головой хватило.

sas
Fatal
cebeka, у тебя все идет нормально, когда ты изменяешь add_wch на addstr? У меня вылетает segmentation fault из-за строки (3). И функция (4), в которой имеются параметры типа WINDOW вообще ничего не делает. А у вас изменяется шрифт функцией (3)?

Я бы посоветовал проверять указатель, возвращаемый из newwin на NULL.

Fatal
Насчет реализации этой функции (add_wch(5)) : эта функция обязана быть реализована на в версиях Linux, BSD, т.к. в 1992-1994 эти функции были даже в библиотеки curses, а о ncurses и говорить нечего. Такие сведения у меня из книги Андрей «Богатырев_ Хрестоматия по программированию на Си в Unix», в которой приводится очень много интересных примеров, в том числе и пример на curses. Всем рекомендую ее прочитать, ее запросто можно найти в инете.

На OS X:

sas@sas-pb:tests # otool -V -T /sw/lib/libncurses.5.0.3.dylib | grep add

add_tries.lo __nc_add_to_try

lib_addch.lo __nc_render

lib_addch.lo __nc_waddch_nosync

lib_gen.lo _addch

lib_gen.lo _addchnstr

lib_gen.lo _addchstr

lib_gen.lo _addnstr

lib_gen.lo _addstr

lib_gen.lo _mvaddch

lib_gen.lo _mvaddchnstr

lib_gen.lo _mvaddchstr

lib_gen.lo _mvaddnstr

lib_gen.lo _mvaddstr

lib_gen.lo _mvwaddch

lib_gen.lo _mvwaddchnstr

lib_gen.lo _mvwaddchstr

lib_gen.lo _mvwaddnstr

lib_gen.lo _mvwaddstr

lib_addch.lo _waddch

lib_addstr.lo _waddchnstr

lib_gen.lo _waddchstr

lib_addstr.lo _waddnstr

lib_gen.lo _waddstr

lib_addch.lo _wechochar

========================

На RH 7.3

[tivella@asus bin]$ nm /usr/lib/libncurses.so.5 | grep add

00022104 T _nc_add_to_try

0000f0d4 T _nc_waddch_nosync

00011cb4 T addch

00011ce0 T addchnstr

00011d10 T addchstr

00011d40 T addnstr

00011d70 T addstr

00012490 T mvaddch

000124e0 T mvaddchnstr

00012530 T mvaddchstr

00012580 T mvaddnstr

000125d0 T mvaddstr

00012ae0 T mvwaddch

00012b20 T mvwaddchnstr

00012b70 T mvwaddchstr

00012bc0 T mvwaddnstr

00012c10 T mvwaddstr

U sigaddset@@GLIBC_2.0

0000f6b0 T waddch

00010350 T waddchnstr

000133a0 T waddchstr

000102c4 T waddnstr

000133d0 T waddstr

Ну нельзя же быть таким легковерным :)

Успехов

— sas

Fatal

А толку проверять если все равно не работает? cebka, а у вас работает?

Как я написал, работает. Хотелось бы увидеть, что говорит gdb на полученный core файл. Желательно программу компилировать с опцией -ggdb

Fatal

У меня че-то не делается core файл, хотя перед Mandrake у меня стоял ASPLinux и там все было с этим в порядке. Может что-то настроить надо?

anonymous

Попробуй поиграться с /etc/security/limits.conf, потом с командой ulimit.

Fatal

Подскажи, пожалуйста, как играться? Или ссылку на доки.

anonymous
Fatal
Подскажи, пожалуйста, как играться? Или ссылку на доки.

http://www.opennet.ru/docs/RUS/lasg/users.html, вообще http://www.opennet.ru/docs/RUS/lasg — очень полезная подборка док по безопасности Linux.

Fatal

Спасибо!

Fatal

Подскажите, пожалуйста, как изменять цвета с помощью функций assume_default_colors и wcolor_set (или может как-то подругому). В manual pages я искал, но у меня с английским плоховато, все что я понял использовано в программе ниже. Там же в программке написано какие функции не работают у меня. Не судите строго программу, она создана исключительно для теста графики в ТЕКСТОВОМ РЕЖИМЕ. Она рабочая, только не контролирует некоторые ситуации, к примеру, выход звездочки за экран…

#include

#include

#define ESC 27

struct Coords{

int x,y;

};

int main(void){

int c;

char sym=’*';

WINDOW*w;

struct Coords cs={0,0};

initscr();

curs_set(0);/*to hide cursor*/

w=newwin(LINES-1,COLS-1,0,0);

start_color();/*to initialize colours*/

/*ASSUME_DEFAULT_COLOR: КАКОЙ ДОЛЖЕН БЫТЬ ПЕРВЫЙ АРГУМЕНТ. ВТОРОЙ АРГУМЕНТ МЕНЯЕТ ЦВЕТ ФОНА КАК ПОЛОЖЕНО, А ПЕРВЫЙ НЕ ХОЧЕТ*/

assume_default_colors(COLOR_WHITE,COLOR_RED);

noecho();

keypad(w,TRUE);

/*WCOLOR_SET: КАКОЙ ДОЛЖЕН БЫТЬ ВТОРОЙ И ТРЕТИЙ АРГУМЕНТ. В ДАННОЙ СИТУАЦИИ ЭТА ФУНКЦИЯ НЕ МЕНЯЕТ ЦВЕТА */

wcolor_set(w,3*16,NULL);

wmove(w,cs.y,cs.x);

do{

c=wgetch(w);

switch(c){

case KEY_LEFT:

cs.x--;

break;

case KEY_RIGHT:

cs.x++;

break;

case KEY_UP:

cs.y--;

break;

case KEY_DOWN:

cs.y++;

break;

default:

continue;

}

mvwaddch(w,cs.y,cs.x,sym);

}while(ESC!=c);

endwin();

return 0;

}

vnp
Fatal
Подскажите, пожалуйста, как изменять цвета с помощью функций assume_default_colors и wcolor_set (или может как-то подругому). В manual pages я искал, но у меня с английским плоховато, все что я понял использовано в программе ниже. Там же в программке написано какие функции не работают у меня. Не судите строго программу, она создана исключительно для теста графики в ТЕКСТОВОМ РЕЖИМЕ. Она рабочая, только не контролирует некоторые ситуации, к примеру, выход звездочки за экран…

/*ASSUME_DEFAULT_COLOR: КАКОЙ ДОЛЖЕН БЫТЬ ПЕРВЫЙ АРГУМЕНТ. ВТОРОЙ АРГУМЕНТ МЕНЯЕТ ЦВЕТ ФОНА КАК ПОЛОЖЕНО, А ПЕРВЫЙ НЕ ХОЧЕТ*/

assume_default_colors(COLOR_WHITE,COLOR_RED);

Не знаю, не знаю. У меня все меняет.

Fatal
/*WCOLOR_SET: КАКОЙ ДОЛЖЕН БЫТЬ ВТОРОЙ И ТРЕТИЙ АРГУМЕНТ. В ДАННОЙ СИТУАЦИИ ЭТА ФУНКЦИЯ НЕ МЕНЯЕТ ЦВЕТА */

wcolor_set(w,3*16,NULL);

Последний аргумент должен быть нулем. Второй аргумент должен быть номером пары — но сначала эту пару надо создать… man init_pair или curs_color.

Fatal

assume_default_colors(COLOR_WHITE,COLOR_RED);

>Не знаю, не знаю. У меня все меняет.

В данном примере у вас бегает белая звездочка по красному экрану или черная звездочка по красному экрану или черный квадаратик?

vnp
Fatal
assume_default_colors(COLOR_WHITE,COLOR_RED);

>Не знаю, не знаю. У меня все меняет.

В данном примере у вас бегает белая звездочка по красному экрану или черная звездочка по красному экрану или черный квадаратик?

В исходном виде бегает черный квадратик. Если закомментировать вызов wcolor_set, то белая звездочка. Если добавить init_pair (и вернуть wcolor_set), то черная звездочка.

Fatal

Вот это мне и надо было. Спасибо!

Fatal

Я забыл спросить:

почему какой бы ни был второй аргумент в функции assume_default_colors(COLOR_WHITE,COLOR_RED);

цвет букв не меняется, да плюс ко всему буквы вообще исчезают?

Fatal

Подскажите, пожалуйста, почему мышь не работает под консолью в следующем примерчике, который сделан на основе библиотеки ncurses:

#include

#include

#include

#include

#define ESC 27

char s[1000]=«Vasia»;

#define N 4

int main(void){

int key;

mmask_t test=-919;

WINDOW*w;

#ifdef NCURSES_MOUSE_VERSION

puts(«MOUSE IS OK. PRESS ENTER TO CONTINUE»);

getchar();

#else

puts(«MOUSE ISN’T HERE. PRESS ENTER TO CONTINUE»);

getchar();

return 1;

#endif

initscr();

if(NULL==(w=newwin(LINES,COLS,0,0)))

{endwin();return 1;}

curs_set(0);/*hide cursor*/

//keypad(w,TRUE);

test=mousemask(BUTTON1_CLICKED,NULL);

sprintf(s,«%ld»,test);

mvaddstr(2,2,s);

getch();

do{

key=wgetch(w);

sprintf(s,«%d»,key);

mvaddstr(LINES-2,0,s);

refresh();

switch(key){

case KEY_MOUSE:

mvaddstr(LINES-3,0,«MOUSE!!!»);

break;

default:

mvaddstr(LINES-3,0,«NOMOUSE»);

}

refresh();

}while(ESC!=key);

endwin();

return 0;

}