ctypes Python: c_char_p inicializar ()
-
18-09-2019 - |
Pregunta
escribí un simple programa en C ++ para ilustrar mi problema:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
}
return 1;
}
Compilo esto en una manera. De pitón que llamo:
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
Cuando ejecuto esto, mi salida es:
bye
hi
hi
hi
hi
Me esperaba:
bye
hi
bye
bye
bye
¿Qué me falta?
Gracias.
Solución
La cadena que se inicia con la "bye"
caracteres, y cuya dirección que siga tomando y asignar a charP
, no consigue re-inicializado después de la primera vez.
Sigue los consejos aquí :
Usted debe tener cuidado, sin embargo, no pasarlos a las funciones que esperan punteros a memoria mutable. Si tu necesitará bloques de memoria mutables, tiene ctypes una función create_string_buffer que crea estos de varias maneras.
Un "puntero a la memoria mutable" es exactamente lo que su función C espera, y por lo que debe utilizar la función create_string_buffer
para crear ese búfer, como los documentos explican.
Otros consejos
Estoy adivinando pitón está reutilizando el mismo tampón durante los 5 pases. una vez que se establece en "Hola", nunca antes ha establecido de nuevo a "bye" Se puede hacer algo como esto:
extern "C"{
int test(int, char*);
}
int test(int i, char* var){
if (i == 1){
strcpy(var,"hi");
} else {
strcpy(var, "bye");
}
return 1;
}
Pero tenga cuidado, strcpy
está metiendo en un desbordamiento de memoria