Fatal
написал 28 июня 2004 года в 19:51 (1503 просмотра)
Ведет себя
как мужчина; открыл 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);
}
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Это пишет линкер. Компилировать надо так:
gcc ${CFLAGS} -o some_prog -lncurses some_src.c
или в случае bsd:
gcc ${CFLAGS} -o some_prog -lcurses some_src.c
К примеру прога называется gr, исходник gr.c
В начале я компилировал так:
cc gr.c -o gr -lcurses -lm
Затем как говорили вы
gcc gr.c -o gr -lncurses
Но это ничего не изменило. Если вам не трудно попробуйте это пример на своей машине.
(у меня Linux Mandrake10)
Я на BSD тоже поробовал как вы говорите:
но таже проблема не находит ссылку на add_wch, хотя в man он описан.
А я знаю. В ***** Mandrake нет по умолчанию всяких средств разработки (eg. заголовков различных бибилиотечек). Советую выкинуть mandrake и поставить нормальный дистрибутив.
Или посмотри какие есть в Мандраке -devel пакеты, типа ncurses-devel и т.д. и поставлены ли они.
У меня линкуется без проблем (на Слаке), т.е. это не ошибка кода.
Good Luck,
UT
Я бы не стал ругать 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. Вот.
Доброго времени cebka,
Я код даже и не смотрел :) Mandrake внимание привлек :)
Успехов
— sas
Извините, я забыл поставить объявление переменной 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);
}
Не знаю у кого как, а у меня в /usr/share/doc/ncurses обнаружился файл ncurses-intro.html за авторством тов. Рэймонда, чего мне с головой хватило.
Я бы посоветовал проверять указатель, возвращаемый из newwin на NULL.
На 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
А толку проверять если все равно не работает? cebka, а у вас работает?
Как я написал, работает. Хотелось бы увидеть, что говорит gdb на полученный core файл. Желательно программу компилировать с опцией -ggdb
У меня че-то не делается core файл, хотя перед Mandrake у меня стоял ASPLinux и там все было с этим в порядке. Может что-то настроить надо?
Попробуй поиграться с /etc/security/limits.conf, потом с командой ulimit.
Подскажи, пожалуйста, как играться? Или ссылку на доки.
http://www.opennet.ru/docs/RUS/lasg/users.html, вообще http://www.opennet.ru/docs/RUS/lasg — очень полезная подборка док по безопасности Linux.
Спасибо!
Подскажите, пожалуйста, как изменять цвета с помощью функций 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;
}
Не знаю, не знаю. У меня все меняет.
Последний аргумент должен быть нулем. Второй аргумент должен быть номером пары — но сначала эту пару надо создать… man init_pair или curs_color.
assume_default_colors(COLOR_WHITE,COLOR_RED);
>Не знаю, не знаю. У меня все меняет.
В данном примере у вас бегает белая звездочка по красному экрану или черная звездочка по красному экрану или черный квадаратик?
В исходном виде бегает черный квадратик. Если закомментировать вызов wcolor_set, то белая звездочка. Если добавить init_pair (и вернуть wcolor_set), то черная звездочка.
Вот это мне и надо было. Спасибо!
Я забыл спросить:
почему какой бы ни был второй аргумент в функции assume_default_colors(COLOR_WHITE,COLOR_RED);
цвет букв не меняется, да плюс ко всему буквы вообще исчезают?
Подскажите, пожалуйста, почему мышь не работает под консолью в следующем примерчике, который сделан на основе библиотеки 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;
}