2016-07-13 16 views
3

Wrapping ich bin versucht Cython-wickelt eine DLL in C++ geschrieben mit der folgenden Header-Datei:ein C++ struct in Cython

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport) 

struct cmplx64 
{ 
    float re; 
    float im; 
}; 

EXTERN_DLL_EXPORT int foo(cmplx64 *arr, int arr_sz); 

Die PXD-Datei:

cdef extern from "mylib.h": 

    cdef struct cmplx64: 
     np.float64_t re 
     np.float64_t im 

    int foo(cmplx64 *arr, int arr_sz) except + 

Die PYX Datei:

cimport cmylib 
import numpy as np 
cimport numpy as np 
import cython 

def foo(np.ndarray[np.complex64_t, ndim=1] arr, int arr_sz): 

    return cmylib.foo(&arr[0], arr_sz) 

Das Problem wird nicht mit meiner Setup-Datei angezeigt.

Anstelle der struct Definition habe ich versucht, eine cppclass für einen Vorschlag, den ich gefunden habe, aber ich kam nicht so weit mit dieser aktuellen Methode.

Die Fehlermeldung erhalte ich ist:

Cannot assign type 'float complex *' to 'complexFloatStruct *' 

Mein Problem wird durch die Tatsache, dass der Autor der Bibliothek ist ich eher einen komplexen Typ mit einer Struktur definiert wird, als einfach die eingebaute Verwendung in komplexer Typ in der C++ std-Bibliothek. Wenn das der Fall wäre, hätte ich kein Problem.

Es scheint jedoch vollkommen vernünftig, dass ich in der Lage sein sollte, eine C++ - Klasse oder -Struktur mit Cython zu umhüllen. Ich habe die Dokumentation überstanden und bin ziemlich gescheitert. Danke für Ihre Hilfe!

Antwort

4

Eine einfache Guss ausreichend sein,

def foo(np.ndarray[np.complex64_t, ndim=1] arr, int arr_sz): 
    return cmylib.foo(<cmylib.cmplx64 *>&arr[0], arr_sz) 
+0

Gute Idee, wird es morgen versuchen, und lassen Sie wissen. –

+2

Das hat tatsächlich funktioniert. Vielen Dank! –