2015-08-03 9 views
7

पर सी ++ यूनियनों का पर्दाफाश कैसे करें एक परियोजना के लिए मैं काम कर रहा हूं, मुझे कुछ अन्य लाइब्रेरी में लूआ में कुछ सी ++ कक्षाएं बेनकाब करने की आवश्यकता है। दुर्भाग्यवश, इस पुस्तकालय में सबसे महत्वपूर्ण वर्गों में से एक में यूनियनों और Enums (the sf::Event class from SFML) हैं, और quick Google search से मुझे पता चला है कि सी ++ यूनियनों को लुआ में उजागर करने पर कुछ भी नहीं है। मुझे कोई फर्क नहीं पड़ता कि यह ल्यूआ/सी एपीआई के साथ, लाइब्रेरी या बाध्यकारी जनरेटर के साथ, जब तक यह काम करता है, के साथ खुलासा किया जा रहा है। लेकिन, मैं बाध्यकारी जनरेटर का उपयोग नहीं करना चाहूंगा, क्योंकि मैं सी ++ में ऑब्जेक्ट बनाने में सक्षम होना चाहता हूं, फिर ऑब्जेक्ट के उस उदाहरण को लुआ को तब तक बेनकाब करें (जब तक बाध्यकारी जनरेटर के साथ यह संभव न हो)लुआ

+0

कुछ वर्ग और गेटर के साथ उस वर्ग का पर्दाफाश करने के बारे में कैसे? –

+0

@ कैल्विन मेरे मामले में (एसएफ :: इवेंट को उजागर करना), यह एक बहुत गन्दा समाधान है क्योंकि इसमें कई सारे कथन शामिल हैं जिनमें बयान हैं। मुझे एसएफ :: इवेंट और लाइब्रेरी का उपयोग करने के लिए गेटर्स के साथ भी समस्याएं आई हैं। लेकिन मैं इसे दूसरी पुस्तकालय/लुआ/सी एपीआई के साथ कोशिश करने की कोशिश करूंगा। – Orfby

+0

आप थोड़ी देर के लिए इस पर अटक गए हैं। क्या आपने अभी तक सीपीआई सीखा है? क्या आप लुआ मेटाटेबल्स को अच्छी तरह से जानते हैं? यदि आप समझते हैं कि उपयोगकर्ताडेटा और मेटाटेबल्स कैसे काम करते हैं तो यह अपेक्षाकृत सरल है। यहां एक [संबंधित पोस्ट] है (http://stackoverflow.com/questions/31484773/call-c-functions-in-an-active-program-from-lua/31486050#31486050)। – Mud

उत्तर

0

यदि आप संघ के बजाए boost :: संस्करण का उपयोग करने के इच्छुक हैं, आप मेरी LuaCast लाइब्रेरी का उपयोग करने का प्रयास कर सकते हैं।

मैं यूनियनों को मूल प्रकार के रूप में जोड़ने की कोशिश करूंगा।

+0

ओपी एक अलग पुस्तकालय से लुआ को कोड उजागर कर रहा है: यह संभावना नहीं है कि उनके पास तृतीय पक्ष लाइब्रेरी को संशोधित करने की क्षमता होगी। – Yakk

+0

@Yakk यही कारण है कि उन्हें एक रैपर उत्पन्न करने की आवश्यकता है – Alice

1

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)) 

परिणाम:

मुझे लगता है कि यह आपकी मदद कर सकता है!