我正在尝试弄清楚如何使用这个鸡蛋的函数getstr
(以及mvgetstr
,mvwgetstr
等(。 例如:
(require-extension ncurses)
(let ((stdscr (initscr)) (str (make-string 10)))
(getstr str)
(addstr str)
(getch))
csi
告诉我
错误:错误的参数类型 - 不是指针:">
所以我尝试了这个:
(require-extension ncurses)
(let ((stdscr (initscr)) (str (make-string 10)))
(begin
(getstr (object->pointer str))
(addstr str)
(getch))))
这次csi
给我另一个错误:
错误:错误的参数类型 - 不是字符串:[panic] 检测到堆栈中损坏的数据 - 执行终止
我认为问题在于字符串的编码(一个函数认为是 ascii 和另一个 utf-8(。我没有使用方案中指针的经验,我只是知道用这个鸡蛋获得字符串的最佳防白痴方法。
最后,我认为这是ncurses蛋的虫子。在这里,他们说这是一个错误,并且是正确的,但是我对最新版本也有同样的问题。
但是,这些函数并不是真正类似于方案的,使用getch
重新定义这些函数很简单(可以正常工作(。 例如:
(define (mvgetstr x y)
(move y x)
(let loop ((str ""))
(let ((ch (getch)))
(if (eq? (char->integer ch ) 10) ;10 is the ENTER KEY code
str
(loop (string-append str (string ch)))))))
编辑:另一位用户建议了一种使用此功能的方法和类似方法:
(use ncurses lolevel data-structures)
(define (get-string max)
(let ((buffer (make-string max #null)))
(getnstr (make-locative buffer) max)
(string-translate buffer #null)))
(let ((stdscr (initscr))
(str (get-string 10)))
(addstr str)
(getch)
(write str))
这似乎适用于 Chicken Scheme 的第 5 版:
(import ncurses
(chicken locative)
(chicken string))
(let ((stdscr (initscr)) (str (make-string 10)))
(getstr (make-locative str))
(addstr (string-translate str #null))
(getch)
(endwin))