Anwenden von 'require()'

Achte bitte darauf, dass Du mit deinem Thema bzw. mit deiner Frage im richtigen Bereich bist.
Die Bereiche sind: Einstellungen im Forum, EEP aktuell ab EEP7 , Splines, Rollmaterialien, Immobilien, Landschaftselemente, Signale und Schaltung, Anlagenvorstellungen, Schnappschüsse Konstrukteure, EEP Treffen , Laberecke, Online - Handbuch EEP Vielen Dank für die Unterstützung das Forum übersichtlich zu halten.
Bilder/Fotos aus dem Internet sind nur als Link gestattet. Eigene Fotos, also Fotos aus dem realen Leben, sind erstens mit Eigenes Bild als Quellenangabe zu kennzeichnen und zweitens nur als Dateianhang im Beitrag zulässig. Bilder ohne Quellenangaben und Bilder dessen Quelle das Internet wie z. B. Google ist, werden gelöscht.
  • Werte Forumsmitglieder!
    Als Neuer möchte ich Euch um Hilfe bezüglich "require()" bitten. Ich habe ein skript erstellt, welches zu lang ist, aus diesem Grunde muss ich wesentliche Teile des Skripts auslagern. Dafür habe ich ein Unterordner im LUA-Ordner erstellt. Das entsprechende Skript geschrieben und bei der Verwendung der Funktion require bin ich gescheitert.

    Die Zeile

    require1("Skripte/Skript 1")

    wird zwar beim "Skript neu laden" akzeptiert, doch der ausgelagerte Skriptteil wird nicht in den Ablauf einbezogen.

    1. Frage: Was mache ich falsch?

    2. Frage: Muss ich das Skript im Unterordner von LUA in einer bestimmten Syntax erstellen, Wenn Ja, könnt Ihr mir ein Beispiel geben?

    3. Frage: Nach Einbringen von require("Pfad/Dateiname") und Erarbeiten des erforderlichen Skriptes im Unterordner, wie erreiche ich es, dass die Kontaktpunkte (Fahrzeug) erkannt werden (Kann die Lua-Function ... nicht finden) und in dieser ausgelagerten Datei die gewünschte Aktion auslösen?
    4. Frage: Wie verwende ich die Funktionen und welche Syntax ist erforderlich: module(name[,...]); require(modname); package.path; package.loaded; package.loaders und package.preload?

    Für Eure Unterstützung wäre ich außerordentlich dankbar.
    Dieter Scharff

  • Die 1 bei require1( … ist falsch.

    Nur ein Tippfehler hier im Forum? Oder auch in deinem Skript?

    Bekommst du im Betrieb eine Fehlermeldung, die sich auf dein require() bezieht?

    Wenn ja, wie lautet die?

    Verzeihung!

    Jetzt habe ich verstanden, dass in deiner Frage 4 die Fehlermeldung steht. Leider nur in Bruchstücken, wie mir scheint und nicht komplett.

    Lautet die Fehlermeldung so?

    Dann wird die Datei nicht gefunden.

    Also ist entweder der Ordnername falsch. Oder der Dateiname. Oder Die Datei ist nicht in diesem Ordner. Oder dieser Ordner ist nicht im Lua Verzeichnis deines EEP

    Da wir nicht sehen, was du wo unter welchem Namen gespeichert hast, können wir nicht beurteilen welcher dieser Fehler zutrifft.

    2 Mal editiert, zuletzt von Goetz (24. Oktober 2018 um 14:41)

  • Ich arbeite nur mit require()Dateien.

    So kann ich für jede Sache eigene Scripte ablegen. Auch das speichern finde ich besser.

    Ich mache immer die Prüfung, ob die Datei gefunden wird. In der ersten Zeile schreibe ich immer print "Datei xy ist eingebunden".

    So kann ich sehen, das alles OK ist.

    Auch die Datei in ANSI kodieren.

    Und wenn Du LUA neu geladen hast, solltest Du die function in einen KP schreiben können.

    Peter

    Betriebsystemname: Microsoft Windows 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.0, Modellkatalog, Bodentextur Tool

  • require1(), ist demzuolge falsch, ich hatte die 1 beigefügt, da es mein erstes 'require() kennzeichnen sollte.

    Habe es sofort entfernt.

    Die Fehlermeldung ist auch indentisch mit meiner Erfahrung und ich werde mich bemühen es zu berichtigen und wie vorgeschlagen jeden Schritt unmittelbar kontrollieren.

    Danke.

    Korrektur vorgenommen!

    So, keine weitere Fehlermeldung!

    Was muss ich nun tun, damit meine Fahrzeug-Kontaktpunkte, die ich in der Anlage einsetze und das ausgelagerte Skript betreffen, akzeptiert werden?

    Fehlermeldung z.B.: Kann die Lua Funktion: SetSignal20 nicht finden.

    Für diesen Kontaktpunkt gibt es also im Haupt-Lua Skript keine Funktion.

  • Hallo Dieter,

    dein Lua-Script welches du nachladen willst gehört in den Ordner EEP -- \ LUA . z.B. "Test.lua" der require Aufruf wäre dann: require ("Test") und es stehen alle Funktionen des Scriptes "Test.lua" zur Verfügung.

    Gruß Walter

    EEP 15.1 EEP 16
    MS Windows 10 Pro 64bit
    Prozessor: AMD FX-8370 Eight-Core Processor 4,0GHz // RAM: 32GB // SSD 256GB // Grafikkarte: GeForce GTX 950

  • Ich denke, du erstellst in Deinem require Ordner funktionen.

    Du mußt immer nach jeder Änderung das Script speichern (vergisst man leicht), und dann LUA neu starten.

    Dann wie gewohnt den Namen der funktion in den KP eintargen. Sollte dann gehen.

    Peter

    Betriebsystemname: Microsoft Windows 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.0, Modellkatalog, Bodentextur Tool

  • ich hatte die 1 beigefügt, da es mein erstes 'require() kennzeichnen sollte.

    Das war aus folgendem Grund falsch.

    require() ist eine Funktion, die an anderer Stelle definiert ist. Im Gegensatz zu Funktionen, die du selbst erstellst, bringt Lua dieses require() gleich fix und fertig mit. Damit steht auch der Name fest.

    Wenn du ein externes Skript einbinden möchtest, dann musst du die Funktion require() ausführen. Also musst du beim Funtionsaufruf den Namen verwenden, unter dem die Funktion definiert wurde. Den kannst du nicht nach Belieben abändern.

    Dasselbe gilt beispielsweise auch für print(). Diese Funktion ist vordefiniert. Eine Funktion namens print1() hingegen nicht. Die müsstest du erst bauen, bevor du sie benutzen kannst.

    Du kannst require() mehrfach hintereinander benutzen und musst dabei den Funktionsnamen nicht ändern:


    Lua
    require("Skripte/Test_1")
    require("Skripte/Test_2")
    require("Skripte/Test_3")

    Genaiuso ist es doch auch mit Funktionen wie zum Beispiel EEPSetSignal(). Die rufst du auch mit dem selben Namen auf, obwohl du verschiedene Signale schalten willst.

    Lua
    EEPSetSignal(42, 1)
    EEPSetSignal(13, 2)
    EEPSetSignal(99, 1)


    Was muss ich nun tun, damit meine Fahrzeug-Kontaktpunkte, die ich in der Anlage einsetze und das ausgelagerte Skript betreffen, akzeptiert werden?

    Du musst einmal im 3D Modus in den Fahrbetrieb wechseln. Denn erst in diesem Moment wird dein Hauptskript abgearbeitet. Und das heißt, dass erst in diesem Moment dein zusätzliches Skript eingebunden wird. Und das heißt wiederum, dass EEP erst im Anschluss alle Funktionsnamen kennt und dir erlaubt, diese Funktionsnamen in die Kontaktpunkte einzutragen. Dafür darfst und musst du natürlich wieder in einen der Editor (2D oder 3D) zurück wechseln.

  • Danke für Eure Antworten! Sie haben mit schon wieder weiter geholfen.

    Wenn ich dieses 'require()-Problem insgesamt lösen könnte, wäre ich sehr froh und könnte an meiner Anlage weiter arbeiten!

    Im Hauptskript habe ich die Zeile

    module("Modul_1.lua/Module")

    eingesetzt. Modul_1.lua (Datei); Module (Ordner: C:/Trend/EEP14/LUA/Module))

    als Fehlermeldung erhalte ich

    [string "EEP Scipt"]: 22: attemt to call a nil value (global 'module')

    Leider kann ich hierfür keine Lösung finden.

    Danke, dass Ihr so geduldig seid!

  • module("Modul_1.lua/Module")

    Wie kommst du auf diese Zeile?

    Hast du irgendwo eine Funktion namens module() deklariert?

    Nein, die ist nicht deklariert.

    Deshalb findet Lua bei der Suche nach der Funktion namens module() nix. Auf Englisch: nil.

    Und genau das steht in deiner Fehlermeldung.

    Und es gibt sicher auch keinen Ordner namens Modul_1.lua. Das sieht eher nach einem Dateinamen aus. Der gehört dann ans Ende. Hinter den Ordnernamen. Aber über diesen zweiten Fehler ist Lua bei dir noch nicht gestolpert, weil der oben genannte Fehler Lua schon gestoppt hatte.

    Lösung:

    Es muss require("Module/Modul_1") heißen, wenn du wirklich einen Ordner namens "Module" hast und sich darin eine Datei namens "Modul_1.lua" befindet.

    Beachte bitte auch folgendes:

    Die Datei muss den Anhang .lua am Namen haben. Sie muss also "Modul_1.lua" heißen.

    Aber in der Funktion require() darf nur der Name der Datei stehen. Ohne den Zusatz .lua. Also nur "Modul_1"

    3 Mal editiert, zuletzt von Goetz (24. Oktober 2018 um 19:50)

  • Danke Goetz, Ich werde jetzt alles in diesem Sinne in Ordnung bringen.

    Eine Bitte habe ich diesbezüglich noch, bitte schreibe mir die Zeilen, die zur Funktion module() insgesamt notwendig sind, einmal auf, denn alle meine Versuche haben nichts ergeben.

    Module ist der Ordner unter Lua, und Module_1.lua ist die Datei, in der das ausgelagerte Script steht.

    Vielleicht wird sich dann auch das Problem - Kontaktpunkte - lösen.

    Noch einmal Danke für Deine Unterstützung.

  • Lösung:

    Es muss require("Module/Modul_1") heißen, wenn du wirklich einen Ordner namens "Module" hast und sich darin eine Datei namens "Modul_1.lua" befindet.

    Götz hat es schon beantwortet :co_k:

    EEP 15.1 EEP 16
    MS Windows 10 Pro 64bit
    Prozessor: AMD FX-8370 Eight-Core Processor 4,0GHz // RAM: 32GB // SSD 256GB // Grafikkarte: GeForce GTX 950

  • Das hatte ich schon in dieser Form berichtigt, danke.

    Mir geht es darum, was muss alles bezüglich 'module()' in das Hauptscript oder auch in das Nebenscript eingetragen werden? Ich denke, dann würde dieser wichtige Prozess der Auslagerung und des Wiedereinbeziehens in den Lua-Script-Ablauf funktionieren. Falls auch die Kontaktpunkte akzeptieret werden.

  • Im Hauptscript kann stehen:

    require ("\\H_Bahn_Neu\\LUA_Ampeln1")

    Ich habe unter LUA einen Ordner "H-Bahn_Neu" . Und in dem Script gibt es verschiedene functionen

    Z.B. die function Ampel1 ()

    Und wenn alles OK ist, gibst Du Ampel1 in den KP ein.

    Peter

    Betriebsystemname: Microsoft Windows 11 Pro

    Prozessor:Prozessor AMD Ryzen 7 7700X 8-Core Processor, 4501 MHz, 8 Kern(e), 16 logische(r) Prozessor(en)

    PC:RAM 32 GB, Name NVIDIA GeForce RTX 4070 Ti

    EEP 17 mit allen Plug ins und Patches

    Modelkonverter, Home-Nostruktor 16.0, Modellkatalog, Bodentextur Tool

  • Mir geht es darum, was muss alles bezüglich 'module()' in das Hauptscript

    Nichts, Dieter.

    Ich dachte, das wäre aus meinen Worten deutlich geworden.

    Insbesondere in der Textpassage unter dem verräterischen Wort "Lösung"

    Ich weiß nicht, woher du den Unsinn mit dem Funktionsnamen "module" hast. Den brauchst du nicht.

    Du brauchst die Funktion "require".

    Nur die.

    Mehr nicht.

    Und wie der komplette "require" Funktionsaufruf geschrieben werden muss, hatte ich dir auch geschrieben.

  • Hallo Dieter,

    wie @Goetz schon geschrieben hat, erstellst Du ein Modul einfach, indem eine separate LUA-Datei schreibst. Der Modulname ist dann der Dateiname. Das Modul bindest Du ein, indem Du require(dateiname) schreibst, dabei lässt Du die Erweiterung .lua im Dateinamen weg.

    Unglücklicherweise gibt es in LUA auch eine Standard-Funktion module(), mit der man auf relativ "hinterfotzige" Weise auch ein Modul erstellen kann. Aber die vergisst Du am besten ganz schnell wieder.

    Vielleicht kennst Du ein Modul-Konzept aus einer anderen Programmiersprache und vermutest hier den Bedarf, die Funktion module() zu verwenden. Dem ist aber nicht so. In LUA ist der Modulname aber einfach der Dateiname. Und im "Modul" steht weiter nichts Spezifisches.

    Gruß

    Christopher

    P.S.: Meine Lieblingsseite für eine sehr kompakte Beschreibung von LUA ist übrigens https://lua.coders-online.net/.

    P.P.S.: Goetz war mal wieder schneller.

    PC: Intel i7-7700K; 64bit; 4,2 GHz; 32GB RAM; GeForce GTX 1080 (8 GB); Win 10, 22H2; EEP 6, 15 (Dev), 17.2 Plugins 1+2 (Dev); HomeNOS 17 (Dev)
    Laptop: Intel i7-12700H; 64bit; 2,7 GHz; 16GB RAM; GeForce RTX3070Ti (8 GB); Win 11, 23H2; EEP 6, 17 Plugins 1+2; HomeNOS 17 (User)

  • Danke für Eure Tips!

    Im LUA-Ordner habe ich einen Ordner "Steuerung" geschaffen und in diesem Ordner eine Datei "Umfahrung_1.lua".

    In mein Hauptscript habe ich geschrieben

    require("Steuerung/Umfahrung_1") wieder diese lange Fehlermeldung (... module'Steuerung/Umfahrung_1' not found, no file C:\Trend\EEP14\lua\Steuerung/Umfahrung_1.lua.).....

    Dann habe ich es mit

    require("\\Steuerung\\Umfahrung_1") versucht - wieder diese Fehlermeldung

    weiter, nachdem ich die Datei in LUA_Umfahrung_1.lua umbenannt habe,

    require("\\Steuerung\\LUA_Umfahrung_1") wieder diese Fehlermeldung.

    Die letzte Variante war

    require("Umfahrung_1) bzw. require("Steuerung/Umfahrung_1") doch wieder diese Fehlermeldung.

    Meine Path ist doch eindeutig C:\Trend\EEP14\LUA\Steuerung und in Steuerung die Datei Umfahrung_1.lua.

    Alle Eure Hinweise habe ich gelesen und auch berücksichtigt, doch mache ich noch etwas falsch und ich habe keine Idee mehr, nur aufgeben möchte ich nicht.

    Einmal editiert, zuletzt von Dieter Scharff (25. Oktober 2018 um 07:19)

  • Übrigens, wenn ich statt 'Steuerung' den gesamten Pfad eingebe,

    require("C:\Trend\EEP14\LUA\Steuerung/Umfahrung_1")

    kommt die Fehlermeldung

    [string'EEP ]:19: invalid escape sequence near '"C:\T'

    Jetzt bin ich mit meinem Latein am Ende, dennoch habe ich Hoffnung, es irgendwann (mit Eurer Hilfe) lösen zu können.

  • Um in Lua mit require() den kompletten Pfad des Lua-Ordners anzugeben ist folgendes nötig:

    package.path = package.path..";?.lua"

    require("C:\\Trend\\EEP14\\Lua\\Steuerung\\Umfahrung_1")

    Gruß Frank

    Bin nur noch lesendes Mitglied... (meistens:aa_1:)

  • Hi Frank!

    Habe den Pfath genau nach Deiner Vorlage eingegeben.

    Ergebnis: Wieder die lange Fehlermeldung ...:module'C: .... not found; no field package.preload['C: ...]

    Vielleicht sollte ich mir mit meinen 74 Jahren doch ein einfacheres Hobby suchen, doch EEP... ist meine wichtigste Unterhaltung und mein geistiges Fitness-Training. Entschuldigt, wenn ich hin und wieder etwas schwer von Begriff bin!

    Danke für alle Eure Unterstützung.

    Gruß Dieter