से सी ++ वस्तु सूचक को निकालने के लिए मैं सी में एक वर्ग ++ "प्वाइंट" कहा जाता है:कैसे लुआ
class Point
{
public:
int x, y;
//constructor
Point(int x, int y)
{
this->x = x;
this->y = y;
}
};
मेरा लक्ष्य के लिए एक लुआ स्क्रिप्ट के साथ एक प्वाइंट वस्तु का दृष्टांत के लिए, और निकालने के सूचक सक्षम होने के लिए है लुआ स्टैक से यह वस्तु।
यहां मेरा (वर्तमान में काम नहीं कर रहा है) प्रयास है जो उम्मीद करता है कि मैं वास्तव में क्या करने की कोशिश कर रहा हूं; ध्यान दें कि इस कोड को अनिवार्य रूप से this tutorial से कॉपी/पेस्ट संशोधित किया गया है और यह है कि मैं लुआ 5.2 उपयोग कर रहा हूँ:
static int newPoint(lua_State *L)
{
int n = lua_gettop(L);
if (n != 2)
return luaL_error(L, "expected 2 args for Point.new()", n);
// Allocate memory for a pointer to object
Point **p = (Point **)lua_newuserdata(L, sizeof(Point *));
double x = luaL_checknumber (L, 1);
double y = luaL_checknumber (L, 2);
//I want to access this pointer in C++ outside this function
*p = new Point(x, y);
luaL_getmetatable(L, "Point"); // Use global table 'Point' as metatable
lua_setmetatable(L, -2);
return 1;
}
static const luaL_Reg pointFuncs[] = {
{"new", newPoint},
{NULL, NULL}
};
//register Point to Lua
void registerPoint(lua_State *L)
{
lua_createtable(L, 0, 0);
// Register metatable for user data in registry
luaL_newmetatable(L, "Point");
luaL_setfuncs(L, pointFuncs, 0);
lua_pushvalue(L,-1);
lua_setfield(L,-2, "__index");
lua_setglobal(L, "Point");
}
Point* checkPoint(lua_State* L, int index)
{
void* ud = 0;
luaL_checktype(L, index, LUA_TTABLE);
lua_getfield(L, index, "__index");
ud = luaL_checkudata(L, index, "Point");;
return *((Point**)ud);
}
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
registerPoint(L);
luaL_dofile(L, "testz.lua");
lua_getglobal(L, "Point");
Point *foo = checkPoint(L, lua_gettop(L));
std::cout << "x: " << foo->x << " y: " << foo->y;
lua_close(L);
return 0;
}
और यहाँ लुआ स्क्रिप्ट है:
local point = Point.new(10,20)
इस कोड चल रहा है, मैं निम्नलिखित त्रुटि मिलती है : "खराब तर्क # 3 (प्वाइंट अपेक्षित, टेबल मिला)" लाइन पर: ud = luaL_checkudata (एल, इंडेक्स, "प्वाइंट") चेकपॉइंट() फ़ंक्शन के अंदर।
यदि कोई मुझे सही दिशा में चला सकता है, तो इसकी सराहना की जाएगी।
समझाया जो मुझे पता होना चाहिए! 1000x धन्यवाद श्रीमान। – user2687268
@ user2687268 मैंने उपयोगकर्ता डेटा को साफ करने के बारे में एक नोट जोड़ा है। – greatwolf
यह एक अच्छा स्पष्टीकरण है, लेकिन ऐसा लगता है कि कचरा कलेक्टर लूआ राज्य से पॉइंट पॉइंटर को बिंदु प्राप्त करने से पहले नहीं चलाएगा। यह इस सरल उदाहरण के साथ मामला नहीं हो सकता है, लेकिन अधिक विस्तृत स्क्रिप्ट में आपको पता नहीं चलेगा कि जीसी आपके बिंदु को कब हटा देगा। इसलिए, बाध्यकारी पुस्तकालयों में स्मृति जीवनकाल प्रबंधन का पूरा झगड़ा। –