#c #terminal #scheme #ncurses
Вопрос:
Я работаю над личным экспериментом, используя схему s7 и ncurses. У меня нет большого опыта работы с ncurses, и я не могу с помощью имеющихся у меня учебных пособий понять, что происходит не так. При использовании newwin
через интерфейс FFI такие функции, как wprintw
или wborder
не работают в созданном мной окне, но на всем доступном экране терминала.
Для начала пример C работает так, как ожидалось. Появится небольшое окно с текстом в левом верхнем углу.
initscr();
cbreak();
WINDOW * w = newwin(5, 15, 2, 2);
box(w, 0, 0);
wprintw(w, "ok");
wrefresh(w);
Я определяю функции для вызова из s7. Это сопоставление этих функций 1 к 1, поэтому код должен быть идентичным. Программа функционирует, но окно работает не так, как ожидалось. Размер окна неправильный, или он не нацелен на указатель окна, который я ему даю.
(nc_initscr)
(nc_cbreak)
(define w (nc_newwin 5 15 2 2))
(nc_box w 0 0)
(nc_wprintw w "ok")
(nc_wrefresh w)
// Example C hook
s7_pointer _newwin(s7_scheme * sc, s7_pointer * args) {
int height = first(args);
int width = second(args);
int y = third(args);
int x = fourth(args);
WINDOW * win = newwin(height, width, y, x);
return s7_make_c_pointer(sc, win);
}
s7_define_function(sc, "nc_newwin", _newwin, 4, "");
Есть ли что-то в вызове этих функций, что я упускаю из виду?
Ответ №1:
Похоже (define w (nc_newwin 5 15 2 2))
, что он не передает указатель на окно, как ожидалось, или другие крючки игнорируют это. В любом случае, они используют stdscr
, а не возвращаемое значение newwin
.
Комментарии:
1. Я проверил адреса указателей окна, которое я передаю, и
stdscr
.w
не равно нулю, и у них разные адреса. Я также попытался объявить окно, созданное в результате этого вызова, глобальной переменной, а затем использовать эту переменную для будущих вызововwprintw
. Тот же результат.2.
box
однако используетstdscr
.3. Я не знаю, почему.
w
не равноstdscr
, и функции крючка получают правильный адрес. Поведение при использованииwborder
такое же .4. Я больше не могу редактировать свой комментарий, но, чтобы быть уверенным, я прогнал его через GDB и проверил:
(gdb) print stdscr ->$1 = (WINDOW *) 0x555555843290
,(gdb) print win -> $2 = (WINDOW *) 0x55555586cdf0
5. Обратитесь к источнику .
Ответ №2:
Это была ошибка с моей стороны. Я неправильно читал целочисленные аргументы схемы. Недопустимые значения по умолчанию имели тот же размер, stdscr
что и .