2016-07-12 3 views
0

sagen, dass ich die folgenden typedef struct in meiner Header-Datei muß typedef example.h:Wie Zeiger verwenden Struktur in Cython Verlängerungs-Art

typedef struct A A; 

ich Tring bin eine Cython Verlängerungs-Art mit einem Zeiger auf A als Klasse zu machen Variable in test.pyx, und dann rufe ich eine Funktion zur Initialisierung f auf einem Verweis auf A:

cdef class Test: 
    cdef A* a 

    def __cinit__(self): 
     self.a = a 
     f(&a) 
    ... 

Wenn ich kompilieren `test.pyx ich mit den folgenden Kompilierungsfehlern am Ende:

Error compiling Cython file: 
------------------------------------------------------------ 
... 

cdef class Test: 
    cdef A* a 

    def __cinit__(self): 
     self.a = a 
           ^
------------------------------------------------------------ 

test.pyx: undeclared name not builtin: a 

Error compiling Cython file: 
------------------------------------------------------------ 
... 

cdef class Test: 
    cdef A* a 

    def __cinit__(self): 
     self.a = a 
           ^
------------------------------------------------------------ 

test.pyx: Cannot convert Python object to 'A *' 

Offenbar ist es nicht zu erkennen, das Objekt a, und es es als ein Python-Objekt interpretiert. Wie kann ich das beheben?

+0

Wenn das alle cython Definitionen, die Sie haben, ich glaube, Sie cython Dokumentation lesen sollten und studiere die Beispiele ein wenig. –

+0

Danke Herr Hilfreiche. – Alex

Antwort

1

Dies ist, weil Sie es vor der Verwendung deklarieren müssen. Zum Beispiel haben Sie dies in Ihrem C-Code example.h:

typedef struct struct_name{ 
    int a; 
    float b; 
}struct_alias; 

dann Ihre .pyx Datei sollte wie folgt aussehen:

cdef extern from "example.h": 
    ctypedef struct struct_alias: 
     int a 
     int b 

cdef class Test: 
    cdef A* a 

    def __cinit__(self): 
     self.a = a 
     f(&a) 
    ...