2013-10-14 10 views
8

चलाने के लिए lua कैसे प्राप्त करें मैं this site के माध्यम से लुआ सीख रहा हूं। मैं ट्यूटोरियल के बहुत शुरुआत में हूँ और इस कार्यक्रम कोशिश कर रहा हूँ (एक नंबर, x दर्ज करते हैं, यह x! रिटर्न):अनुक्रमिक रूप से

-- defines a factorial function 
function fact (n) 
    if n == 0 then 
    return 1 
    else 
    return n * fact(n-1) 
    end 
end 

print("enter a number:") 
a = io.read("*number") -- read a number 
print(fact(a)) 

हालांकि, जब मैं इसे चलाने के लिए, io.read शीघ्र से पहले आ रहा है। मैं तो जैसे नोटपैड ++ कंसोल में यह चला रहा हूँ:

"C:\Program Files\Lua\5.1\lua.exe" "Path\To\factorial.lua" 

उत्पादन होता है (प्रतीत होता है) खाली लेकिन अगर मैं कोई संख्या दर्ज करें, समारोह चलाता है।

5 
enter a number: 
120 

हालांकि यह यहाँ एक मुद्दे के ज्यादा नहीं है, मैं केवल मुद्दों है कि निर्माण से पहले इस्तेमाल किया जा रहा है चर से आ कल्पना कर सकते हैं। तो, इनपुट को पढ़ने से पहले मुझे इस प्रोग्राम को एक नंबर के लिए कैसे संकेत मिल सकता है?

+0

'io.stdout: setvbuf आज़माएं आपके कार्यक्रम की शुरुआत में 'नहीं'। –

+0

@EgorSkriptunoff ठीक से काम करने लगता है। इसे उत्तर देने के लिए स्वतंत्र महसूस करें। –

+3

आप बहुत अधिक पूछ रहे हैं :-) –

उत्तर

13

क्या हो रहा है यह नहीं है कि कोड क्रम से बाहर हो रहा है, लेकिन यह संकेत तुरंत टर्मिनल पर प्रदर्शित नहीं हो रहा है।

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

आप इसे संबोधित करने के दो तरीके हैं। यदि आप फ़ाइल पर सभी आईओ संचालन के लिए बफरिंग को अक्षम या परिवर्तित करना चाहते हैं (और इन उद्देश्यों के लिए, टर्मिनल फ़ाइल के रूप में गिना जाता है), तो आप file:setvbuf() फ़ंक्शन का उपयोग कर सकते हैं; विशेष रूप से, io.output():setvbuf("no") मानक आउटपुट के लिए बफरिंग अक्षम कर देगा, जिसका अर्थ है कि आप जो कुछ भी लिखते हैं उसे तत्काल प्रदर्शित किया जाएगा। आप लाइन बफरिंग को सक्षम करने के लिए io.output():setvbuf("line") का उपयोग भी कर सकते हैं, सिस्टम पर जहां समर्थित है लेकिन डिफ़ॉल्ट नहीं है।

दूसरा दृष्टिकोण बफर को मैन्युअल रूप से फ़्लश करना है, जो उपयोगी है जब आप कुछ विशेष आउटपुट तुरंत प्रदर्शित करना चाहते हैं, लेकिन सार्वभौमिक आउटपुट बफरिंग अक्षम नहीं करना चाहते हैं। उदाहरण के लिए आप file:flush() समारोह है, जो तुरंत बफर flushes के साथ ऐसा कर सकते हैं,:

-- no newline, so even on line-buffered systems this may not 
-- display immediately 
io.write("Enter a number: ") 
-- so we force it to 
io.flush() 

ध्यान दें कि io.write() और io.flush()io.output():write() और io.output():flush() के लिए बस सुविधा कार्य हैं, यानी वे वर्तमान आउटपुट फ़ाइल और फिर :write() फोन या :flush() उन पर।

(क्यों बफरिंग से परेशान है? क्योंकि यह तेज़ है - टर्मिनल या फ़ाइल में डेटा लिखना महंगा है, और एक बड़ी चीज लिखना बहुत छोटी चीजें लिखने से तेज़ है। ज्यादातर मामलों में, इससे कोई फर्क नहीं पड़ता यदि चीजें बहुत तेज़ी से लिखी नहीं जाती हैं तो कोड चलता है, इसलिए ओएस डेटा को बफर में लिखा जाता है और फिर बफर भरने पर एक बड़ा लिखता है।)

+0

बहुत जानकारीपूर्ण। बहुत बढ़िया जवाब। –

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