Ich weiß, es gibt oft viele Möglichkeiten, bestimmte Probleme zu lösen. Aber hier weiß ich, wie ich es haben möchte, aber ich kann es nicht mit Python und SWIG arbeiten ...
Ich habe eine C-Funktion, die mir ein Array von doppelten Werten zurückgibt:
%Vor%Hier möchte ich definitiv das Array als Rückgabewert haben. Nicht wie in vielen Beispielen eine 'void'-Funktion, die in ein Input-Array schreibt. Nun möchte ich einen SWIG-Python-Wrapper erhalten, der wie folgt verwendet werden kann:
%Vor% Was auch immer ich mache, ich habe hier ein paar konzeptionelle Probleme - ich komme immer wieder. wie <Swig Object of type 'double *' at 0xFABCABA12>
Ich habe versucht, in meiner swg-Datei einige Typen zu definieren:
%Vor%Aber ich kann meine Ergebnisse nach wie vor nicht rausbringen. Hat jemand ein einfaches Code-Beispiel, um diese Aufgabe zu erfüllen?
Das erste Problem ist, dass Ihre typeMap nicht übereinstimmt, Sie benötigen %typemap(out) double * { ... }
, da Ihre Funktion einen Zeiger auf double und nicht auf ein double Array zurückgibt.
Wenn Ihre Liste eine feste Größe hat (dh ein Integer-Literal) wie in dem Beispiel, das Sie angegeben haben (was ich annehme, ist nicht das, was Sie wollen), könnten Sie einfach die typeMap wie oben angegeben ändern und _dim0
für das Fixed austauschen Größe.
Andernfalls ist Ihr Problem, dass Ihr %typemap(out) double *
den Wert Ihres Parameters int x
möglicherweise nicht kennen kann. Sie könnten eine Struktur zurückgeben, die sowohl den Zeiger als auch die Größe enthält. Dann können Sie einfach eine Typkarte definieren, um diese in eine Liste umzuwandeln (oder ein NumPy-Array, siehe auch meine Antwort auf Wrap C-Struktur mit Array-Member für den Zugriff in Python: SWIG? Cython? Ctypes? ).
Übrigens ist es nicht möglich, ein Array fester Größe in C zurückzugeben (siehe auch diese Antwort: Eine C-Funktion deklarieren, um ein Array zurückzugeben ), so dass ein %typemap(out) double [ANY] { ... }
niemals übereinstimmen kann.
Ich hatte ein ähnliches Problem und löste es auf folgende Weise.
%Vor%%Vor%
Glücklicherweise können alle diese Typen (float *, floatArray * und proxy von floatArray *) erfolgreich an die C ++ - Funktion (wie SumFloats) übergeben werden.
Wenn es Ihnen nichts ausmacht, das numpy Python-Modul in Ihren Python-Code zu ziehen, können Sie Folgendes tun:
In der SWIG-Schnittstellendatei:
%Vor%Nur die letzten beiden Zeilen sind spezifisch für dieses Beispiel, der erste Eintrag ist der Standardwert für numpy.i (siehe Dokumentation zu numpy.i an anderer Stelle: Ссылка ).
In der C-Datei (kann auch in .i-Datei eingebunden sein):
%Vor%Dann haben Sie eine Funktion, die Sie von Python als
aufrufen können %Vor%Wenn Sie jetzt nicht gezwungen sein wollen, das numpige Modul in Ihrem Python-Projekt einzubinden, dann empfehlen wir Ihnen, numpy.i zu überprüfen, um zu sehen, wie sie den% typemap-Trick ausführen - so wie ich es verstehe gemacht mit SWIG Typmaps und nicht inhärent mit numpy verbunden - sollte möglich sein, den gleichen Trick mit Tupeln oder Listen als Rückgabewert zu tun.
Es gibt keine Array-Klasse in Klarschrift C. Ein Array ist immer ein Zeiger auf ein Stück Speicher, kein "Ding" an sich und kann deshalb nicht einfach von selbst ausgedruckt werden.
In diesem Fall ist Ihr "buf" vom Typ "double *". AFAICRem, wenn Sie die tatsächlichen Werte ausdrucken wollen, die im "Speicher von Buf" gespeichert sind, müssen Sie diese zB (im Pseudocode) freigeben: für i = 0 bis buflength print buf [i]