You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

janet_wrap_array正确使用方法:Janet C API结合ncurses返回数组异常问题

问题根源

你的代码存在3个核心错误,共同导致了输出异常:

  • 类型定义错误:int *yxpos[2] 定义的是int指针数组,你直接把y、x两个int类型的坐标值当成指针地址存到了数组里,本身存的就不是坐标数值。
  • 栈内存逃逸错误:yxpos是函数内的栈局部变量,函数执行结束后栈空间会被系统回收,你把这个栈地址直接返回给Janet runtime,后续访问的都是已经被释放的野内存,自然会读到乱码值。
  • Janet数组构造错误:Janet的JanetArray有自己的结构定义和内存管理规则,不能直接把C原生数组强制转换成JanetArray*使用,必须用Janet提供的官方API构造合法的数组对象。

修复方案

按照Janet C API的规范重写jgetyx函数即可:

static Janet jgetyx(int32_t argc, Janet *argv){
  janet_fixarity(argc, 1);
  WINDOW *win = (WINDOW *) janet_getpointer(argv, 0);
  int y, x; 
  getyx(win, y, x);
  // 用Janet API构造长度为2的数组
  JanetArray *arr = janet_array(2);
  // 把int坐标转成Janet的integer类型塞进数组
  janet_array_push(arr, janet_wrap_integer(y));
  janet_array_push(arr, janet_wrap_integer(x));
  return janet_wrap_array(arr);
}

修复后调用(get info 0)拿到的就是正常的y坐标,(get info 1)拿到的就是x坐标,不会再输出乱码。

内容的提问来源于stack exchange,提问作者Lucas Moreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:27:03