Я пытаюсь передать массив символьных массивов в функцию C, используя ctypes.
void cfunction(char ** strings)
{
strings[1] = "bad"; //works not what I need.
strings[1][2] = 'd'; //this will segfault.
return;
}
char *input[] = {"foo","bar"};
cfunction(input);
Поскольку массив, который я выбрасываю, в любом случае статически определен, я просто изменил объявление функции и вводпараметр примерно так:
void cfunction(char strings[2][4])
{
//strings[1] = "bad"; //not what I need.
strings[1][2] = 'd'; //what I need and now it works.
return;
}
char input[2][4] = {"foo","bar"};
cfunction(input);
Теперь я столкнулся с проблемой, как определить этот многомерный массив символов в Python.Я думал, что так и будет:
import os
from ctypes import *
libhello = cdll.LoadLibrary(os.getcwd() + '/libhello.so')
input = (c_char_p * 2)()
input[0] = create_string_buffer("foo")
input[1] = create_string_buffer("bar")
libhello.cfunction(input)
Это дает мне TypeError: incompatible types, c_char_Array_4 instance instead of c_char_p instance
.Если я изменю его на:
for i in input:
i = create_string_buffer("foo")
Тогда я получу ошибки сегментации.Кроме того, это выглядит как неправильный способ построения 2d-массива, потому что если я печатаю ввод, я вижу None
:
print input[0]
print input[1]
# outputs None, None instead of "foo" and "foo"
Я также сталкиваюсь с проблемой использования #DEFINE MY_ARRAY_X 2
и #DEFINE MY_ARRAY_Y 4
дляРазмеры массива прямо в моих C-файлах, но я не знаю хорошего способа извлечь эти константы из libhello.so, чтобы python мог ссылаться на них при создании типов данных.