2013-10-14 8 views
8

Ich lerne Lua über this site. Ich bin in der ersten Stunde der Tutorials und ich versuche, dieses Programm (eine Nummer eingeben, x, es gibt x!):Wie lua nacheinander zu laufen

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

Allerdings, wenn ich es laufen, die io.read scheint vor der Aufforderung zu kommen. Ich verwende es in Notepad ++ Konsole wie folgt:

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

Der Ausgang ist (scheinbar) leer, aber wenn ich eine Nummer eingeben, wird die Funktion ausgeführt wird.

5 
enter a number: 
120 

Während dies hier nicht viel ein Problem ist, kann ich nur die Probleme vorstellen, die von Variablen kommen Gewöhnung vor der Schöpfung. Also, wie kann ich dieses Programm dazu bringen, nach einer Nummer zu fragen, bevor ich eine Eingabe lese?

+0

Versuchen Sie 'io.stdout: setvbuf "Nein" zu Beginn Ihres Programms. –

+0

@EgorSriptunoff Scheint, jetzt richtig zu arbeiten. Fühlen Sie sich frei, das eine Antwort zu geben. –

+3

Sie fragen nach zu viel :-) –

Antwort

13

Was passiert, ist nicht, dass der Code nicht ordnungsgemäß ausgeführt wird, aber dass die Eingabeaufforderung nicht sofort auf dem Terminal angezeigt wird.

Intern wird alles, was Sie ausgeben, vom Betriebssystem in einem IO-Puffer gespeichert. Der Puffer wird regelmäßig geleert und sein Inhalt wird auf dem Terminal angezeigt (es ist gespült). Bei den meisten Systemen ist das Terminal standardmäßig gepuffert, was bedeutet, dass jedes Mal, wenn Sie ein Zeilenendezeichen schreiben - was print() automatisch tut - es gelöscht wird; Bei einigen Systemen ist jedoch standardmäßig voll gepuffert, was bedeutet, dass es nur dann automatisch geleert wird, wenn es voll ist.

Es gibt zwei Möglichkeiten, wie Sie das beheben können. Wenn Sie die Pufferung für alle IO-Operationen für eine Datei deaktivieren oder ändern möchten (und für diese Zwecke zählt das Terminal als Datei), können Sie die file:setvbuf()-Funktion verwenden; Insbesondere deaktiviert io.output():setvbuf("no") die Pufferung für die Standardausgabe, was bedeutet, dass alles, was Sie schreiben, sofort angezeigt wird. Sie können auch io.output():setvbuf("line") verwenden, um die Zeilenpufferung auf Systemen zu aktivieren, auf denen dies unterstützt wird, aber nicht standardmäßig. Der andere Ansatz besteht darin, den Puffer manuell zu leeren, was nützlich ist, wenn Sie möchten, dass eine bestimmte Ausgabe sofort angezeigt wird, aber nicht universell die Ausgabepufferung deaktivieren soll. Sie können mit der file:flush() Funktion dies tun, die sofort den Puffer leert, zum Beispiel:

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

Beachten Sie, dass io.write() und io.flush() sind nur Komfortfunktionen für io.output():write() und io.output():flush(), dh sie die aktuelle Ausgabedatei erhalten und rufen Sie dann :write() oder :flush() auf sie.

(Warum überhaupt Pufferung? Weil es schneller ist - das Schreiben von Daten in ein Terminal oder eine Datei ist teuer, und das Schreiben einer großen Sache ist schneller als das Schreiben vieler kleiner Dinge. In den meisten Fällen spielt es keine Rolle Wenn die Dinge nicht sofort geschrieben werden, wenn der Code ausgeführt wird, speichert das Betriebssystem die zu schreibenden Daten in einem Puffer und erstellt dann einen einzelnen großen Schreibvorgang, wenn der Puffer voll ist.

+0

Sehr informativ. Gute Antwort. –