Frage zu io.read()

  • Hey.

    Ich wollt mich mal etwas mit LUA beschäfftigen.

    Wenn ich in einer Schleife io.read() aufrufe, wird die ausführung des Programmes ja bestoppt, bis ich die eingabe mit Enter bestätige.
    Jetzt will ich aber einen Tastenanschlag überprüfen, ohne das Enter gedrückt werden muss.
    Ich habe schon die LUA referenz durchsucht und zu dem Thema nicht gefunden.

    Hat von euch jemand ne Ideem wie ich das realisieren könnte ?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    • Offizieller Beitrag

    Dafür hält LUA das Event "OnKey" bereit. Je nach dem, was du machen möchtest, könntest du aber auch "OnChar" verwenden.
    Unterschied:
    - OnKey gibt dir den Keycode bevor das zugehörige Zeichen verwertet wird, d.h. du kannst hier sofort ggf. korrigierend eingreifen.
    - OnChar gibt dir das Zeichen nachdem die Taste gedrückt und das Zeichen übernommen wurde.

    Hier ein Bsp. für OnKey:

    Code
    ----------------- create new EventClass, event: OnKey ------------------
    MyHitKey = EventClass:new(Common)
    ------------------------------------------------------------------------
    
    
    ----------------- Event: OnKey -----------------------------------------
    function MyHitKey:OnKey(_keycode, _shift, _ctrl, _alt)
    	print('_keycode: '..tostring(_keycode)..', _shift: '..tostring(_shift)..', _ctrl: '..tostring(_ctrl)..', _alt: '..tostring(_alt))  -- DebugToConsole
    end  --> MyHitKey
    ------------------------------------------------------------------------

    Edit:
    Hier analog für OnChar

    Code
    ----------------- create new EventClass, event: OnChar ------------------
    MyNewChar = EventClass:new(Common)
    ------------------------------------------------------------------------
    
    
    -------------------------------------------------------------------------
    function MyNewChar:OnChar(_charAdded)
    	print('_charAdded', _charAdded)
    end  --> MyNewChar
    -------------------------------------------------------------------------
  • Danke dir, werde ich gleich mal ausprobieren.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Hey, ich habe noch ein Problem und dachte einen extra Thread aufmachen lohnt sich nicht, deshalb poste ich einfach nochmal hier.

    Und zwar bekomme ich bei diesem Code immer den Fehler: attempt to index ? (a nil value)

    Spoiler anzeigen

    Die Referenz sagt zu io.open() ja folgendes:

    Zitat

    This function opens a file, in the mode specified in the string mode. It returns a new file handle, or, in case of errors, nil plus an error message.

    Jetzt wird aber mein io.write("Testausgabe\n") noch ausgegeben und der Fehler tritt erst auf, wenn fileHandle:lines() ausgeführt werden soll.

    Meine Frage dazu nun, tritt dieser Fehler auf, weil er die Datei nicht findet, oder nicht öffnen kann?
    Denn eig. habe ich es auch schon mit einer manuellen Eingabe des absoluten Pfades in die Funktion io.open() probiert, jedoch mit selbigem Resultat.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    • Offizieller Beitrag

    Mal kurzer Blick drauf..
    Für Lesefunktion kannst du dir das Handle schenken. Ruf die Iteratorfunktion mit dem Dateinamen auf. Hast du ein Handle, wird dieses beim Aufruf zurückgewandelt in den Dateinamen - also doppelt gemoppelt.
    So funzt es:

    Code
    for line in io.lines(Dateipfad) do
        io.write(line .. '\n')
    end
  • hey.

    Ich war eig. der Meinung, das hätte ich schon probiert.

    Auf jeden Fall habe ich etwas rumprobiert und wollte dann mittels io.read() die ganze Datei einlesen und mit io.write() gleich in die Console schreiben, als ich dann ganz verwundert festgestellt hab, dass nur eine Zeile der Datei auftaucht, und als ich ein zweites mal io.read() aufrufte tauchte die zweite Zeile auf.

    Das ist mein Code:

    Ich bin mir ziehmlich sicher, dass es sich da um einen Bug bei mir auf dem System handelt, denn anders gann ich es mir nicht erklären, dass eine Funktion die eine Zeile einer Datei auslesen sollte nicht funktioniert, aber dafür die Funktion, welche die ganze Datei einlesen solle nur eine Zeile zurück liefert.

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

    • Offizieller Beitrag

    Du verstehst die Funktionen noch nicht. ;)
    Beim Aufruf wird eine Iteratorfunktion erstellt, diese gibt die erste Zeile zurück, beim zweiten Aufruf die nächste Zeile usw.. Wenn das Dateiende erreicht ist wird nil zurückgegeben.
    In meinem Bsp. habe ich diese Iteratorfunktion (aufgerufen durch io.lines(file) ) als dritten Parameter der for-Schleife übergeben. Somit werden alle Zeilen nacheinander ausgegeben.
    Nur für kleine Dateien empfiehlt sich diese Vorgehensweise, da aufgrund des Garbage Collectors, den LUA kontinuierlich aufruft um Speicherplatz freizugeben, das Einlesen einer 350 kB Datei zeilenweise fast eine Minute dauert. Liest du dieselbe Datei aber mit io.read("*all") ein, dauert der Vorgang nur noch 0.02 s!

    Lies mal das: Programming in Lua (first edition), da findest du viele gute Tipps.