Ja. Ich kann nicht sehen, was ich falsch mache.Karte mit String ist kaputt?
Die Karte wird: string, int
Hier ist die Methode
bange::function::Add(lua_State *vm){
//userdata, function
if (!lua_isfunction(vm, 2)){
cout << "bange: AddFunction: First argument isn't a function." << endl;
return false;}
void *pfunction = const_cast<void *>(lua_topointer(vm, 2));
char key[32] = {0};
snprintf(key, 32, "%p", pfunction);
cout << "Key: " << key << endl;
string strkey = key;
if (this->functions.find(strkey) != this->functions.end()){
luaL_unref(vm, LUA_REGISTRYINDEX, this->functions[strkey]);}
this->functions[strkey] = luaL_ref(vm, LUA_REGISTRYINDEX);
return true;
Ok, wenn der Code ausgeführt wird, es stürzt ab und druckt diese Ausgabe:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6e6caa9 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >
::compare(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const() from /usr/lib/libstdc++.so.6
Im Ernst, was ist falsch mit meinem Code. Danke für die Hilfe.
Edit 1:
Ok, habe ich die Lösung getan und immer noch nicht. Ich habe versucht, direkt eine Zeichenfolge einzufügen, aber es gibt den gleichen Fehler.
Mal sehen, das Objekt ist ein bange::scene
geerbt von bange::function
. Ich schaffe das Objekt mit lua_newuserdata
:
bange::scene *scene = static_cast<bange::scene *>(lua_newuserdata(vm, sizeof(bange::scene)));
(...)
scene = new (scene) bange::scene(width, height, nlayers, vm);
Ich brauche dies für Lua Garbage Collection. Jetzt ist der Zugriff auf bange::function::Add
von Lua:
static int bangefunction_Add(lua_State *vm){
//userdata, function
bange::function *function = reinterpret_cast<bange::function *>(lua_touserdata(vm, 1));
cout << "object with bange::function: " << function << endl;
bool added = function->bange::function::Add(vm);
lua_pushboolean(vm, static_cast<int>(added));
return 1;
}
Userdata- bange::scene
ist in Lua gespeichert. Zu wissen, dass die Userdata-Szene in Wirklichkeit die Richtung des Objekts ist, ist dieselbe, wenn ich die Szene zuvor erstellt habe. Ich brauche die reinterpret_cast
, und rufen Sie dann die Methode auf. Der Zeiger "dies" ist innerhalb der Methode immer noch dieselbe Richtung.
gelöst
ich einen kleinen Test im bange::function
Konstruktor tat das ohne Probleme funktioniert.
bange::function::function(){
string test("test");
this->functions["test"] = 2;
}
Ich bemerkte schließlich, dass das Problem
bange::function *function = reinterpret_cast<bange::function *>(lua_touserdata(vm, 1));
ist, da das Objekt bange::scene
und kein bange::function
(ich gebe es zu, ein Zeiger Korruption) ist, und dies scheint ein Code Design-Problem. Das ist also in gewisser Weise gelöst. Danke an alle.
auf welcher Linie tut Ihr Code Absturz? – Jaywalker