2009-12-09 3 views
1

Я написал простую программу на С ++, чтобы проиллюстрировать мою проблему:Python ctypes: инициализация c_char_p()

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

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

компилировать это в так. От питона я называю:

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 

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

Спасибо.

ответ

7

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

Следуйте советы here:

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

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

+0

Спасибо, изменив его на charP = create_string_buffer («bye»), исправляет мою проблему. Я должен был внимательно изучить документы. – Mark

2

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

+0

Хороший вызов о strcpy и переполнении, ответ Алекса ниже должен также решить проблему, я просто сделаю так, чтобы мой буфер был достаточно большим. – Mark

Смежные вопросы