SWIG typemap para convertir una matriz 2D en una lista de Python
Esto es un siguiente nivel de esta pregunta. Necesito convertir una matriz de caracteres C de 2 dimensiones en una lista de Python.
Lado de Python
device_info = getInfoFromCpp()
print(device_info.angles)
for angle in device_info.angles:
print("Ángulo: " + angle)
Error
<swig object="" of="" type="" 'char="" (*)[maxstringlength]'="" at="" 0x000000d8b2710330="">
Error de ejecución: el objeto 'SwigPyObject' no es iterable
Encabezado de C++
struct DeviceInformation {
static const int MaxStringLength= 200;
static const int MaxNumberOfAngles= 5;
char serialNumber[MaxStringLength];
char angles[MaxNumberOfAngles][MaxStringLength];
};
Basado en la respuesta de @MarkTolonen aquí, intento lo siguiente con los “typemaps”, pero sin resultado.
c++
</char*>
// %typemap(out) char [ANY] %{
// %typemap(out) char (*)[ANY] %{
%typemap(out) char [ANY][ANY] %{
PyObject *pyArray = PyList_New(5);
for (uint8_t i = 0; i < 5; ++i) {
PyObject *pyString = PyString_FromString(reinterpret_cast<char*>($1[i]));
PyList_SetItem(pyArray, i, pyString);
}
$result = pyArray;
}
davy.ai
El mensaje de error indica que el objeto
SwigPyObject
devuelto porgetInfoFromCpp()
no es iterable. Esto sugiere que el mapeo de tipo SWIG para el miembroangles
de la estructuraDeviceInformation
puede no estar funcionando correctamente.Según el código de mapeo de tipo proporcionado, parece que estás intentando utilizar la directiva
%typemap(out)
para convertir la matrizchar[5][200]
en una lista de cadenas de Python. Sin embargo, el mapeo de tipo parece estar incompleto, ya que incluye líneas comentadas para%typemap(out)
parachar*[ANY]
ychar (*)[ANY]
, pero ninguna de estas se utiliza realmente.Un problema con el mapeo de tipo actual es que asume que la matriz
angles
siempre tiene 5 entradas. Si este no es el caso, el código no funcionará correctamente. Puedes solucionar esto reemplazando el valor codificado en duro5
porMaxNumberOfAngles
, que es la constante definida en la estructuraDeviceInformation
.Aquí tienes una versión revisada del mapeo de tipo que debería funcionar:
Este mapeo de tipo utiliza las constantes
MaxNumberOfAngles
yMaxStringLength
definidas enDeviceInformation
, por lo que debería manejar matrices de cualquier tamaño. También utilizaPyUnicode_FromString
en lugar dePyString_FromString
, que es la función correcta para usar en Python 3 (aunquePyString_FromString
debería seguir funcionando en Python 2).Con este mapeo de tipo en su lugar, el miembro
angles
se debería convertir en una lista de cadenas de Python cuando llames agetInfoFromCpp()
y accedas al atributoangles
en Python.