Ich muss Datenstrukturzeiger in meinem Hauptprogramm, wo ich Lua-Zustand definiert haben, zu dem dynamisch geladenen Lua-Modul durch das Einwickeln eines C++ - Codes mit SWIG erstellt.teilen Datenzeiger zwischen c und lua Modul kompiliert mit SWIG
Dies ist mein Codebeispiel:
in SimpleStruct.h:
#pragma once
struct SimpleStruct
{
int a;
double b;
};
in exmaple.h (dieses mit SWIG kompiliert wird) zu Lua Bibliothek:
#pragma once
#include "SimpleStruct.h"
#include <iostream>
class TestClass
{
public:
TestClass()
{
std::cout<<"TestClass created"<<std::endl;
}
~TestClass() {}
void ReadSimpleStruct(void * tmp)
{
std::cout<<"reading pointer: "<<std::endl;
SimpleStruct * pp = reinterpret_cast< SimpleStruct * >(tmp);
std::cout<<"Simple Struct: " << pp->a << " " << pp->b << std::endl;
}
};
in example.cpp nur:
#include "example.h"
und das ist mein Hauptprogramm (LuaTest.cpp):
extern "C"
{
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}
#include <iostream>
#include "SimpleStruct.h"
int main(int argc, char ** argv)
{
lua_State * L = luaL_newstate();
luaL_openlibs(L);
SimpleStruct * ss = new SimpleStruct();
ss->a = 1;
ss->b = 2;
lua_pushlightuserdata(L,ss);
lua_setglobal(L, "myptr");
int s = luaL_dostring(L, "require('example')");
s = luaL_dostring(L, "mc = example.TestClass()");
s = luaL_dostring(L, "mc:ReadSimpleStruct(myptr)");
if(s)
{
printf("Error: %s \n", lua_tostring(L, -1));
lua_pop(L, 1);
}
lua_close(L);
std::cout<<"done"<<std::endl;
return 0;
}
example.i (von Lua Beispiele in SWIG kopiert):
/* File : example.i */
%module example
%{
#include "example.h"
%}
/* Let's just grab the original header file here */
%include "example.h"
und ich kompilieren alles wie folgt:
swig -c++ -lua example.i
g++ -c -fpic example.cpp example_wrap.cxx -I/usr/local/include -I/usr/include/lua5.2/
g++ -shared example.o example_wrap.o -o example.so
g++ LuaTest.cpp -o luatest -llua5.2 -I/usr/include/lua5.2/ -Wall
auf Ubuntu 16.04 (und auf OSX, mit verschiedenen Pfaden und dem gleichen Ergebnis).
In der letzten Zeile des Lua-Skripts habe ich Segmentierungsfehler (wenn ich versuche, auf pp-> a in "mc: ReadSimpleStruct (myptr)") zuzugreifen.
Also meine Frage ist: Wie kann ich einen Zeiger auf C++ - Objekt auf die geladene Lua-Bibliothek mit Lua Light userdata bereitstellen?
Im Allgemeinen: Ich habe in meinem Hauptprogramm eine Klasse mit Spielparametern und Objekten, und ich möchte einen Zeiger auf diese Klasse zu anderen geladenen Lua-Bibliotheken bereitstellen, die mit einem SWIG kompiliert werden.
Können Sie das machen ein echtes, vollständiges minimales Beispiel, das es zeigt? Etwas, das ich verstehen kann - wir müssen wissen, wie die "andere geladene Lua-Bibliothek" funktioniert. – Flexo
Ich denke, das ist ein volles reales Beispiel: Ich kompiliere TestClass mit SWIG als eine lua-Bibliothek namens 'example' (und das ist 'meine andere lua-Bibliothek'), danach lade ich diese Bibliothek im Hauptprogramm (durch 'require example')). Als nächstes erstelle ich eine Instanz der SimpleClass-Struktur und erstelle leichte Benutzerdaten mit einem Zeiger auf diese Instanz. Und schließlich möchte ich in der Lage sein, Daten von diesem Zeiger durch eine Methode des TestClass-Objekts zu lesen ('mc: ReadSimpleStruct (myptr)). Nichts mehr, dies wird mir ermöglichen, Zugang zu globalen Parametern von meiner eigenen, mit SWIG erstellten, Lua-Bibliothek zu haben. – beastian
Der Code in Ihrer Frage hat viele '....'. Es sagt nicht einmal, auf welche Plattform Sie ausgerichtet sind. Es gibt eine Datei, die Sie SimpleStruct.h genannt haben, aber Sie fügen TestClass.h hinzu. Es gibt keine .i-Datei. Ich kann nicht einmal anfangen, deine Frage zu beantworten, bis ich all die fehlenden Teile schreibe, die du nicht aufgenommen hast. Ich weiß nicht, auf welche Version von Lua Sie abzielen. – Flexo