numpy mit c vs c++

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
NPC
User
Beiträge: 54
Registriert: Dienstag 8. Januar 2019, 17:51

Hallo Leute :),

ich will für eine Simulation einen Teil (den rechnerisch intensivsten) gerne in C bzw. C++ laufen lassen.
Und daher eine Python-Extension in C++ schreiben.
Dafür möchte ich auch numpy einbinden (ich muss während der Berechnung mehrfach auf ein numpy array zugreifen).
Sowei so gut. Prinzipiell läuft das, wenn ich in C bleibe. Wenn ich versuche das selbe in C++ zu machen, dann bekomme ich sehr viele Fehlermeldungen z.B:
Das Argument vom Typ ""PyObject *"" ist mit dem Parameter vom Typ ""PyArrayObject *"" inkompatibel.

oder auch

"PyObject *PyArray_GETITEM(const PyArrayObject *,const char *)" : Konvertierung von Argument 2 von "void *" in "const char *" nicht möglich"

Hier mal ein stück Code auf die sich die zweite Meldung bezieht:

Code: Alles auswählen

npy_intp ptr[2] = { y, x };
PyObject* dummy = PyArray_GETITEM(array2d, PyArray_GetPtr(array2d, ptr));
Ich nutze Visual Studio 2019 und hab da einfach die Projektvorlage zur Erweiterung von Python genutzt.
Der Grund warum ich c++ gerne nutzen würde statt c ist, dass ich gerne <random> nutzen würde um gleichverteilte Zufallszahlen zu bekommen.

Ich habe leider noch nicht allzu viel Erfahrung mit der Erweiterung in C/C++ und falls ihr (außer den beiden Dokus) noch sonstige gute Quellen habt nehme ich die auch gerne an :).

Sorry für den langen Text und schonmal danke im Vorraus :D
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

C++ ist strenger was Typ-Pruefungen angeht. Darum laesst der Compiler (zumindest so wie er da konfiguriert ist) das nicht zu. Laut

https://github.com/numpy/numpy/blob/mas ... es.h#L1547

ist das ein const char* der da uebergeben werden muss. Auch wenn der dann gleich wieder in einen void* konvertiert wird, den du ja schon hast. Sieht ein bisschen kacke aus.

Wie dem auch sei: wenn du C++ benutzen willst, musst du an solchen Stellen eben tun, was C++ von dir verlangt. Also zB ein static_cast oder reinterpret_cast. In diesem Fall sollte ein static_cast ausreichen

Code: Alles auswählen

static_cast<const char*>(ptr)
NPC
User
Beiträge: 54
Registriert: Dienstag 8. Januar 2019, 17:51

Vielen Dank :).
Hat super funktioniert.

Jetzt fühle ich mich dumm.
Da hätte man ja selbst drauf kommen können :D .

Schönes Wochende dir
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Meh. C++ ist hart. Ich habe gestern geschlagene 20 Minuten, plus einen Hilferuf an die Kollegen, damit verbracht, einen Compiler Fehler wegen einem const zu viel hinterher zu jagen. So ist die Sprache halt.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wer programmiert auch freiwillig in C++, wenn man doch schon Python hat? Wenn man Performance-Probleme hat, benutzt man numba.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Vieles, aber nicht alles geht halt in Python. Echtzeitprogrammierung eben nicht. Das hat nur mittelbar mit Performance zu tun, sondern eher mit determinismus. Da ist C++ relevant. Ob der TE mit numba zum Ziel kommt, kann ja durchaus sein.

Und irgendwer muss ja auch die numpy & co Bibliotheken schreiben...
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@__deets__: und irgendwer muß auch das Betriebssystem schreiben...
Der TE schreibt was von „rechenintensiv”. Echtzeit geht mit Windows eh nicht.
NPC
User
Beiträge: 54
Registriert: Dienstag 8. Januar 2019, 17:51

Hallo Sirius3,

ich kannte numba bis gerade eben tatsächlich nicht.
Habe es gerade eben mal an einer der Funktionen getestet...
Das funktioniert richtig gut.
Und der Funktionsumfang den ich beim überfliegen gesehen habe ist ja der Hammer!
Schade, dass ich erst jetzt davon höre aber auf jeden Fall vielen Dank für den Tipp :D .

Und euch beiden danke dafür, dass Ihr nochmal verschiedene Aspekte bzw. Vorteile gegenüber gestellt habt.
Werde Versuchen mich in Zukunft daran zu orientieren.
Antworten