Читать char16_t * Строка с Cppyy из C ++ - PullRequest
1 голос
/ 04 мая 2020

cppyy - единственный пакет Python, который я нашел для упаковки C ++ Lib с использованием строк char16_t * в Linux. Дана функция:

int ::func1(const char16_t* symbol, char16_t* data, const unsigned int length)
// [in] symbol, [out] data, [in] length
// Returns a string "data" of "length" dependent on keyword "symbol"

Как мне прочитать строку «данные» из функции? Подход ctypes не работает:

length = 10
val = ctypes.create_unicode_buffer(length)
cppyy.gbl.func1('Keyname', val, length)

Проработал документацию и сумел обернуть все, кроме этого. Советы очень ценятся.

1 Ответ

2 голосов
/ 05 мая 2020

Боюсь, что cppyy старается быть наполовину слишком умным, всегда интерпретируя char16_t* как строку Python Unicode (включая спецификацию и кодировку Python, указанную c) и не видит ее как низкоуровневый массив или выходной параметр. Я, возможно, могу исправить / улучшить кое-что из этого, но сейчас есть обходной путь, который поможет вам преодолеть этот пункт:

import cppyy
import cppyy.ll

cppyy.cppdef("""
int func1_wrap(const char16_t* symbol, void* data, const unsigned int length) {
    return func1(symbol, (char16_t*)data, length);
}
""")

def func1_pywrap(symbol, length):
    buf = cppyy.ll.array_new[cppyy.gbl.uint16_t](length)
    res = cppyy.gbl.func1_wrap(symbol, buf, length)
    return res, cppyy.ll.cast['char16_t*'](buf)

cppyy.gbl.func1 = func1_pywrap

result = cppyy.gbl.func1('Keyname', 5)
print(result)

Различные броски просто делают слепой слепым тот факт, с которым он имеет дело строка в кодировке Юникод, и просто заставьте ее передавать указатели.

...