Как создать массовый объект с массивами символов для KDB+

Мне нужно отправить массу объекта K в KDB через интерфейс C. На данный момент все мои строки отправляются в виде символов, что не является идеальным.

Я хотел бы заменить все символы на стандартные массивы символов

Для символов я сделал это так

// table_def:([] name: `symbol$())

K m_data = ktn(0, 1); // 1 column
kK(m_data)[0] = ktn(KS, 100); // 100 rows in bulk

for (unsigned i = 0; i < 100; i++) {
    kS(kK(m_data)[0])[i] = ss("abc");
}

Но не уверен, как создать структуру Bulk для массивов символов. Это то, что я пробовал.

// table_def:([] name: `char$())

K m_data = ktn(0, 1); // 1 column
kK(m_data)[0] = ktn(KC, 100); // 100 rows in bulk

for (unsigned i = 0; i < 100; i++) {
    kS(kK(m_data)[0])[i] = ss("abc"); // this fail with a `type error
    kC(kK(m_data)[0])[i] = kp("abc"); // this fail because kC expect a char not a char*

Любая помощь будет оценена

1 ответ

Решение

Строковый столбец в kdb рассматривается как общий тип (список списка символов).

q)type each flip ([]a:string`aa`bb;b:"ab")
a| 0       <-- string column
b| 10      <-- char column

Итак, ваше определение таблицы kdb должно было быть

// table_def:([] name: ())

Ваше предыдущее определение предполагает, что значениями столбцов будут атомные символы (что не является тем, что вам нужно), поэтому я считаю ошибку типа.

Поэтому при создании K-объекта в вашем C-коде тип данных в вашем первом столбце должен быть смешанного типа:

kK(m_data)[0] = ktn(0, 100);

Оттуда создайте значения для каждой строки:

kK(kK(m_data)[0])[i] = kp("abc");

Можете ли вы попробовать выше и посмотреть, как это происходит? У меня сейчас нет рабочего примера:(

Другие вопросы по тегам