2013-10-15 6 views
7

मैंने अभी सफलतापूर्वक एक लुआ प्रोजेक्ट बनाया है। (एक सरल कोड जो अब तक लुआ लिपि चलाता है।)
लेकिन मैं अब lua स्क्रिप्ट के लिए सी ++ फ़ंक्शन और सी ++ चर कैसे उपलब्ध करूं?एक लुआ लिपि में सी ++ फ़ंक्शंस का खुलासा कैसे करें?

एक उदाहरण के रूप:

int Add(int x, int y) { 
    return x + y; 
} 

और

float myFloatValue = 6.0 

मैं बहुत सी के लिए नया हूँ ++ तो मैं सच में आशा है कि यह बहुत जटिल नहीं होगा।

#include "stdafx.h" 
extern "C" { 
    #include "lua.h" 
    #include "lualib.h" 
    #include "lauxlib.h" 
} 

using namespace System; 

int main(array<System::String ^> ^args) 
{ 
    lua_State* luaInt; 
    luaInt = lua_open(); 
    luaL_openlibs (luaInt); 
    luaL_dofile (luaInt, "abc.lua"); 
    lua_close(luaInt); 
    return 0; 
} 
+1

चेक करें: http://lua-users.org/wiki/BindingCodeToLua – user1095108

उत्तर

11

मैं जॉन ज़विनक के जवाब के साथ जाऊंगा क्योंकि अनुभव ने मुझे साबित कर दिया है कि लुआ का उपयोग करके सभी को बट में दर्द होता है। लेकिन, अगर आप जवाब जानना चाहते हैं तो बाकी की जांच करें।

C/C++ कार्यों आप पहली बार बनाने की जरूरत है पंजीकरण के लिए एक मानक सी समारोह पैटर्न जो लुआ प्रदान करता है की तरह अपने समारोह देखो:

extern "C" int MyFunc(lua_State* L) 
{ 
    int a = lua_tointeger(L, 1); // First argument 
    int b = lua_tointeger(L, 2); // Second argument 
    int result = a + b; 

    lua_pushinteger(L, result); 

    return 1; // Count of returned values 
} 

हर समारोह लुआ में पंजीकृत होने के लिए इस पद्धति का पालन करना चाहिए की जरूरत है। int का वापसी प्रकार, lua_State* L का एकल पैरामीटर। और लौटे मूल्यों की गिनती। सरल चर दर्ज की लिए

lua_register(L, "MyFunc", MyFunc); 

आप यह लिख सकते हैं:

lua_pushinteger(L, 10); 
lua_setglobal(L, "MyVar"); 

उसके बाद

उसके बाद, आप लुआ के रजिस्टर तालिका में रजिस्टर करने के लिए तो आप अपनी स्क्रिप्ट के संदर्भ के लिए इसे उजागर कर सकते हैं की जरूरत है , आप अपने कार्य को लुआ लिपि से कॉल करने में सक्षम हैं। ध्यान रखें कि आपको उस विशिष्ट लुआ राज्य के साथ किसी स्क्रिप्ट को चलाने से पहले अपनी सभी ऑब्जेक्ट्स पंजीकृत करनी चाहिए जिन्हें आपने उन्हें पंजीकृत करने के लिए उपयोग किया है।

लुआ में:

print(MyFunc(10, MyVar)) 

परिणाम:

+0

'माईफंक्क' को 'बाहरी' सी "' होना चाहिए। – Simple

+0

@ सिंपल हां, मुझे लगता है कि लुआ को 'बाहरी' सी '' के साथ शामिल किया गया है, इसलिए मैंने इसका उल्लेख नहीं किया। – MahanGM

+3

यही कारण है कि 'MyFunc' को 'बाहरी' सी "' होना चाहिए। 'lua_CFunction' सी लिंकेज के साथ काम करने के लिए एक सूचक है लेकिन 'MyFunc' में C++ संबंध है। मानक कहता है कि ये दो अलग-अलग प्रकार हैं इसलिए इसे संकलित नहीं करना चाहिए (हालांकि अधिकांश मुख्यधारा के कंपाइलर्स गलती से इसे स्वीकार करते हैं)। – Simple

2

बल्कि लुआ सी एपीआई का उपयोग कर की तुलना में, मैं Luabind उपयोग करने का सुझाव: यहाँ कोड मैं अब तक btw मिला है।

लुबाइंड एक उचित उच्च स्तरीय पुस्तकालय है जो विशेष रूप से सी ++ कक्षाओं और लुआ को कार्यों का पर्दाफाश करने के लिए बनाया गया है। लुआ सी एपीआई कार्यों का उपयोग किए बिना, लुआ स्टैक में हेरफेर किए बिना, यह बूस्ट पायथन द्वारा प्रेरित है, इसलिए यदि आप एक सीखते हैं तो आप अधिकतर दूसरे को समझेंगे।

+0

या [LuaBridge] (http: // vinniefalco.com/LuaBridge/Manual.html) अगर लेखक बूस्ट का उपयोग नहीं करना चाहता है। –

संबंधित मुद्दे