У меня есть C функция этой подписи:
void updateCaseFile( char scalarFields[][100], uint nscalars, char vectorFields[][100], uint nvectors, uint* timeList, uint ntimes );
Что в моем конкретном случае, в C, я передаю:
char scfields[2][100] = {"rho", "T"};
char vfields[1][100] = {"U"};
updateCaseFile(scfields, 2, vfields, 1, timeList, nwrite);
В Linux В системе я хочу передать scfields и vfields из Python, используя ctypes, поэтому я использую ctypes.c_char_p в качестве следующего:
import ctypes
libbio = ctypes.CDLL('/home/lib/libio.so')
updateCaseFile = libbio.updateCaseFile
scfields = ["rho" , "T" ]
scfields_array = (ctypes.c_char_p * (len(scfields)+1))()
vfields = ["U"]
vfields_array = (ctypes.c_char_p * (len(vfields)+1))()
updateCaseFile(scfields, 2, vfields, 1, timeList, nwrite)
Но я получаю эту ошибку:
ArgumentError: аргумент 1:: не знаю, как преобразовать параметр 1
Измените код, используя numpy
import numpy as np
scfields = np.chararray((1, 2))
scfields = ('rho' , 'T' )
vfields = np.chararray((1, 1))
vfields = ('U')
scfields_p = scfields.ctypes.data_as(c_wchar_p)
vfields_p = vfields.ctypes.data_as(c_wchar_p)
updateCaseFile(scfields, 2, vfields, 1, timeList, nwrite)
И я снова получаю эту ошибку:
ArgumentError: аргумент 1:: Не знаю, как преобразовать параметр 1
Я знаю, какие во втором случае scfields конвертируют в кортеж, но я не могу найти, что не так. Как решить эту проблему?
Спасибо