Я не могу создать список строк в 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» может быть какая-то другая случайная строка, повторенная дважды. Кажется, я создаю список строк, но список содержит мусор по любой причине. Не могли бы вы помочь мне понять, что я здесь делаю не так?
Спасибо за помощь!
Вы инициализируете список с типом 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 для загрузки библиотеки & вызовите C funcs — 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 NONEXPIREcreateStrListStatic
("hello";"world")
createStrListDynamic
("hello";"world")
Других решений пока нет …