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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top