Pergunta

Eu escrevi um simples programa C ++ para ilustrar o meu problema:

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

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

eu compilar isso em um modo. De chamada python I:

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

Quando eu executo isso, minha saída é:

bye
hi
hi
hi
hi

Eu esperava:

bye
hi
bye
bye
bye

O que eu estou ausente?

Graças.

Foi útil?

Solução

A seqüência que você inicializado com o "bye" personagens, e cujo endereço você continuar tomando e atribuindo a charP, não se re-inicializado depois da primeira vez.

Siga os conselhos aqui :

Você deve ter cuidado, no entanto, não passá-las para funções que esperam ponteiros para memória mutável. Se vocês precisa blocos de memória mutáveis, ctypes tem uma função que create_string_buffer cria estes de várias maneiras.

A "ponteiro para a memória mutável" é exatamente o que a função C espera, e por isso você deve usar a função create_string_buffer para criar esse buffer, como os docs explicar.

Outras dicas

Eu estou supondo que python é reutilizar o mesmo tampão para todos os 5 passagens. uma vez que você configurá-lo para "oi", você nunca defini-lo de volta para "bye" Você pode fazer algo como isto:

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

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

mas tenha cuidado, strcpy é apenas a pedir um buffer overflow

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top