ctypes Python: inicializar c_char_p ()
-
18-09-2019 - |
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.
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