Ptyon ctypes: инициализация c_char_p()

57
9

Я написал простую программу на С++, чтобы проиллюстрировать мою проблему:


extern "C"{
int test(int, char*);
}

int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}


Я скомпилирую это в так. Из 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

Что мне не хватает?


Спасибо.

спросил(а) 2009-12-09T06:15:00+03:00 10 лет, 7 месяцев назад
1
Решение
114

Строка, которую вы инициализировали символами "bye", и адрес которой вы продолжаете принимать и присваиваете charP, не получает повторной инициализации после первого раза.


Следуйте советам здесь:

Вы должны быть осторожны, однако, не передайте их функциям, ожидающим указатели на изменяемую память. если ты нужны измененные блоки памяти, ctypes имеет функция create_string_buffer, которая создает их различными способами.



"Указатель на изменяемую память" - это именно то, что ожидает ваша функция C, и поэтому вы должны использовать функцию create_string_buffer для создания этого буфера, как объясняют документы.

ответил(а) 2009-12-09T06:25:00+03:00 10 лет, 7 месяцев назад
67

Я предполагаю, что 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 просто запрашивает переполнение буфера

ответил(а) 2009-12-09T06:17:00+03:00 10 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема