Типы Python:инициализация c_char_p()
-
18-09-2019 - |
Вопрос
Я написал простую программу на C ++, чтобы проиллюстрировать свою проблему:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
Я компилирую это в so.Из python я вызываю:
from ctypes import *
libso = CDLL("Debug/libctypesTest.so")
func = libso.test
func.res_type = c_int
for i in xrange(5):
charP = c_char_p('bye')
func(i,charP)
print charP.value
Когда я запускаю это, мой результат выглядит так:
bye
hi
hi
hi
hi
Я ожидал:
bye
hi
bye
bye
bye
Что я упускаю из виду?
Спасибо.
Решение
Строка, которую вы инициализировали символами "bye"
, и чей адрес вы продолжаете брать и присваивать charP
, не инициализируется повторно после первого раза.
Следуйте советам здесь:
Однако вам следует быть осторожным, чтобы не передавать их функциям, ожидающим указателей на изменяемую память.Если вам нужны изменяемые блоки памяти, в ctypes есть функция create_string_buffer, которая создает их различными способами.
"Указатель на изменяемую память" - это именно то, что ожидает ваша функция C, и поэтому вы должны использовать create_string_buffer
функция для создания этого буфера, как объясняется в документах.
Другие советы
Я предполагаю, что python повторно использует один и тот же буфер для всех 5 проходов.как только вы установите для него значение "привет", вы никогда не установите его обратно на "пока", вы можете сделать что-то вроде этого:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
} else {
strcpy(var, "bye");
}
return 1;
}
но будь осторожен, strcpy
просто запрашивает переполнение буфера