es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir el vector del tipo C++ al tipo C correspondiente en Python.

Cómo convertir el vector del tipo C++ al tipo C correspondiente en Python

c++

extern “C” API void vector_string_test(string* data) {
vector vec = {“123abc”,”456efg”};
std::memcpy(data, vec.data(), vec.size() * sizeof vec[0]);}

python

dll=dll.LoadLibrary(dll_path)
vector_string_test=dll.vector_string_test
vector_string_test.argtypes=(POINTER(ctypes.c_wchar_p),)
vector_string_test.restype=None
data=(c_wchar_p*2)()
vector_string_test(data)
data_ptr=cast(data,c_char_p)
print(data_ptr.value)

Luego obtengo:

b’123abc’

Así que, ¿Cómo obtengo todos los resultados en vec con Python?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener todos los resultados en vec con Python, puedes modificar la función vector_string_test en C++ para aceptar el tamaño del vector como argumento y retornar un puntero a un array de char*:

    “`c++
    extern “C” API char** vector_string_test(int* size) {
    vector vec = {“123abc”,”456efg”};
    size = vec.size();
    char** data = new char
    [vec.size()];
    for (int i = 0; i < vec.size(); i++) {
    data[i] = new char[vec[i].size() + 1];
    strcpy(data[i], vec[i].c_str());
    }
    return data;
    }


    Luego, en el código de Python, puedes usar `ctypes` para llamar a esta función y convertir el array retornado en una lista de cadenas: ```python dll = dll.LoadLibrary(dll_path) vector_string_test = dll.vector_string_test vector_string_test.argtypes = [POINTER(c_int)] vector_string_test.restype = POINTER(c_char_p) size = c_int() data = vector_string_test(byref(size)) result = [data[i].decode() for i in range(size.value)] print(result) # muestra ['123abc', '456efg']

    Nota que necesitamos usar byref() para pasar el argumento size por referencia, y decode() para convertir las cadenas char* a objetos str de Python. Además, debemos liberar la memoria asignada en C++ después de usar el array data en Python:

    python
    for i in range(size.value):
    dll.free_memory(data[i])
    dll.free_memory(data)

Comments are closed.