2008-11-12 18 views
5

के बीच बड़ी संरचना को आगे और आगे कैसे पास किया जाए, मैं एक सी ++ एप्लिकेशन में लूआ को एम्बेड करने के लिए देख रहा हूं। मेरा इरादा लुआ को स्क्रिप्ट के लिए उपयोग करना है जो किसी दिए गए इनपुट के लिए प्रदर्शन करने के लिए ऑपरेशन (ओं) का आदेश देता है। सी ++ प्रोग्राम में एक नया कार्य आइटम प्राप्त करें, लुआ बैकएंड को विवरण पास करें, लुआ आवश्यक काम करने के लिए सी ++ में वापस कॉल करें, परिणाम समाप्त कर दें।सी ++ और लुआ

शामिल प्राथमिक डेटा संरचना एक बड़ी (लगभग 80+ सदस्य) struct है। मैं लूआ के लिए बहुत (नया) हूं और मुझे यकीन नहीं है कि मैं इसे अपने मेजबान एप्लिकेशन और एम्बेडेड लुआ राज्य से कैसे पास कर सकता हूं।

क) धकेल/ढेर पर सभी व्यक्तिगत डेटा सदस्यों पॉपिंग जब करने के लिए/पार करने C++ और लुआ (गन्दा लगता है):

इस प्रकार अब तक मैं के रूप में मेरे विकल्प देखें।

बी) एक तालिका का निर्माण और मूल्यों के साथ पॉपुलटिंग, फिर उस स्टैक को चालू/बंद करना (थोड़ा क्लीनर)।

सी) इसे userdata (प्रकाश/भारी?) के रूप में पास करें (मैं इस पर स्केची हूं, और यह सुनिश्चित नहीं करता कि मैं लूआ पक्ष से इसे कैसे एक्सेस कर सकता हूं यह पूछने के लिए कि कौन से परिचालन आवश्यक हैं)।

किसी भी मार्गदर्शन की सराहना की जाएगी।

उत्तर

4

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

आपको रॉबर्टो के library for converting data to and from C structs for Lua 5.1 द्वारा भी रुचि हो सकती है। या नहीं। आपकी जरूरतों पर निर्भर करता है ... :-)

+0

मैं लाइट्यूसर डेटा से ऑब्जेक्ट-सी ऑब्जेक्ट में डालने में सक्षम था। मुझे कल्पना है कि यह एक संरचना के लिए भी काम करेगा। –

3

मैंने यह स्वयं नहीं किया है (यह लूआ का उपयोग करने के वर्षों से था, और मैंने कभी भी एम्बेडेड फैशन में उपयोग नहीं किया है), लेकिन मुझे लगता है कि आपको metatables और उपयोगकर्ता डेटा प्रकार में देखना चाहिए। मैनुअल उपयोगकर्ताडाटा मानों के बारे में यह कहता है:

यह प्रकार कच्ची मेमोरी के एक ब्लॉक से मेल खाता है और इसमें असाइनमेंट और पहचान परीक्षण को छोड़कर लुआ में पूर्व निर्धारित परिभाषा नहीं है। हालांकि, मेटाटेबल्स का उपयोग करके, प्रोग्रामर उपयोगकर्ता डेटा मानों के लिए संचालन को परिभाषित कर सकता है (§2.8 देखें)। उपयोगकर्ता डेटा गुणों को लुआ में बनाया या संशोधित नहीं किया जा सकता है, केवल सी एपीआई

सही के बारे में लगता है।

1

लुआ को पूरे प्रतिनिधित्व का खुलासा करना आप जो चाहते हैं वह नहीं हो सकता है। शायद आप केवल कुछ परिचालनों का पर्दाफाश कर सकते हैं? फिर प्रकाश उपयोगकर्ता डेटा के रूप में संरचना में एक सूचक का उपयोग करें। यह एक मेटाटेबल नहीं हो सकता है ताकि आपको स्पष्ट कार्यों का उपयोग करना पड़े।

यदि आप सब कुछ बेनकाब करना चाहते हैं, तो आपकी सबसे अच्छी शर्त शायद पूर्ण उपयोगकर्ता डेटा को धक्का देने के लिए है जो संरचना में केवल एक सूचक है। इसका मतलब है कि एक अतिरिक्त स्तर का संकेत --- प्रदर्शन के दृष्टिकोण से शोर में खो गया है, लेकिन गलत होने में आसान है, इसलिए सत्य के एक बिंदु को बनाए रखें जहां आप सी ++/लुआ सीमा पार करते हैं।

पूर्ण उपयोगकर्ता डेटा के साथ आप मैक्रोज़ (डरावनी!) का उपयोग प्रत्येक फ़ील्ड के लिए गेटटर और सेटर फ़ंक्शन डालने के लिए कर सकते हैं। यह हाथ से करने के लिए बहुत काम है, और आप बहुत सारे सामान के साथ आने के बावजूद tolua ++ को देखना पसंद कर सकते हैं।

लुआ मेलिंग सूची पर जाएं!

0

यदि मैं कहां हूं, तो मैं संरचना के संदर्भ में गुजरता हूं और फिर लूआ को इसे संशोधित करने के लिए सी कार्यों को कॉल करने देता हूं। इसका मतलब यह भी है कि अगर आप लुआ को अंतर्निहित प्रणाली के सभी विवरण जानना चाहते हैं तो आप सिस्टम को कम परेशानी से अपग्रेड कर सकते हैं।