ncurses鸡蛋中的`getstr`(鸡肉计划)

时间:2017-07-23 14:24:49

标签: scheme ncurses chicken-scheme

我试图计算如何使用this egg的函数getstr(以及mvgetstrmvwgetstr等函数...)。 例如:

(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)。我没有在计划中使用指针的经验,我只是知道用这个蛋获得一个字符串的最好的防止白痴的方法。

2 个答案:

答案 0 :(得分:0)

最后我认为这是ncurses蛋的一个错误。 Here他们说这是一个错误而且它是正确的但我在上一个版本中遇到了同样的问题。

然而,这些函数并不是真正的方案,并且使用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))

答案 1 :(得分:0)

这似乎适用于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))