Jump to content

Goetz

Mitglieder
  • Gesamte Inhalte

    5753
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Goetz

  1. Stimmt. Das wüsste ich auch zu gerne. Motiviere ich die Leser? Oder verschrecke ich sie eher?
  2. Lösungsvorschläge für das Affentheater In dieser Aufgabe war, genau wie in der ersten, gefordert, dass die Funktion etwas zurückgeben soll. Und zwar soll sie true zurückgeben, wenn beide Parameter true sind. Wenn also beide Affen grinsen. Und die Funktion soll auch dann true zurückgeben, wenn beide Parameter false sind. Wenn also beide Affen nicht grinsen. Das kann man genau so in die Funktion schreiben: function Schwierigkeiten(Kaya_grinst, Toto_grinst) if Kaya_grinst and Toto_grinst then return true end if not Kaya_grinst and not Toto_grinst then return true end return false end Und weil die erste und die zweite Bedingung dieselbe Konsequenz haben, kann man sie auch in einer Bedingung zusammenfassen. function Schwierigkeiten(Kaya_grinst, Toto_grinst) if (Kaya_grinst and Toto_grinst) or (not Kaya_grinst and not Toto_grinst) then return true end return false end Beachtet bitte, dass in der Mitte ein or steht und kein and. Denn es reicht ja, wenn einer der beiden geklammerten Ausdrücke wahr ist. Umgangssprachlich würde man in der Mitte ein "und" benutzen: "Wenn beide Affen grinsen gib ein true zurück und wenn beide nicht grinsen, dann auch." Aber logisch wäre ein and die falsche Wahl, weil es bedeutet, dass beide Bedingungen zugleich erfüllt sein müssen. Weil jetzt der gesamte Ausdruck hinter dem if genau das ergibt, was wir als Antwort brauchen, kann man ihn auch direkt zurück geben: function Schwierigkeiten(Kaya_grinst, Toto_grinst) return Kaya_grinst and Toto_grinst or not Kaya_grinst and not Toto_grinst end Dabei kann man sogar die Klammern weglassen, weil das and stärker bindet als das or und das not stärker bindet als das and. Das heißt: Zuerst führt Lua die beiden not Operationen durch, dann die and Operationen und zuletzt die or Operation. Diese Schreibweise ist aber furchtbar unleserlich. Die erste Version mit den zwei einzelnen Prüfungen finde ich in diesem Punkt deutlich angenehmer. Deshalb habe ich überlegt, ob man die nicht noch etwas vereinfachen kann. Nehmen wir den Fall, dass Kaya grinst. Dann ist das gewünschte Ergebnis true, wenn Toto_grinst true ist. Und es ist false, wenn Toto_grinst false ist. Wir können also auf die and Verknüpfung verzichten und gleich Toto_grinst zurückgeben, falls Kaya_grinst wahr ist if Kaya_grinst then return Toto_grinst end Und wenn man auch für den Fall etwas definieren möchte, dass die Bedingung hinter dem if nicht erfüllt ist, dann gibt es in Lua dafür das Schlüsselwort else (zu Deutsch: "andernfalls" oder "sonst") Und was soll andernfalls passieren? Was ist als Ergebnis gefordert, wenn Kaya nicht grinst? Falls Toto_grinst jetzt true ist, dann ist das Ergebnis false. Falls aber Toto_grinst auch false ist und somit beide Affen nicht grinsen, dann ist das Ergebnis true. Für den Fall, dass Kaya nicht grinst, ist das Ergebnis also das Gegenteil von Toto_grinst. Es ist not Toto_grinst function Schwierigkeiten(Kaya_grinst, Toto_grinst) if Kaya_grinst then return Toto_grinst else return not Toto_grinst end end Verblüfft? Man kann sich aber auch ganz vom genauen Wortlaut der Aufgabe lösen und stattdessen schauen, was wirklich gefordert ist: Wenn beide Affen dasselbe tun, dann ist das Ergebnis wahr, sonst nicht. Dann müsste es doch auch genügen, wenn man die beiden Parameter vergleicht. function Schwierigkeiten(Kaya_grinst, Toto_grinst) return Kaya_grinst == Toto_grinst end Das funktioniert, ist wirklich gut lesbar und außerdem schön schlank. Vielen Dank @Andy für diese sehr schöne Einsendung. Ich hoffe, dass mit dieser zweiten Aufgabe noch deutlicher wird, was schon bei der ersten Aufgabe durchschien: Dass es nicht darum geht, für eine Aufgabe eine richtige Lösung zu finden. Und sich diese Lösung dann für die Zukunft zu merken. Das funktioniert einfach nicht. Es geht vielmehr darum, möglichst viele dieser Lösungsbeispiele zu durchschauen. Zu erkennen, was da jeweils im Code passiert und warum das funktioniert. Je klarer euch anhand der verschiedenen Beispiele wird, wie die Mechanismen funktionieren, desto leichter wird es euch fallen Skripte zu entwerfen, die zu euren konkreten Bedürfnissen passen. Und deshalb mag ich diese kleinen Übungen so sehr. Man kann anhand dieser Beispiele wunderbar demonstrieren, welche Denkansätze alle zum Ziel führen. Man kann die verschiedenen Lösungsvorschläge mit der eigenen Lösung vergleichen und vielleicht an der einen oder anderen Stelle denken: "Ah - der Weg ist auch nicht schlecht." Und man kann unterschiedliche Methoden sehr bequem ausprobieren. Viel Spaß bei euren Entdeckungen. Die dritte Aufgabe folgt morgen.
  3. Affentheater Die zweite Aufgabe ist der ersten sehr ähnlich. Diesmal geht es um die Affen Toto und Kaya, welche uns gerne Schwierigkeiten bereiten. Aber man kann es ihnen ansehen. Wenn beide grinsen oder wenn keiner von beiden grinst, dann stecken wir in Schwierigkeiten. Grinst einer der beiden Affen, aber der andere nicht, dann haben wir nichts zu befürchten. Der Funktionsrahmen sieht so aus function Schwierigkeiten(Kaya_grinst, Toto_grinst) end Die Funktion wird wieder mit zwei Parametern aufgerufen werden, die beide entweder true oder false sein können. Und sie soll true zurückgeben, wenn wir in Schwierigkeiten stecken oder false, falls nichts zu befürchten ist. Das Prinzip ist also dasselbe wie bei der vorherigen Aufgabe. Die möglichen Kombinationen aus true und false sollen nur diesmal zu anderen Ergebnissen führen. Deshalb muss man die beiden Parameter anders auswerten als beim ersten Mal. Im Anhang findet ihr wieder ein Skript mit angehängter Testroutine für die Prüfung eurer Lösungsansätze. Ich würde mich sehr freuen, wenn ihr mir eure Lösungsvorschläge per PN schickt. Affentheater.zip
  4. Lösungsansätze zur Aufgabe "Ausschlafen" Wenn man mein Testskript unverändert in das Lua-Demo Fenster kopiert, dann bekommt man diese Antwort: Das Programm wird fehlerfrei ausgeführt. Es enthält keine Syntaxfehler. Aber die Funktion tut noch nicht das, was sie tun soll. Weil die Funktion völlig leer ist, gibt sie auch nichts zurück. Und genau das steht in der Auflistung. Viermal ergeben die Parameter nil. Sie sollten aber in drei Fällen true und in einem Fall false ergeben. Was passiert, wenn man in die Funktion einfach return true schreibt? function Ausschlafen(Werktag, Urlaub) return true end Dann ist das Ergebnis nur noch in einem von vier Fällen falsch. Mit return kann man also dafür sorgen, dass die Funktion beim Aufruf etwas zurück gibt. Jetzt muss man dafür sorgen, dass sie abhängig von den beiden Argumenten Werktag und Urlaub das richtige zurück gibt. Wenn Urlaub wahr ist, dann muss die Funktion ein true zurückgeben. Denn dann kann man ausschlafen. Das könnte so aussehen function Ausschlafen(Werktag, Urlaub) if Urlaub then return true end end Beachtet bitte, dass man in der if ... then Zeile keinen Vergleich Urlaub == true benötigt. Denn dieser Vergleich liefert nur das, was in Urlaub schon drin steht. Ist Urlaub wahr, dann ist auch das Ergebnis des Vergleichs wahr. Ist Urlaub falsch, dann ist auch das Ergebnis des Vergleichs falsch. Der zusätzliche Vergleich erfordert zusätzliche Rechenzeit, bringt aber keinen Nutzen. Wenn man diese Funktion verwendet, dann ist das Ergebnis in zwei von vier Fällen falsch. Die Funktion gibt nil zurück, wenn Urlaub nicht wahr ist. Ist Urlaub wahr, dann ist das Ergebnis der Funktion richtig. Nun kann man den Werktag prüfen: function Ausschlafen(Werktag, Urlaub) if Urlaub then return true end if Werktag then return false end end Damit ist das Ergebnis schon in drei von vier Fällen richtig. Nur wenn kein Urlaub und kein Werktag ist, lautet das Ergebnis noch nil. Denn weder die erste, noch die zweite Bedingung ist erfüllt. Deshalb gibt die Funktion nichts zurück. Sie soll in diesem Fall aber true zurückgeben, weil man ausschlafen kann wenn kein Werktag ist. function Ausschlafen(Werktag, Urlaub) if Urlaub then return true end if Werktag then return false end return true end In dieser Form besteht die Funktion alle 4 Tests Dazu muss man wissen, dass ein return in einer Funktion dazu führt, dass die Funktion komplett verlassen wird. Alles, was nach dem return kommt, ignoriert Lua wenn die return Zeile ausgeführt wird. Deshalb wird der Werktag nicht mehr geprüft, wenn Urlaub wahr ist. Und deshalb wird die letzte Zeile nicht mehr ausgeführt, wenn Urlaub falsch, aber Werktag wahr ist. Das bedeutet, dass bei dieser Konstruktion die Reihenfolge wichtig ist. Wenn man sie vertauscht, dann erhält man zum Teil falsche Ergebnisse. function Ausschlafen(Werktag, Urlaub) if Werktag then return false end if Urlaub then return true end return true end Bei dieser Reihenfolge würde der Urlaub nicht mehr geprüft, wenn Werktag wahr ist. Der Wecker klingelt jetzt auch im Urlaub an Werktagen. Denn die erste Prüfung hat an Werktagen zur Folge, dass die Funktion sofort mit einem return false verlassen wird Jetzt kehrt die Prüfung bei Werktag bitte einmal ins Gegenteil. Testet, ob kein Werktag ist. function Ausschlafen(Werktag, Urlaub) if not Werktag then return true end if Urlaub then return true end return false end Das heißt, dass jetzt true zurückgegeben wird, wenn kein Werktag ist. Und wenn kein Werktag ist, dann ist es egal, ob Urlaub ist oder nicht. Und false wird nur dann zurückgegeben, wenn weder die erste, noch die zweite Bedingung erfüllt ist. Bei dieser Variante sind die beiden Prüfungen austauschbar. Und außerdem kann man sie jetzt in einer Prüfung zusammenfassen. function Ausschlafen(Werktag, Urlaub) if not Werktag or Urlaub then return true end return false end Und weil der gesamte Term not Werktag or Urlaub jetzt genau das ergibt, was wir als Antwort haben wollen, muss man auch keine if-Prüfung mehr durchführen. Man gibt einfach das Ergebnis der logischen Verknüpfung zurück function Ausschlafen(Werktag, Urlaub) return not Werktag or Urlaub end Manche setzen den Term hinter dem return in Klammern, weil andere Programmiersprachen das so fordern. In Lua ist das nicht erforderlich, aber erlaubt. Ich weiß, dass das alles abstrakt und für Einsteiger eine harte Nuss ist. Deshalb poste ich in den nächsten Tagen weitere Übungen dieser Art. Denn diese kleinen Beispiele enthalten im Kern genau das, was man auch für die Nutzung von Lua im MBS brauchen wird. Funktionen, die anhand von Parametern eine Entscheidung treffen und dann das eine oder andere tun. Es wird vermutlich Funktionen geben, die fertig definiert sind und nur mit geeigneten Parametern aufgerufen werden. So wie das bekannte print(). Und es wird vermutlich die Möglichkeit geben, aus der EV eine Funktion aufzurufen, die man an anderer Stelle selbst definiert. Ich weiß das nicht. Aber es ist sehr naheliegend, dass es so sein wird. Deshalb halte ich es für sinnvoll euch anhand kleiner Beispiele das grundlegende Prinzip zu zeigen. Und ich hoffe natürlich, dass ihr auch ein bisschen Spaß dabei habt.
  5. @m.weber Danke für deine offenen Worte. Jetzt verstehe ich besser, warum ich angeeckt bin. Gruß Götz
  6. 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
  7. 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
  8. 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.
  9. 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 ;-)
  10. 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.
  11. Ich denke, es ist alles korrekt. Das Fenster schließt selbständig, weil das Programm beendet ist.
  12. Da bin ich ehrlich überfragt, weil ich für solche Tests ZeroBrane benutze. Oder einfach die Lua-Demo Seite
  13. 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.
  14. 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.
  15. 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.
  16. 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!
  17. 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
  18. 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 :-)
  19. 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.
  20. 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.
  21. @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.
  22. 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()
  23. 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.
  24. 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.
  25. 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.
×
×
  • Neu erstellen...