2014-07-09 14 views
21

Rozpaczliwie próbuję odsłonić klasę klasy std::vector<bool> na klasę Python.Problem z cytonem: 'bool' nie jest identyfikatorem typu

Oto moja klasa C++:

class Test 
{ 
    public: 
    std::vector<bool> test_fail; 
    std::vector<double> test_ok; 
}; 

Podczas dostępu i przemiany test_ok typu double (lub int, float, ..) działa, to nie robi dla bool!

Oto moja klasa Cython:

cdef class pyTest: 
    cdef Test* thisptr 
    cdef public vector[bool] test_fail 
    cdef public vector[double] test_ok 

    cdef __cinit__(self): 
     self.thisptr = new Test() 
     self.test_fail = self.thisptr.test_fail # compiles and works if commented 
     self.test_ok = self.thisptr.test_ok 

    cdef __dealloc__(self): 
     del self.thisptr 

Błąd pojawia się:

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




cdef extern from *: 
    ctypedef bool X 'bool' 
      ^
------------------------------------------------------------ 

vector.from_py:37:13: 'bool' is not a type identifier 

Używam Pythona 2.7.6 i Cython 0.20.2 (próbował również 0.20.1) .

Próbowałem również z właściwościami, ale to też nie działa.

Addendum: Mam from libcpp cimport bool na górze mojego pliku pyx, a także import wektora.

Co jest nie tak? Wierzę, że to może być błąd. Ktoś wie, jak to obejść? Dzięki.

+0

Cython wiki jest bardzo pomocne dotyczące tej kwestii: Czy https://github.com/cython/cython/wiki/FAQ#id49 –

Odpowiedz

1

Znalazłem prawidłowe obejście, chociaż może nie być optymalne.

Wymieniłem typy członków klasy pytest na listy Pythona.

Konwersję teraz zrobić implicitely, jak opisano w dokumentacji: http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library

Wszystkie konwersje utworzyć nowy pojemnik i skopiować dane do niego. Pozycje w pojemnikach są automatycznie konwertowane na odpowiedni typ, który obejmuje rekurencyjne przekształcanie kontenerów wewnątrz kontenerów, np. wektor C++ map ciągów.

Więc teraz, moja klasa wygląda następująco:

cdef class pyTest: 
    cdef Test* thisptr 
    cdef public list test_fail #now ok 
    cdef public list test_ok 

    cdef __cinit__(self): 
     self.thisptr = new Test() 
     self.test_fail = self.thisptr.test_fail # implicit copy & conversion 
     self.test_ok = self.thisptr.test_ok # implicit copy and conversion 

    cdef __dealloc__(self): 
     del self.thisptr 
22

Istnieje dodatkowe wsparcie C++, które musisz zrobić. Na początku pliku .pyx, dodać

from libcpp cimport bool 

bym spojrzeć wewnątrz, że aby znaleźć inne rzeczy mogą być potrzebne, jak std :: string i STL pojemników

+1

Wydaje się, że edytujesz moją odpowiedź: dodaj 'from libcpp.vector cimport vector' dla słowa kluczowego wektorowego – Ben

+0

witam, zapomniałem wspomnieć, że mam' cimport bool' w górnej części mojego pliku pyx :( – carmellose

+0

Myślę, że źle odczytany, wydaje się narzekać na "bool'' typedef." To niepotrzebne IMO.Jeśli zaimportowałeś bool, możesz zadeklarować dowolną zmienną bool z 'cdef bool x'' – Ben

6

w celu określenia boolean obiektów w cytoncie, muszą być zdefiniowane jako bint. Według here: Fragment obiektu "boolean int" jest kompilowany do c int, ale jest przekształcany do iz Cythona jako wartość logiczna.

Powiązane problemy