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
相关产品推荐
相关产品推荐

