2010-02-18 8 views
5

मैं lua फ़ाइल में संग्रहीत विन्यास डेटा में पढ़ने के लिए lua सी-एपीआई का उपयोग कर रहा हूं।मैं अपने लुआ स्टेट स्टैक को कैसे साफ कर सकता हूं?

मुझे फ़ाइल में एक अच्छी छोटी टेबल मिली है और मैंने एक क्वेरी सी-फ़ंक्शन लिखा है जो तालिका में एक विशिष्ट फ़ील्ड को पार करता है। (Yay यह काम करता है!)

यह अधिक से अधिक कार्यों के इन प्रकार के कुछ ही फोन करके काम करता है:

... 
lua_getglobal (...); 
lua_pushinteger (...); 
lua_gettable (...); 
lua_pushstring (...); 
lua_gettable (...); 
lua_lua_getfield (...); 
... 

आप अंदाजा हो।

मेरे जैसे डेटा को पूछने के बाद, क्या मुझे ढेर को साफ करना है?

उत्तर

6

जब तक आपका ढेर बाध्य नहीं होता है, तो आप ठीक होंगे। जब आप लुआ में सी एपीआई से पूर्णांक एन लौटने के लिए, दो बातें होती हैं:

  • लुआ इंजन ढेर से शीर्ष एन मान लेता है और उन्हें कॉल के परिणाम के रूप में मानता है।

  • लुआ इंजन स्टैक पर बाकी सब कुछ हटा देता है (और पुन: उपयोग करता है)।

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

(लेकिन जिस तरह से यह लुआ के नजरिए से होता है एक ही — जब सभी सी कोड निष्पादित नहीं हो, यह एक पूर्णांक वापस जाने के लिए है, और लुआ छिलके कि ढेर बंद कई मूल्यों और फिर बाकी deallocates। है) यदि आप बहुत सारे स्टैक स्लॉट का उपयोग करते हैं, तो आपका प्रोग्राम एक साधु और समझदार त्रुटि संदेश (जैसा कि मुझे अनुभव से पता है) के साथ रुक जाएगा।

1

यह निर्भर करता है।

यदि आपके सी फ़ंक्शन को लुआ से बुलाया जाता है, तो आपके द्वारा छोड़े गए मान वह मान होंगे जो आपके सी फ़ंक्शन लुआ में लौटते हैं। यदि आपके सी फ़ंक्शन को किसी अन्य सी फ़ंक्शन द्वारा बुलाया जाता है जो लुआ स्टैक का उपयोग करता है, तो वे मान अभी भी ढेर पर होंगे, और आप उनके साथ कुछ भी या कुछ भी नहीं कर सकते हैं।

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

1

इसके अतिरिक्त, pushstring या pushinteger एक प्राप्य के बाद उपयोग करने के बजाय, lua_getfield और lua_rawgeti respectivly का उपयोग (कच्चे metamethods हालांकि आह्वान नहीं करेगा, बैठाना आपको लगता है कि चाहता था ...)

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