Verschachtelter Struktur-Array-Zugriff in Python mit SWIG

Ich habe nicht herausgefunden, wie man auf die Array-Elemente SubStatus in der folgenden verschachtelten Struktur zugreifen kann. Ich scheine in der Lage zu sein, das erste Element zu sehen, aber verstehe nicht, wie man die Indexierung erzwingt, zB als Liste.

Jede Hilfe wird sehr geschätzt.

Status.h:

// Data Types typedef char CHAR; // 8 bits signed typedef short SHORT; // 16 bits signed typedef long LONG; // 32 bits signed typedef unsigned char UCHAR; // 8 bits unsigned typedef unsigned short USHORT; // 16 bits usigned #define FUNC_TYPE // built in C, leave reference as C #define DLL_API extern FUNC_TYPE __declspec(dllimport) // Sub Status Data typedef struct { LONG xyz; LONG abc; } SUB_STATUS; // Status Info typedef struct { UCHAR qrs; UCHAR tuv; SUB_STATUS SubStatus[4]; LONG wxy; } STATUS; DLL_API SHORT GetStatus( STATUS *Status ); 

Status.i

 %module status %{ /* Includes the header in the wrapper code */ #include "status.h" %} /* Parse the header file to generate wrappers */ %include "windows.i" %include "typemaps.i" %include "status.h" 

One Solution collect form web for “Verschachtelter Struktur-Array-Zugriff in Python mit SWIG”

Du kannst diesen Header einpacken, ohne ihn ändern zu müssen.

 %module status %immutable; %inline %{ template <typename Type, size_t N> struct wrapped_array { Type (&data)[N]; wrapped_array(Type (&data)[N]) : data(data) { } }; %} %mutable; %{ #include "status.h" %} %include "typemaps.i" %include "std_except.i" // Only expose a reduced STATUS, without the Array: typedef struct { UCHAR qrs; UCHAR tuv; LONG wxy; } STATUS; %extend wrapped_array { inline size_t __len__() const { return N; } inline const Type& __getitem__(size_t i) const throw(std::out_of_range) { if (i >= N || i < 0) throw std::out_of_range("out of bounds access"); return $self->data[i]; } inline void __setitem__(size_t i, const Type& v) throw(std::out_of_range) { if (i >= N || i < 0) throw std::out_of_range("out of bounds access"); $self->data[i] = v; } } %template (SubStatusArray) wrapped_array<SUB_STATUS,4>; // Hide the real array in our helper %extend STATUS { wrapped_array<SUB_STATUS,4> getSubStatus() { return wrapped_array<SUB_STATUS,4>($self->SubStatus); } } %ignore STATUS; // We've specified an alternative way of wrapping this %include "status.h" 

Dies ist im Grunde das gleiche wie meine Antwort hier , aber anstatt den Header zu modifizieren, um das wrapped_array , haben wir %ignore , um SWIG zu sagen, dass wir unsere eigene Definition von STATUS dafür liefern werden. (Das ist völlig legal, die SWIG generierte Wrapper wird immer noch die echte Definition von status.h)

Wir injizieren in diese veränderte Definition einen getSubStatus() , der ein Objekt zurückgibt, das als Proxy in das reale Array in STATUS . Dieser Proxy liefert wiederum __getitem__ , __setitem__ und __len__ dass python sucht, um den Index-Operator zu verwenden.

Es könnte ein Weg sein, dies richtig in Python zu tun, ohne dass der getSubStatus() , was SWIG-Set __swig_setmethods__["SubStatus"] und __swig_getmethods__["SubStatus"] passend, aber ich bin mir nicht sicher von der Spitze meines Kopfes Mach SWIG-Python dazu.

Wenn du C benutzt, nicht mit C ++ kannst du die Vorlage zu Gunsten von nur einer einfachen struct und einen Zeiger anstelle eines Verweises auf ein Array verwenden.

  • Technik zur Verwendung von std :: ifstream, std :: ofstream in python über SWIG?
  • Wie man eine C ++ - Klasse Python ohne Aufbau eines Moduls aussetzt
  • Marschieren eines Python-PIL-Bildes mit SWIG
  • SWIG Python Struktur Array
  • Wie man unique_ptr's mit SWIG behandelt?
  • In der SWIG-Kompilierung: In der Header-Datei im Interface kann man keine anderen Header-Dateien auflösen.
  • Zugriff auf void-Zeiger in Python (mit SWIG oder etwas anderes)
  • Wie man eine c ++ - Funktion wickelt, die einen Funktionszeiger in python mit SWIG einnimmt
  • Python ctypes Rückruffunktion an SWIG
  • Was ist der sauberste Weg, um eine Python-Funktion von C ++ mit einem SWIG Wrapped Object aufzurufen
  • Auto_ptr mit swig
  • Python ist die beste Programmiersprache der Welt.