我无法在KDB C ++ API中创建字符串列表。这就是我在做的事情:
K lst = ktn(KC,0);
jk(&lst, kp((S)"str_1"));
jk(&lst, kp((S)"str_2"));
r1(lst);
k(h, (S)"{show type x}" , lst, (K)0);
r1(lst);
k(h, (S)"{show count x}", lst, (K)0);
r1(lst);
k(h, (S)"{show x}" , lst, (K)0);
输出
10h
2
"\260\260"
而不是" \ 260 \ 260"可能是一些其他随机字符串重复两次。看来,我确实创建了一个字符串列表,但是无论出于何种原因,该列表都包含垃圾。你能帮我理解我在这里做错了吗?
感谢您的帮助!
答案 0 :(得分:1)
您正在使用char(KC
)类型初始化列表,因此这将是一个字符列表,而不是字符串列表。
字符串列表是混合类型列表,因为它是Kdb中字符列表的列表。因此,您需要使用类型0
(混合列表类型)初始化列表。
示例C代码 - strList.c
:
#define KXVER 3
#include "k.h"
K createStrListStatic(K x){
K strList = ktn(0,2);
kK(strList)[0] = kp("hello");
kK(strList)[1] = kp("world");
return strList;
}
K createStrListDynamic(K x){
K strList = ktn(0,1);
kK(strList)[0] = kp("hello");
js(&strList, (S)kp("world"));
return strList;
}
示例Q代码加载lib&调用C函数 - strList.q
:
createStrListStatic:`:strList 2:(`createStrListStatic;1);
createStrListDynamic:`:strList 2:(`createStrListDynamic;1);
-1 "\ncreateStrListStatic";
-1 "\t",.Q.s1 createStrListStatic[];
-1 "\ncreateStrListDynamic";
-1 "\t",.Q.s1 createStrListDynamic[];
编译并运行如下:
$ gcc -shared -m32 -fPIC strList.c -o strList.so && LD_LIBRARY_PATH="." q strList.q
KDB+ 3.4 2016.10.27 Copyright (C) 1993-2016 Kx Systems
l32/ 8()core 7982MB salih glyph01 127.0.1.1 NONEXPIRE
createStrListStatic
("hello";"world")
createStrListDynamic
("hello";"world")