Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top