2016-05-19 17 views
0

Ich verpacke C-Code aus einem eingebetteten System, um zu experimentieren, SWIG zu verwenden und Python zu targetieren. Es ist einfacher Code, und ich habe die Hardware ausgedrückt und alles ist in Ordnung.Wrapping von C-Code mit SWIG, das statische globale Variablen verwendet

Das Problem, das ich habe, ist, dass die Funktionen, an denen ich interessiert bin, auf einer statischen globalen "Kontext" -Variable arbeiten, die am Anfang der C-Datei definiert ist. Ich kann nicht herausfinden, wie diese Variable vom Modul instanziiert und von den eingepackten Funktionen bearbeitet werden kann.

Ich habe einige einfache Testdateien zum Spielen erstellt, und wenn ich die globale Variable im Modul deklariere, erscheint sie in cvar, aber eine Funktion, die diese Variable in ihrem Körper verändern soll, hat keine Auswirkung auf die cvar-Instanz.

Gibt es eine Möglichkeit, dies zu tun, ohne die C-Quelldateien zu ändern, die ich verpacke?

+0

Wenn Sie es so ändern, funktioniert es für mich. 'somelib.cvar.somevar = 4.0'. –

+0

Entschuldigung, Sie haben Recht. Arbeitet auch nicht für mich. Sie können in Ihrem swig.i-Datei inline Code für die Einstellung der Variablen, aber es ist nicht sehr elegant –

Antwort

2

Dies funktioniert

Wenn Sie erklären Sie extern in Ihrem Header-Konstanten, es funktioniert gut.

Kopf

/* test.h */ 
extern float g_float; 
float getMe(); 

Quelle

/* test.cpp */ 
#include "test.h" 
float g_float = 4.0; 
float getMe() { 
    return g_float; 
} 

Schnittstelle Definitionsdatei

/* test.i */ 
%module test 
%{ 
#include "test.h" 
%} 

%include "test.h" 

Ändern Sie die Variable

import test 
test.cvar.g_float = 4.5 
test.getMe() 

Wenn in Ihrem Header Konstanten deklariert und initialisiert sind, können Sie Inline-Funktionen hinzufügen, um diese und Eigenschaften in Ihrer Schnittstellendefinitionsdatei zu setzen/abzurufen.

Eine statische Klassenvariable funktioniert auch, aber der Zugriff erfolgt mit der Klasse und nicht mit cvar.

+0

Vielen Dank, das funktioniert. Wie sich herausstellt, verwendet der Code, den ich umschließe, eine statische Kontextvariable, auf die ich nicht direkt zugreifen kann, sondern enthält nur Zeiger auf Member einer größeren Struktur, die ich mit extern deklariert habe, und jetzt kann ich auf den Kontext zugreifen durch cvar, und rufen Sie die umschlossenen Funktionen auf. –

+0

Es macht Sinn. Bitte schön –