0
私はTclインタープリタを持つC++プログラムを持っています。 私の関数をラップし、Tclインタプリタに手動で追加します。 Swigで自動的にラップして追加することはできますか?ここでSwig(Tcl):C++プログラムの実行中にSwig関数を呼び出せますか?
は単純化されたコードです:
#include <stdio.h>
#include <tcl.h>
class SystemData { // I have a class which link to all the data and function
public:
void print(){
printf("Hello!\n");
};
};
// I wrap the functions manually. But I'm tired to maintain them.
int Hello(ClientData clientData, Tcl_Interp *interp, int argc, const char **argv) {
SystemData* system = (SystemData*) clientData;
system->print();
}
int main (int argc, char *argv[]) {
Tcl_Interp *interp = Tcl_CreateInterp();;
SystemData* system = new SystemData;
Tcl_CreateCommand(interp, "hello", Hello, (ClientData)system, (Tcl_CmdDeleteProc *)NULL);
Tcl_Eval(interp, "hello"); // I have a Tcl interpreter so that I can call any function in any time
Tcl_DeleteInterp(interp);
}
私はガブガブ飲むことでのTclにSystemDataを輸出しようとしている:
// swig.cc
#include <stdio.h>
#include <tcl.h>
class SystemData {
public:
void print(){
printf("Hello!\n");
};
};
SystemData* systemData;
int main (int argc, char *argv[]) {
Tcl_Interp *interp = Tcl_CreateInterp();;
systemData = new SystemData;
Tcl_Eval(interp, "load ./swig.so swig");
Tcl_Eval(interp, "puts $systemData");
Tcl_DeleteInterp(interp);
}
マイガブガブ飲むインタフェース:
/* swig.i */
%module swig
%{
/* Put header files here or function declarations like below */
class SystemData;
extern SystemData* systemData;
%}
extern SystemData* systemData;
コンパイルコマンド:
swig -tcl swig.i
g++ -fpic -c swig.cc swig_wrap.c -I/usr/local/include
g++ -shared swig.o swig_wrap.o -o swig.so
しかし、puts $systemData
の結果は、私はまた、しかしswig.so をロードしない試みた
NULL
で、puts $systemData
の結果は
can't read "systemData": no such variable
誰もがアイデアを持っているのですか?
シナリオのこのタイプのための任意の勧告、データの漏洩なし? –
@VenkataVamshi: 私はまだプロジェクトをダウンさせていません。しかし、私はあなたがC++をコーディングするときと同じだと思います。 たとえば、systemDataに直接アクセスする代わりにgetSystemData()およびsetSystemData()を使用します。 したがって、setSystemData()のメモリーを保護できます。 'void setSystemData(SystemData * data){ /*古い古いデータ* /; systemData = data; } ' – peizon