Jump to content

Goetz

Mitglieder
  • Gesamte Inhalte

    6151
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Goetz

  1. @m.weber Danke für deine offenen Worte. Jetzt verstehe ich besser, warum ich angeeckt bin. Gruß Götz
  2. An dieser Stelle würde ich gerne ein paar kleine Übungen anregen. Denn das Konzept einer Funktion sowie die Auswertung von true und false sind für das Programmieren elementar wichtig. Die Übungen stammen alle von Nick Parlantes Website Codingbat Ich habe sie nur von Englisch nach Deutsch und von Python nach Lua übersetzt. Die erste Aufgabe lautet wie folgt: Schreibe eine Funktion, die anhand der beiden Argumente Werktag und Urlaub zurückgibt, ob man ausschlafen kann oder nicht. Man muss nur die Funktion definieren. Und der Rahmen ist schon vorgegeben. function Ausschlafen(Werktag, Urlaub) end Beim Aufruf werden die Variablen Werktag und Urlaub jeweils mit true oder false befüllt. An Werktagen darf man nur im Urlaub ausschlafen. Wenn kein Werktag ist, dann darf man immer ausschlafen. Die Aufgabe ist, zwischen die erste und letzte Zeile der Funktionsdefinition ein wenig Lua Code zu schreiben. Dieser soll Werktag und Urlaub auswerten und dann soll die Funktion je nach Ergebnis der Auswertung entweder ein true oder false zurückgeben. Man muss nur die Funktionsdefinition vervollständigen. Im Anhang füge ich ein kleines Testskript bei. Das kann man im oberen Teil entsprechend ergänzen und dann komplett in Lua-Demo, ZeroBrane, Notepad++ oder einem anderen Programm laufen lassen. Der untere Teil des Testskripts ist eine kleine Prüfroutine welche euch zeigt, ob eure Lösung funktioniert oder nicht. Diesen Teil dürft ihr bitte nicht verändern. Es wäre schön, wenn ihr mir Lösungsvorschläge nur als persönliche Nachricht schickt und sie nicht öffentlich postet. So hat jeder die Chance für sich zu überlegen, wie er die Aufgabe lösen möchte. Ausschlafen.zip
  3. Es tut mir leid, @MakKucken Notepad++ und ZeroBrane sind meines Erachtens die beiden Editoren, die sich am besten für eigene Lua Experimente eignen. Und das auch nur für die verbleibende, kurze Zeit bis 3D Modellbahnstudio V5 verfügbar ist. Dann ist der enthaltene Editor sowieso die richtige Wahl, weil er die Besonderheiten unterstützen wird, die es für das Zusammenspiel von 3D MBS und Lua geben wird. Deshalb wollte ich dir empfehlen, bei einem der zwei genannten zu bleiben. Das ist doch kein Grund, gleich verschnupft zu reagieren. Gruß Götz
  4. Bleib bei Notepad++ oder ZeroBrane. Je nachdem, was dir mehr zusagt. Stecke deine Energie lieber in das Erlernen von Lua selbst. Das wird dich weiterbringen, als ein Vergleich aller verfügbarer Editoren.
  5. 2b or not 2b fragte sich ein Postbote im englischen Stratford upon Avon im Jahre 1584 beim Versuch, die handgeschriebene, unleserliche Adresse auf einem Brief zu entziffern. Damit inspirierte er nicht nur den jungen William Shakespeare zu seinem berühmten Monolog, sondern legte zugleich auch den Grundstein für viele Programmiersprachen. Neben dem and aus dem letzten Kapitel sind or und not die anderen zwei Operationen, die man benötigt um Bedingungen zu verknüpfen. Das englische Wort or entspricht dem deutschen oder. Die Verknüpfung zweier Elemente mit or bedeutet, dass mindestens ein Element wahr sein muss, aber auch mehr als ein Element wahr sein darf. Es ist kein entweder ... oder. Gleis_1_frei or Gleis_2_frei ist also auch dann true, wenn beide Variablen true sind. Ein entweder ... oder (man nennt das ein exklusives oder) gibt es in Lua nicht. Das Wort not entspricht dem deutschen Wort nicht. Mit not kann man ein boolean ins Gegenteil verwandeln. Es macht aus true ein false und umgekehrt. Wenn man zum Beispiel nur dann das Gleis 3 benutzen will, wenn Gleis 1 besetzt ist, dann könnte die Prüfung so aussehen if Gleis_3_frei and not Gleis_1_frei then Das not bindet stärker als die Vergleichsoperatoren. Wer das Ergebnis eines Vergleichs umkehren möchte, der muss den Vergleich in Klammern setzen not (a == b) -- ist dasselbe wie a ~= b Die Bedeutung von and, or und not ist einfach zu verstehen. Aber daraus die logisch richtige Kombination zu bilden, fällt manchmal auch erfahrenen Programmierern schwer. Deshalb werde ich in den nächsten Tagen ein paar sehr einfache Übungen dazu vorstellen. für Fortgeschrittene! Die logischen Operationen and und or liefern nicht immer ein boolean. Mit and bekommt man das zweite Element zurück, wenn beide Elemente wahr sind. Mit or bekommt man das erste wahre Element zurück. Dazu muss man wissen, dass jeder Wert, der in einer Variable gespeichert ist, in Lua als wahr gilt. Nur nil und false gelten als falsch. Eine Zahl ist also true. Und im Gegensatz zu anderen Programmiersprachen wertet Lua auch die 0 als true. Ein String ist ebenfalls true. Auch ein Leerstring "". Das Ergebnis von true and 1 ist 1, nicht true! Das Ergebnis von 0 or 1 ist 0 Das Ergebnis von 0 and 1 ist 1, nicht false! Das Ergebnis von Test or 1 ist 1, wenn Test noch keinen Wert hat bzw. noch nicht deklariert ist. Das Ergebnis von Test or 1 ist der Inhalt von Test, wenn dieser Inhalt nicht nil oder false ist. Das Ergebnis von "Toby" or not "Toby" ist "Toby" Das Ergebnis von 2b or not 2b ist eine Fehlermeldung, weil kein Variablenname mit einer Zahl beginnen darf! Wenn das Ergebnis einer Verknüpfung feststeht, dann werden die restlichen Elemente nicht mehr geprüft. Das bedeutet, dass Lua bei einem and aussteigt, wenn das erste Element false ist. Das Ergebnis der and Operation kann nicht mehr true sein, wenn ein Element false ist. Wird das zweite Element durch einen Funktionsaufruf gebildet, dann findet dieser Funktionsaufruf in diesem Fall nicht statt. Bei einem or steigt Lua entsprechend beim ersten wahren Element aus. Ist das erste Element true, dann wird eine Funktion, die das zweite Element liefern soll, nicht mehr ausgeführt. Ich glaube, dass das in vielen anderen Programmiersprachen genauso gehandhabt wird. Wenn man das versteht, dann kann man es sich zunutze machen. Wenn man es ignoriert, dann beißt es einen irgendwann in den Hintern ;-)
  6. Goetz

    Oberleitung V4

    @Andy Bei Lokschuppen mit Fahrleitung ist eine kleine Aussparung für den Fahrdraht in der Tür. Bei Lokschuppen ohne Fahrdraht werden kleine Akkuschlepper eingesetzt.
  7. Ich denke, es ist alles korrekt. Das Fenster schließt selbständig, weil das Programm beendet ist.
  8. Da bin ich ehrlich überfragt, weil ich für solche Tests ZeroBrane benutze. Oder einfach die Lua-Demo Seite
  9. Ich habe mich sehr über Neos schnelles Handeln gefreut und meine bisherigen Postings alle entsprechend umgestaltet. Sorry @Andy aber für deinen persönlichen Unmut über die unterschiedlichen Schreibweisen bei Codes, Tags etc. ist hier nicht der richtige Platz.
  10. Goetz

    Code-Tags

    Vielen, vielen Dank, Neo! @fex Neo hat dir in der Antwort an Andy schon ein Beispiel gezeigt. Man kann Programmcode wie z.B. ein Lua Skript dank des neuen <> Knopfes jetzt in einen speziellen Kasten setzen. Der hebt diesen Teil im Postimng deutlich erkennbar als Programmcode ab. Und der Kasten verhindert, dass die Forensoftware im Code-Block Dinge eigenmächtig ändert. Es hat nämlich fatale Folgen, wenn z.B. bei der Eingabe der erste Buchstabe einfach in einen Großbuchstaben geändert wird. Alles, was die Formatierung des Postings beeinflusst, nennt man "tag" (täg ausgesprochen). Ein tag ist in der englischen Sprache eine Kennzeichnung. Zum Beispiel die kleinen Schildchen, die man im Laden an der Kleidung findet.
  11. Entscheidungshilfen Ein Computerprogramm muss oft eine Entscheidung treffen. Und für die Entscheidung muss es eine Bedingung prüfen. Falls das Signal Halt zeigt, muss der Zug angehalten werden Falls die Weiche auf Abzweig steht, darf das Signal nur „Fahrt mit 40“ anzeigen Falls es ein Güterzug ist, muss er in den Güterbereich einfahren Falls alle Gleise belegt sind, muss das Einfahrsignal auf „Halt“ bleiben Für solche Fälle gibt es in Lua die if … then Konstruktion. Zwischen das Schlüsselwort if (zu Deutsch: falls) und das Schlüsselwort then (zu Deutsch: dann) kommt die Bedingung In den Zeilen darunter steht, was getan werden soll, falls die Bedingung erfüllt ist. Und der Block wird, wie alle Blöcke in Lua, mit dem Schlüsselwort end abgeschlossen. Eine Bedingung kann nur entweder erfüllt sein oder nicht. Etwas anderes als diese zwei Möglichkeiten gibt es in der Programmierung nicht. Deshalb erwartet Lua zwischen dem if und dem then ein boolean. Also true oder false, oder etwas, dass true oder false ergibt. Zum Beispiel einen Vergleich. Die Schlüsselworte if und then bilden die Klammer um die Bedingung if Test > 1 then print("Die Variable Test enthielt einen Wert, der größer als 1 war") end Lua kann immer nur einen einzelnen Vergleich durchführen, keine Kette von mehreren Vergleichen. 3 > Test > 1 ist in Lua nicht erlaubt. Daher muss man oft mehrere Bedingungen logisch verknüpfen. Dafür gibt es die Schlüsselworte and (zu Deutsch: und) sowie or (zu Deutsch: oder) if (Test > 1) and (Test < 3) then print("Der Wert von Test liegt zwischen 1 und 3") end Ich habe die beiden Vergleiche oben in Klammern gesetzt. Das wäre in Lua nicht zwingend erforderlich. Denn die Vergleichsoperatoren binden stärker als das and. (Es ist dasselbe Prinzip wie die vertraute Regel: Punktrechnung vor Strichrechnung). Das and bedeutet, beide Bedingungen müssen erfüllt sein. Test muss größer als 1 und kleiner als 3 sein, damit man sagen kann: Test liegt zwischen 1 und 3. Mit dem and werden also zwei Elemente, die entweder true oder false sind, miteinander verknüpft. Das Ergebnis ist ein neues, einzelnes true oder false. Und das Ergebnis der Verknüpfung ist nur dann true, wenn beide Elemente true sind. Für das if bedeutet das: Es sieht nur ein einzelnes true oder false. Nämlich das Ergebnis der Operation zwischen dem if und dem then. Daher kann man diesen boolean Wert auch in einer Variablen zwischenspeichern, wenn man möchte: Bedingung = Test > 1 and Test < 3 if Bedingung then print("Der Wert von Test liegt zwischen 1 und 3") end In vielen Fällen ist es sinnvoll, das Ergebnis eines Vergleichs in einer Variablen zu speichern. Dann kann man diese Variable direkt als Bedingung verwenden. Das macht den Code lesbarer. Und man hat es leichter, wenn man die Bedingungen ändern möchte. Die stehen jetzt nämlich alleine rechts vom = Zeichen und nicht irgendwo mitten zwischen if und then. Wenn man die Bedingung vorab ermittelt und in einer Variablen ablegt, dann kann man sie auch in mehrere kleine Happen unterteilen: Bedingung_1 = Test > 1 Bedingung_2 = Test < 3 Bedingung = Bedingung_1 and Bedingung_2 if Bedingung then print("Der Wert von Test liegt zwischen 1 und 3") end Im obigen Beispiel ist das natürlich vollkommen übertrieben. Aber im Ernstfall kann das helfen, den Überblick zu bewahren wenn es z.B. darum geht, ob ein Zug ein Güterzug ist, der an einem "Halt" zeigenden Signal ankommt und nur dann "Fahrt" bekommen darf, wenn das für ihn vorgesehene Gleis frei ist und alle Weichen richtig gestellt wurden. Man muss diese Dinge mit so lächerlich einfachen Beispielen üben. Nur dann hat man später im Ernstfall die nötige Routine, um alles richtig zu machen. Man macht die erste Fahrstunde aus gutem Grund auf einem leeren Parkplatz und nicht mitten im Berufsverkehr.
  12. Ganz genau. Das ist für den Einsteiger zunächst bequem, weil er sich nicht mit den beiden Typen und ihren Eigenschaften auseinandersetzen muss. Das demonstriert dein Taschenrechner-Trick sehr gut. Aber dieser unkontrollierte Wechsel von integer zu float ist nicht ohne Probleme. Der erfahrene Programmierer muss hier aufpassen!
  13. Welcher Typ bist du? Es gibt ein paar Typen, die lernt jeder Programmierer ziemlich früh kennen. Über die müssen wir jetzt mal reden. true und false sind zum Beispiel solch ein Typ. Diesen Typ nenn man boolean, nach dem Mathematiker George Boole. Daten des Typs boolean können nur zwei verschiedene Werte haben. Entweder true oder false. Man benutzt diesen Typ überall dort, wo man zwischen zwei Zuständen unterscheiden möchte: an oder aus, frei oder besetzt, auf oder zu, ja oder nein … Alles, was im Programmcode eine Entscheidung trifft, erwartet den Typ boolean als Argument. Das while aus dem letzten Kapitel ist ein Beispiel dafür. Entweder wird die while Schleife wiederholt oder nicht. Je nachdem, ob das Argument wahr oder falsch, also true oder false ist. Zahlen werden in zwei Typen unterschieden. die ganzen Zahlen. Die nennt man in der Programmierung integer die Fließkommazahlen. Die nennt man in der Programmierung float Der Grund für die Unterscheidung liegt in der unterschiedlichen Genauigkeit bei Berechnungen. Das erkläre ich hier aber nicht im Detail, weil Lua diese Unterscheidung gar nicht macht. Lua kennt nur einen Typ für alle Zahlen und nennt diesen Typ number. Die größtmögliche ganze Zahl in Lua ist 9223372036854775807. Wenn man in einem Video bei 0 anfängt und dann bei 60 fps in jedem Bild 1 weiter zählt, dann erreicht man diese Zahl nach 4.8 Milliarden Jahren! Rechnet es nach! grosse_Zahl = 9223372036854775807 Bilder_pro_Jahr = 365 * 24 * 60 * 60 * 60 print("In einem Jahr kommen", Bilder_pro_Jahr, "Bilder zusammen") print("Deshalb benötigt man", grosse_Zahl / Bilder_pro_Jahr, "Jahre, bis man die größtmögliche Zahl in Lua erreicht hat.") Texte sind ein weiterer Typ. Dieser Typ nennt sich string. Das ist das englische Wort für eine lange Aneinanderreihung von Dingen. „A string of pearls“ ist beispielsweise eine Perlenkette (und ein bekanntes Musikstück von Glen Miller.) Texte betrachtet der Programmierer also als eine Kette von Buchstaben, Zahlen und Satzzeichen. Strings werden in einfache oder doppelte Anführungszeichen gesetzt. Beide haben genau dieselbe Funktion. 'Ich bin ein String' "Ich bin auch ein String" Strings müssen mit denselben Anführungszeichen anfangen und aufhören. Das jeweils andere Anführungszeichen kann dann im String als Teil des Textes verwendet werden. 'Ich bin ein unvollständiger String" "Ich bin ein 'besonderer' String" Man darf nur die simplen Anführungszeichen verwendet, nicht die schönen für den gepflegten Schriftsatz. Das ist unproblematisch, wenn man Code direkt in einem dafür vorgesehenen Editor schreibt. Der setzt automatisch die erlaubten Anführungszeichen. Aber wenn man eine Textverarbeitung benutzt, dann kann man sich falsche Anführungszeichen einhandeln. Zum Beispiel die bei deutschen Texten gebräuchlichen Anführungszeichen unten. Die versteht der Lua-Interpreter nicht! „Ich führe zu einer Fehlermeldung!“ Aber auch die oben stehenden Anführungszeichen sind in Textverarbeitungen oft die falschen. Nämlich die schnörkeligen, leicht schräg gestellten. Die sehen den simplen Anführungszeichen zwar sehr ähnlich. Aber sie haben einen ganz anderen Buchstabencode. Deshalb funktionieren die nicht im Programmcode. Mit der Funktion type(), die in Lua enthalten ist, kann man den Typ eines Elements prüfen. Diese Funktion gibt einen String zurück, der den Typ des angegebenen Elements als Wort enthält. Mit print() kann ich diesen Typ daher auch ausgeben: print(type(a)) Ergibt als Antwort nil Das ist der englische Ausdruck für: nix Wenn man der Variablen a keinen Wert zugewiesen hat, dann hat sie einen Inhalt vom Typ nil. Das ist ein ungewöhnliches Konzept, welches man so in anderen Programmiersprachen nicht findet. In anderen Sprachen hätte es eine Fehlermeldung gegeben die lautet, dass die Variable noch gar nicht definiert ist. In Lua ist alles, was nicht anderweitig definiert wurde, automatisch nil a = true print(type(a)) -- ergibt die Antwort 'boolean' a = 1 print(type(a)) -- ergibt die Antwort 'number' und a = '1' print(type(a)) -- ergibt die Antwort 'string' Es gibt noch mehr Typen. Aber auf die möchte ich später eingehen. Mir ist für den Anfang etwas anderes wichtiger: Es gibt verschiedene Typen, weil man damit im Programm verschiedene Dinge anstellt. numbers kann man addieren. strings kann man aneinanderfügen. Und booleans kann man logisch verknüpfen. Das lässt sich nicht beliebig mischen. Der Ausdruck "Hallo" + 123 ist unsinnig und führt entsprechend in Lua zu einer Fehlermeldung. Das + Zeichen ist nur für die mathematische Addition. Es wird nicht dafür benutzt, Textteile zusammenzusetzen. Um Textteile zusammenzusetzen, benutzt man kein +, sondern zwei Punkte: print("zusammen" .. "schreiben") -- ergibt 'zusammenschreiben' Weil man Typen unterschiedlich behandeln muss, war es notwendig, dass ich euch an dieser Stelle ein paar von diesen Typen vorstelle. Und die sehen nur am Anfang furchterregend aus. Eigentlich sind die alle sehr nett. Wirklich. Die tun euch nichts. Vorausgesetzt, ihr behandelt sie richtig
  14. Schleifen - Teil 2 Es gibt eine zweite Art, Code in einer Schleife wiederholt auszuführen: Die while ... do Schleife. Hinter while erwartet Lua dabei ein true oder false. Dieses true oder false kann das Ergebnis eines Ausdrucks sein. Meistens handelt es sich dabei um das Ergebnis eines Vergleichs. a = 0 while a < 5 do print(a) a = a + 1 end print("fertig!") In der ersten Zeile wird für den Platzhalter a ein Wert festgelegt. Diese Platzhalter nennt man übrigens Variable und es wird Zeit, dass ich den richtigen Begriff verwende. Sie heißen deshalb Variable, weil ihr Wert veränderbar ist. Er kann variiert werden. Also: Die erste Zeile setzt die Variable a auf den Wert 0 Das while am Anfang der zweiten Zeile heißt übersetzt so etwas wie "solange". Dahinter steht ein Ausdruck, der entweder wahr oder falsch sein kann. Solange a < 5 wahr ist, also der Ausdruck das Ergebnis true hat, werden die nachfolgenden Zeilen bis zum end immer wieder ausgeführt. Hinter den Ausdruck, der geprüft werden soll, gehört noch das Schlüsselwort do, zu deutsch: tu es. Damit erkennt Lua, dass hier der gesamte Ausdruck, welcher geprüft werden soll, zu Ende ist. (Andere Programmiersprachen nutzen für diesen Zweck Klammern.) Die dritte und vierte Zeile werden also nur ausgeführt, wenn a kleiner als 5 war. In der dritten Zeile wird der Wert von a ausgegeben. Und in der vierten Zeile wird zum Wert von a eine 1 hinzu addiert. Das Ergebnis wird als neuer Wert wieder in a gespeichert. Wenn a vorher den Wert 0 hatte, dann steht jetzt in a eine 1. Diesen Trick findet man in allen Programmiersprachen. Man kann eine Variable auslesen. etwas addieren (oder die Zahl auf andere Weise ändern) und das Ergebnis wieder in der selben Variable speichern. Das ist so praktisch, dass es in anderen Programmiersprachen sogar besondere Schreibweisen dafür gibt. Aber leider nicht in Lua. Da muss man wirklich a = a + 1 schreiben, wenn man den Wert von a um 1 erhöhen will. Das end in der fünften Zeile heißt, dass der while-Block zu Ende ist. Damit kehrt das Programm zurück zur zweiten Zeile und prüft erneut, ob a kleiner als 5 ist. Da a jetzt den Wert 1 hat, ist es noch immer kleiner als 5. Also wird erneut in der dritten Zeile der Wert von a ausgegeben. Und in der vierten Zeile wird zum Wert von a wieder 1 hinzu addiert. Das wäre also 1 + 1. Dieser neue Wert 2 wird in a gespeichert. Dann wird wieder geprüft, ob a kleiner als 5 ist. Das passiert solange, bis a diese Bedingung nicht mehr erfüllt. Dann springt Lua ans Ende des while-Blocks und macht mit der sechsten Zeile weiter. In der steht, dass Lua den Text fertig! ausgeben soll. Versucht mal vor dem Ausprobieren dieser Zeilen möglichst genau einzuschätzen, was im Ausgabefenster stehen wird. Und wenn das tatsächliche Ergebnis nicht 100%ig mit eurer Vermutung übereinstimmt, dann zuckt nicht einfach mit den Achseln und denkt: 'Na, immerhin. War doch fast richtig.' Sondern schaut ganz genau hin, was anders ist. Und macht euch Gedanken darüber, warum es anders ist. Das ist die Methode, mit der man Programmieren lernt. Alles, was man ins Skript schreibt, hat ganz eindeutige und sehr logische Konsequenzen. Ohne Ausnahme! Deshalb ist jede Abweichung im Verhalten ein guter Hinweis auf das, was man zur Zeit noch falsch versteht. Und je genauer man diese Abweichung studiert, desto besser erkennt man, wo der eigene Denkfehler sitzt. Ihr könnt auch ausprobieren, was sich ändert wenn man die dritte und vierte Zeile vertauscht. Macht das einen Unterschied? Wenn ja, welchen? Und warum? Viel Spaß beim Probieren und Studieren :-)
  15. Ich verstehe, dass das für euch viel Geld ist. Aber es ist gerechtfertigt. Das müssen Könner machen und die bekommen zurecht gutes Geld für ihr Fachwissen und ihre Leistung. Wenn du das selber machst, dann wird die Sache nur noch teurer. Denn das, was du programmierst, wird die Prüfung nicht bestehen. Und dann hast du zu den Kosten für die Änderung obendrein die Kosten für die Prüfung deines Versuchs. Glaub mir, Wüstenfuchs: Das ist nur was für Profis.
  16. Ganz bestimmt nicht. Lua ist eine weit verbreitete Skriptsprache, die in vielen Bereichen eingesetzt wird. Da ist es nicht verwunderlich, dass man sich auch an solcher stelle findet. Aber ich möchte dir ganz dringend davon abraten, selbst in diese Steuerungssoftware einzugreifen! Das wäre verantwortungslos, weil du überhaupt nicht abschätzen kannst, welche fatalen Folgen ein Fehler haben könnte. Bitte, überlass das ausschließlich den Profis! Die bekommen aus gutem Grund Geld für ihre Arbeit.
  17. @Wüstenfuchs Statt dich in Geduld zu üben, lies doch bitte noch ein- (oder zwei-)mal das, was ich bisher geschrieben habe. Du hast da manches viel zu flüchtig gelesen und nicht richtig durchschaut. Und probiere ruhig fleißig weiter. Denn nur so erkennst du - wie eben gerade - wo noch Missverständnisse sitzen.
  18. Die darfst du nicht einfach so dazwischen schreiben. Wie soll Lua denn wissen, was das sein soll? Für solche Zwecke gibt es in Lua die Möglichkeit, eine Zeile als Kommentar zu kennzeichnen. Das habe ich aber noch nicht erklärt. Nein, das wird auch dann nicht funktionieren. Ich habe das, was du für dein Vorhaben benötigst, in meinem Tutorial noch nicht erklärt. Außerdem musst du bei den Schreibweisen besser aufpassen. Du schreibst zum Beispiel print mit einem großen P am Anfang. Lua kennt aber keine Funktion Print(). Es kennt nur eine Funktion print()
  19. Wo hast du die Idee her, dass du in deinem Skript einfach das Wort Funktion schreiben könntest? Noch dazu groß geschrieben und in der deutschen Schreibweise mit einem k? Weil dieses Wort in der zweiten Zeile unsinnig ist, stellt der Lua Interpreter in der Zeile 3 fest das etwas nicht stimmen kann. Deshalb meldet er, dass in der Nähe des a in Zeile 3 ein Syntaxfehler vorliegen muss.
  20. Die Wahrheit, die ganze Wahrheit und nichts als die Wahrheit Programmierer stellen sich immer wieder dieselbe Frage: "Kann das wahr sein?" Und Computer kennen darauf nur eine klare Antwort: Etwas ist entweder wahr oder falsch. Im Englischen heißt es true bzw. false und das sind die Schlüsselworte, welche dafür in Lua verwendet werden. Jeder Vergleich, den man in Lua schreibt, hat true oder false als Ergebnis. Probiert es aus! Schreibt in Lua Demo print(2 > 1 ) Das bedeutet 2 ist größer als 1. Drückt auf "run" und im unteren Fenster wird true stehen .Und wenn ihr es mit print(2 < 1) versucht, was für 2 ist kleiner als 1 steht, dann ist das Resultat false. Folgende Vergleiche gibt es in Lua: a > b -- a ist größer als b, kurz: a größer b a >= b -- a ist größer als b oder gleich b, kurz a größer gleich b a < b -- a kleiner b a <= b -- a kleiner gleich b a == b -- a gleich b a ~= b -- a ist nicht gleich b, kurz: a ungleich b Beim letzten Vergleich steht eine Welle, Tilde genannt, vor dem = Zeichen. Diese Welle bekommt man mit AltGr und der + Taste (im großen Tastaturteil. Nicht das Plus im Zahlenblock.) Beim vorletzten Vergleich achtet bitte auf das doppelte Gleich-Zeichen. Man muss bei der Programmierung nämlich zwei Dinge klar unterscheiden: Manchmal möchte man prüfen, ob etwas gleich ist. Dann benutzt man in Lua das doppelte = Zeichen. Und manchmal möchte man etwas gleichsetzen. Dann muss man in Lua das einfache = Zeichen verwenden. a == 5 -- prüft, ob a den Wert 5 hat a = 5 -- setzt a auf den Wert 5 Auf beiden Seiten des Vergleichs können auch Rechenoperationen stehen. Ich kann also prüfen, ob a == 2 + 3 oder ob 2 * a <= b + c ist. Meist geht es aber um ganz banale Fragen wie die, ob ein Zähler schon einen bestimmten Wert erreicht hat.
  21. Da scheint ein unsichtbares Zeichen in Zeile 3 zu stecken. Eins, welches der Interpreter nicht versteht. Kopiere diese Codebeispiele nicht aus meinen Postings! Erstens können durch die Textformatierung dabei Zeichen mit kopiert werden, die der Interpreter nicht schluckt. Und zweitens lernst du nichts dabei. Wirklich überhaupt nichts. Wenn du wirklich lernen willst, wie man Lua Code schreibt, dann Lies meine Erklärungen aufmerksam durch Bemüh dich, alles im Detail zu verstehen Geh auf die Lua Demo Seite und schreibe dort aus dem Kopf das Skript rein, was du ausprobieren möchtest. Dazu musst du dir mein Skript nicht merken. Wenn du verstanden hast, wie man es machen muss, dann kannst du das Skript für den Zweck auf der Demo Seite selbst entwerfen. Dieser eigene Entwurf ist der Weg, über den du es lernen musst. Der zeigt dir, wo du noch Verständnislücken und Unsicherheiten hast. Wenn du nur kopierst und einfügst, dann merkst du das nicht. Dann bildest du dir nur ein, du könntest es schon.
  22. Das höre ich sehr gerne, denn genau das ist mein Ziel. Deshalb lasse ich auch für den Anfang so viele, eigentlich wichtige Informationen weg. Es erleichtert meines Erachtens den Zugang. Und wer schon Erfahrung hat, der wird in den Beispielen vieles selbst erkennen. Zum Beispiel, dass man in Lua Variablen verwenden kann, ohne sie je deklariert zu haben. Und dass es egal ist, welcher Datentyp darin gespeichert wird. Das weiß ich zu schätzen, Andy. Danke :-)
  23. @h.w.stein-info Du musst nichts installieren. In V5 wird alles enthalten sein. Und bis dahin kannst du auf der Lua Demo Seite direkt alles ausprobieren. Einfach anklicken und dort ins Fenster deine kleinen Lua Programme eintippen. Dann unter dem Fenster auf den Knopf "run" klicken und das Ergebnis anschauen.
  24. Ich freue mich, dass mein Tutorial gut ankommt. Aber für manche wird das zu schwafelig sein. Wer Englisch gut versteht und nur mal schnell wissen will, wie Lua funktioniert, der ist mit diesem einstündigen Video von Derek Banas gut bedient. Ich mag seine Videos sehr. Sie sind gut strukturiert und gut zu verstehen:
  25. Schleifen - Teil 1 Die Tochter hat gerade Multiplikationsreihen in der Schule. Ich soll ihr beim Lernen helfen. Aber das ist für mich schon sooo lange her. Außerdem konnte ich mir die Siebener-Reihe nie wirklich merken. Und so schwere Sachen wie die Elfer-Reihe hatten wir früher gar nicht in der Schule. Zum Glück habe ich einen Computer, der mir alles ausrechnen kann. Damit müsste ich doch eine Art Spickzettel hinkriegen? Multiplikation kann ich ja schon: print(1 * 1) Aber das reicht nicht. Der Lehrer will das immer in ganzen Sätzen hören und nicht nur das Ergebnis. Also muss print() einen Text ausgeben. 1 mal 1 ist 1 2 mal 1 ist 2 und so weiter. Deshalb muss ich zuerst lernen, wie ich print() dazu bringe, ein Wort als Wort zu erkennen. Im letzten Kapitel hatte print() ja zum Beispiel Quadrat(12) als Funktionsaufruf erkannt. Was macht man nun, wenn print() zum Beispiel das Ergebnis von Quadrat(12) ist 144 schreiben soll? Man setzt das, was als Text ausgegeben werden soll, in Anführungszeichen print( "das Ergebnis von Quadrat(12) ist", Quadrat(12) ) Beachtet bitte, dass zwischen dem Text und dem Funktionsaufruf ein Komma steht. Dieses Komma trennt zwei Argumente voneinander. Diesmal bekommt print() mehrere Bausteine und setzt sie selbständig zu einer Textzeile zusammen. Dabei wird anstelle des Kommas ein Tabulatorsprung gesetzt. Deshalb steht die 144 bei der Ausgabe etwas weiter weg. Versucht es mit einer einfachen Multiplikation: print(1, "mal", 1, "ist", 1*1) Hurra, das funktioniert! Mit mehreren Kommas und einem Gemisch aus Zahlen und Texten. Das eröffnet ganz neue Möglichkeiten. Die Abstände sind bei der Ausgabe sehr groß, aber das soll egal sein. Es geht jetzt nicht um Schönheit. Und man darf die Kommas nicht einfach weglassen, weil unterschiedliche Bausteine (Zahlen, Texte und Berechnungen) zu einem Text zusammengesetzt werden sollen. Man muss die Bausteine also voneinander trennen. Das muss jetzt in eine Funktion, die ihr diesmal mit zwei Argumenten aufrufen könnt. Nämlich mit den beiden Zahlen, die multipliziert werden sollen. Also benötigt ihr in der Funktionsdefinition diesmal zwei Platzhalter. Und die werden ebenfalls mit einem Komma voneinander getrennt function Multiplikation(Zahl1, Zahl2) print(Zahl1, "mal", Zahl2, "ist", Zahl1 * Zahl2) end Sehr gut. Jetzt könnt ihr die Funktion mit jedem Zahlenpaar aufrufen Multiplikation(6, 7) Auch hier ist das Komma wieder der Trenner zwischen den beiden Werten. (Dezimalzahlen werden in allen Programmiersprachen mit einem Dezimalpunkt geschrieben!) Jetzt muss ein Weg her, um die Funktion zehnmal hintereinander aufzurufen und dabei als ersten Parameter die Zahlen 1 bis 10 zu übergeben. Damit eine komplette Siebener-Reihe ausgegeben wird. Eine Methode ist die for ... do Schleife. Sie ist ähnlich wie eine Funktion aufgebaut. Aber die Schlüsselwörter sind for, do und - wie bei der Funktion - end for Zahl = 1, 10, 1 do print(Zahl) end gibt nacheinander die Zahlen 1 bis 10 aus. Diese Schleife beginnt damit, dass sie die erste der drei Zahlen an den Platzhalter übergibt, den ich Zahl genannt habe. Damit wird dann - wie bei einer Funktion - alles bis zum end durchgeführt. Aber anders als eine Funktion startet die Schleife im Anschluss gleich noch einmal. Dabei wird die dritte Zahl zu dem, was im Platzhalter steht, hinzu addiert. Dann läuft der ganze Block erneut durch. Und das immer wieder, bis der Platzhalter den zweiten Wert erreicht hat. for Zahl = 1, 10, 1 do heißt also: Mach alles folgende mit allen Zahlen von 1 bis 10 bei einem Zählabstand von 1. for x = 2, 20, 2 do ginge also auch, wenn man nur gerade Zahlen verwenden will. Und ebenso funktioniert for a = 1, 2, 0.1 do wenn man kleinere Abstände braucht. Den gebräuchlichsten Abstand 1 muss man nicht zwingend angeben. Daher kann man den ganzen Code für die Siebener-Reihe so schreiben: function Multiplikation(n1, n2) print(n1, "mal", n2, "ist", n1 * n2) end for i = 1, 10 do Multiplikation(i, 7) end Beachtet bitte, dass die for … do Schleife im Aufbau zwar wie eine Funktionsdefinition aussieht, aber im Gegensatz zur Funktionsdefinition sofort ausgeführt wird! Ich habe in diesem letzten Beispiel gebräuchlichere Namen für die Platzhalter verwendet. Den Buchstaben n für eine ganzzahlige Zahl. Das n steht für "number", zu Deutsch: Nummer. Und den Buchstaben i für den Wert, der in der Schleife raufgezählt wird. Das i steht in dem Fall für "increment", zu Deutsch: raufzählen. Diese Namen werdet ihr oft in fertigen Skripten sehen, deshalb wollte ich euch damit vertraut machen. Aber sie haben keine Funktion, wie ihr an meinen ersten Beispielen sehen konntet. Sie werden einfach nur häufig verwendet. Für den Anfang ist es besser, aussagekräftige Namen zu verwenden. Dann wisst ihr morgen noch, was ihr da heute hingeschrieben habt und warum.
×
×
  • Neu erstellen...