2012-09-17 28 views
8

En las declaraciones de pegamento de Cython, ¿cómo puedo representar un tipo de C struct que contiene una unión anónima? Por ejemplo, si tengo un archivo de cabecera C mystruct.h contieneCython: Anidar una unión dentro de una estructura

struct mystruct 
{ 
    union { 
     double da; 
     uint64_t ia; 
    }; 
}; 

a continuación, en el archivo correspondiente .pyd

cdef extern from "mystruct.h": 
    struct mystruct: 
     # what goes here??? 

He intentado esto:

cdef extern from "mystruct.h": 
    struct mystruct: 
     union {double da; uint64_t ia;}; 

pero que sólo me dio " Error de sintaxis en la declaración de variable C "en la línea union.

+5

No entiendo por qué se cerró esta pregunta. Parece razonablemente útil para otros usuarios de Cython, tiene un buen título y etiquetas, y finalmente una respuesta aceptada. ¿Cómo es "demasiado localizado"? – user4815162342

+0

Sí, la expresión de esta pregunta lo hizo parecer altamente especializado, pero en realidad es un problema genérico que cualquier persona que intente pegar una complicada biblioteca de C en una extensión de Python podría enfrentar. Intenté aclarar que el código en la pregunta es solo un ejemplo de un escenario genérico. – zwol

Respuesta

6

No se pueden anidar las declaraciones a mi leal saber y entender, y Cython no es compatible con las uniones anónimas AFAIK.

intente lo siguiente:

cdef union mystruct_union: 
    double lower_d 
    uint64_t lower 

cdef struct mystruct: 
    mystruct_union un 

acceder ahora a los miembros del sindicato como un.lower_d y un.lower.

6

Para aquellos que llegaron aquí a través de Google, encontré una solución para esto. Si usted tiene una estructura:

typedef struct { 
    union { 
     int a; 
     struct { 
      int b; 
      int c; 
     }; 
    } 
} outer; 

puede acoplar todo hacia fuera en la declaración Cython, así:

ctypedef struct outer: 
    int a 
    int b 
    int c 

Cython no está generando ningún código que hace que las suposiciones acerca de la distribución de la memoria de tu estructura; solo le está diciendo la estructura de facto de lo que está llamando al decirle qué sintaxis generar para llamarlo. Entonces, si su estructura tiene un miembro de tamaño int que se puede acceder como ((outer) x).a, puede lanzar a en la definición de estructura y funcionará. Está operando en sustitución textual, no en diseño de memoria, por lo que no le importa si estas cosas están en uniones o estructuras anónimas o lo que sea.

+0

Probar algo similar en mi código provocó un error de compilación, diciendo que outer no tiene ningún miembro llamado 'b'. – Noich

+0

@Noich: ¿tienes un pastebin o algo con tu código Cython y C? Puedo echar un vistazo. –

+0

El código C está aquí https://pastebin.com/psTBpJut Probando una estructura llamada: https://pastebin.com/jH7Rqsu1 Intentando aplanar: https://pastebin.com/T8GGgKtA ¡Gracias! – Noich

Cuestiones relacionadas