Jump to content

Goetz

Mitglieder
  • Gesamte Inhalte

    6150
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Goetz

  1. Genau den Fehler hatte ich - ungeübt in MBS-Dingen - auch zunächst gemacht. Man klickt ganz selbstverständlich mitten auf solche Knöpfe und erwischt dann in diesem Fall nur das Schriftfeld. Aber Kai schrieb von dem weiteren Knopf (einem "Symbol auf der Unterseite"), der dann auftaucht. Und der taucht erst dann auf, wenn man einen Zug aus dem Bahnhof losgeschickt und so die ganze Geschichte ins Rollen gebracht hat. Also denke ich, dass er die drei Knöpfe schon ein- oder zweimal korrekt bedient haben muss. Umso mehr irritiert dann die Frage, wozu die Knöpfe 1, 2 und 3 wären ...
  2. Ich war informiert.
  3. Nein, das hatten wir noch nicht. Danke für den Hinweis Stimmt. Die müssen nicht erst eingebunden werden. Die Standardbibliotheken sind in Lua immer präsent. Du benötigst diese Form vor allem dann, wenn die Schlüssel in deiner Tabelle Namen sind und du dennoch die ganze Tabelle in einem Rutsch abfragen willst. Im MBS könnte eine Tabelle zum Beispiel die Namen aller Gleisstücke von Gleis 1 im Bahnhof "Musterdorf" als Schlüssel verwenden unter dem gespeichert wird, ob das Gleis besetzt ist oder nicht. Um zu erfahren, ob Gleis 1 frei ist, könntest du diese Tabelle mit in pairs() abklappern und schauen, ob dort für eins der Gleise ein "besetzt" registriert ist. In einer anderen Software kann es praktisch sein, die Signalnummern einer Anlage als Index in einer Tabelle zu verwenden. Dann hat man keine lückenlose Nummerierung der Einträge (weil manche Nummern anderweitig vergeben wurden.) In diesem Fall kann man ebenfalls nur mit in pairs() die Tabelle abarbeiten, aber nicht mit in ipairs() Selbstverständlich gibt es in beiden Fällen viele andere Wege, um zum selben Ziel zu kommen. Aber diese "Schlüssel/Wert"-Paare sind praktisch. Gerade dann, wenn man die Tabelle nicht der Reihe nach abarbeiten kann und trotzdem beide Dinge benötigt.
  4. Hier sind die wichtigsten Beispiele aus dem Video noch einmal zum Nachlesen. Manche habe ich um nützliche Hinweise ergänzt. -- Escape Sequenzen -- \a bell -- \b back space -- \f form feed -- \n newline -- \r carriage return -- \t horizontal tab -- \v vertical tab -- \\ backslash -- \" double quote -- \' single quote -- \[ left square bracket -- \] right square bracket -- zwei Bindestriche kennzeichnen in Lua einen Kommentar Beispiel = "Die Version 5 des \"3D Modellbahn Studios\"\n stellt 'Lua' Befehle zur Verfügung" print(Beispiel) Beispiel1 = 'Die Version 5 ' Beispiel2 = 'des "3D Modellbahn Studios" ' Beispiel3 = "stellt 'Lua' Befehle zur Verfügung", print(Beispiel1 .. Beispiel2 .. Beispiel3) Beispiel = { 'Die Version', 'des "3D Modellbahn Studios"', "stellt 'Lua' Befehle zur Verfügung", Version = 5 } Muster = "%s %d %s %s" Text = Muster:format(Beispiel[1], Beispiel.Version, Beispiel[2], Beispiel[3]) print(Text) -- Muster:format(...) ist die verkürzte Schreibweise von: string.format(Muster, ...) Beispiel = 'des "3D Modellbahn Studios" ' Anfang, Ende = string.find(Beispiel, "3D") -- vereinfacht: Beispiel:find("3D") print("Die Zeichenkette '3D' im String 'Beispiel2' \nbeginnt bei Zeichen "..Anfang.. " \nund endet bei Zeichen "..Ende) Beispiel = 'des "3D Modellbahn Studios" ' Teiltext = string.sub(Beispiel, 9, 25) -- vereinfacht: Beispiel:sub(9, 25) print(Teiltext) for i = 1, 10, 1 do Formel = string.format("%2d * %d = %2d", i, 3, i*3) print(Formel) end -- die 2 im %2d füllt einstellige Zahlen mit Leerzeichen auf zwei Stellen auf -- Dadurch steht in der Ausgabe alles fein säuberlich untereinander.
  5. Endlich kann ich euch ein weiteres Video anbieten. Die Sprachaufnahme ist leider sehr träge geraten. Aber besser kriege ich es derzeit nicht hin. Dafür habe ich mich bemüht den Inhalt zu strukturieren. Und weil das Video recht lang ist, habe ich bei YouTube im Kommentar Sprungmarken hinterlegt. Das Video ist Anfängertauglich, denn es setzt kein Vorwissen voraus. Das heißt aber nicht, dass der Stoff einfach ist. Ich bin überzeugt, dass "Anfänger" ebenso gut Schweres lernen können wie Fortgeschrittene. Es muss nur auf ihrem aktuellen Wissensstand aufbauen. Im Video geht es um "Strings". Die werdet ihr im MBS später mal benötigen. Weil alle Namen, die ihr auslest, Strings sind. Als "String" bezeichnen Programmierer ein Stück Text. Egal, ob es sich dabei um einen Namen handelt oder um eine Nachricht. Wer nicht alles auf Anhieb versteht, der weiß zumindest später, wo er etwas zu dem Thema findet. Das Video reißt die verschiedenen Themen nur an. Es vermittelt ein prinzipielles Verständnis für die Materie, kein "alles, was man wissen muss". Es ist nämlich Humbug, alles auf einmal erklären zu wollen. Damit erreicht man nur, dass der Lernende am Ende überhaupt nichts mehr weiß. Es ist viel wichtiger, den Kern zu verstehen. Dann holt man sich zu gegebener Zeit selber das, was man noch braucht. Viel Spaß beim Lernen und Experimentieren!
  6. Erzähl bitte mal in Stichpunkten, wo es bei dir zur Zeit hakt. Dann kann einer, der dir helfen möchte, besser einschätzen wieviel Zeitaufwand vonnöten ist und ob er selbst genügend Erfahrung hat, um dir die richtigen Tipps zu geben.
  7. während der Zug die Kurve von Holzhausen durchfährt.
  8. Ich glaube, es handelt sich da um Product Placement. Seine Postings sind werbefinanziert.
  9. Die Software ist unter anderem ein interessantes Beispiel für: "Wie baut man ein einfaches, ansprechendes und funktionales User-Interface"
  10. Goetz

    kleine N-Anlage

    Im Online-Katalog unter "Neu" gleich an dritter Stelle: "Anlage4" Man erkennt den Überblick aus dem zweiten Bild oben sofort wieder.
  11. Goetz

    Hogwarts 1 versuch

    Ein grandioser Fehler vom POTUS, den mein Lieblings Showmaster Stephen Colbert natürlich zu würdigen wusste. Hehe Dann freue ich mich, dass ich mit meiner kleinen Aufzählung etwas Gutes beitragen konnte.
  12. Goetz

    Hogwarts 1 versuch

    Für den Fall, dass der Satz ernst gemeint war: Die Musik zu den Harry Potter Filmen wurde von John Williams komponiert (und ist gewiss nicht Gema-frei!) Vom selben Komponisten stammen auch die Musiken zu Star Wars Jurassic Park Schindlers Liste ET Saving Private Ryan Indiana Jones Der Weiße Hai und einer sehr langen Liste weiterer bekannter Filme. Aber wahrscheinlich war die Frage nur rhetorischer Natur?
  13. kam möglicherweise auch ganz unmerklich der Wechsel von 32 bit zu 64 bit? Das wäre dann eine Erklärung, warum der Fehler erst jetzt auftrat. Laut Neo besteht er ja nur in der 64-bit Version.
  14. That's an interesting concept for a switch point. So simple, yet effective. Thanks for sharing
  15. Vielen Dank für die anschauliche Demonstration Und weil sowohl ein E als auch ein e als wahr gewertet wird, nicht jedoch ein A, ist es tatsächlich wohl so wie ihr beide sagt: Es wird als E in einer floating point Zahl interpretiert.
  16. Aber dann besteht der Wert doch nicht nur aus dem Großbuchstaben E Und wenn das MBS eine Zahl erwartet, weil dieser Typ durch die Initialisierung vorgegeben wurde, dann wird das MBS doch sicher kein einzelnes E als floating point number interpretieren? Also, im Augenblick bin ich mir noch ziemlich sicher dass das eine nichts mit dem anderen zu tun hat.
  17. Nein, damit wird es definitiv nichts zu tun haben.
  18. Die Anlage heißt nicht wie du schreibst, sondern To1906-01 Aber nach fünf vergeblichen Anläufen mit dem aus deinem Posting kopierten Anlagennamen habe ich sie nun gefunden.
  19. Hast du das überprüft? Oder ist das nur eine Annahme, weil es "einfach nicht sein kann, dass die Variable den Wert E hat"?
  20. In solch einem kurzen Video steckt in meinem Fall ein ganzer Tag Arbeit. Ich würde sicher gerne mehr machen, weil mir die Wirkung wohl bewusst ist. Aber ich habe nicht immer die Energie dafür.
  21. Da ich gerade für jemanden ein kurzes Video erstellt habe, welches im Kern denselben Aspekt behandelt wie das Kapitel "Tabellen - Teil 6" in dieser Reihe hier, möchte ich das Video auch hier anbieten:
  22. Schleifen - Teil 4 (für Fortgeschrittene) Die for … do Schleife kann man auch verwenden, um ganze Tabellen auszulesen: Beatles = {"John", "Paul", "George", "Ringo"} for i = 1, 4 do print("Beatle Nummer "..i.." ist "..Beatles[i]) end In Lua gibt es für diesen Zweck aber eine eigene, bessere Methode. Sie heißt in pairs(), weil sie paarweise den Index und den Inhalt zum Index liefert: Beatles = {"John", "Paul", "George", "Ringo"} for key, value in pairs(Beatles) do print("Beatle Nummer "..key.." ist "..value) end Die Namen der beiden Variablen für Index und Inhalt sind natürlich frei wählbar. Gebräuchlich sind die Buchstaben k und v für key (= Schlüssel) und value (= Wert). Deshalb habe ich im obigen Beispiel zum besseren Verständnis die Worte key und value gewählt. Die in pairs() Methode liefert alle Schlüssel/Wert Paare zurück. Auch solche, bei denen der Schlüssel keine Zahl, sondern ein String ist: Beatles = {John = "Gitarre", Paul = "Bass", George = "Gitarre", Ringo = "Schlagzeug"} for k, v in pairs(Beatles) do print(k.." spielt "..v) end Beachtet bitte, dass die Aufzählung nicht sortiert ist. Sie kann zufällig mit der Reihenfolge übereinstimmen, in der die Tabelle erstellt wurde. Aber sie muss es nicht und man weiß nie, in welcher Reihenfolge die Werte ausgelesen werden. Auch dann nicht, wenn die Indexe eine lückenlos nummerierte Aufzählung (wie im ersten Beispiel) sind. Aus diesem Grund gibt es eine zweite, sehr ähnliche Methode: in ipairs() Der Buchstabe i im Wort ipairs steht für „iterable“. Damit ist gemeint, dass nur lückenlos nummerierte Elemente der Tabelle ausgelesen werden und dass die Ausgabe sortiert stattfindet. Beatles = { "John", "Paul", "George", "Ringo", Ort = "Liverpool", Jahr = 1960, Manager = "Brian Epstein", Studio = "Abbey Road" } for k, v in ipairs(Beatles) do print("Schlüssel: "..k..", Wert: "..v) end Vergleicht die Ausgabe mal mit dem , was ihr bei in pairs() bekommt. Und lasst die in pairs() Version mehrfach laufen. Ihr werdet sehen, dass sich Reihenfolgen ändern, obwohl ihr das Skript zwischen den einzelnen Ausführungen nicht ändert. Der nummerierte Teil der Tabelle steht dabei für gewöhnlich vorne und ist sortiert. Aber garantiert ist auch das nicht! Wenn eine numerisch sortierte Aufzählung benötigt wird, dann muss man in ipairs() verwenden. Die Ausgabe von in ipairs() beginnt bei 1, endet bei der ersten Lücke in der nummerierten Liste und ignoriert namentliche Indexe. Beispiel = { Name = "Test", "Eins", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht" } Beispiel[6] = nil for k, v in ipairs(Beispiel) do print("Schlüssel: "..k..", Wert: "..v) end Eine fertige Methode für eine alphabetisch sortierte Aufzählung gibt es nicht.
  23. Schleifen - Teil 3 Schleifen gehören zu den wichtigsten Hilfsmitteln in der Programmierung. Sie nehmen einem viel Arbeit ab und gerade im Zusammenspiel mit einer Software wie dem 3D-Modellbahnstudio sind das genau die Arbeiten, welche überhaupt den Einsatz eines Skripts rechtfertigen. Nehmt zum Beispiel einen Schattenbahnhof mit zehn Gleisen. Ein eintreffender Zug soll in eins dieser Gleise einfahren. Dazu muss geprüft werden, welche Gleise noch frei sind, um dann eine Fahrstraße zu einem dieser freien Gleise zu legen. Zunächst muss zehnmal dasselbe getan werden. Die Prüfung, ob ein Gleis besetzt ist. Und bei jedem der zehn Durchläufe muss genau ein Parameter geändert werden: Die Gleisnummer. Für solche Zwecke ist die for ... do Schleife gedacht. Zwischen die Schlüsselworte for und do schreibt man den Namen einer Variablen, ihren Anfangswert, ihren Schlusswert und den Abstand, in dem man von Anfang bis Schluss zählen möchte. Also zum Beispiel so etwas: for Gleis = 1, 10, 1 do Beachtet bitte das = Zeichen hinter der Variablen für die Zuweisung der Werte und die Kommas für die Trennung von Anfangswert, Schlusswert und Schrittweite. In den folgenden Zeilen steht dann das, was mehrmals hintereinander ausgeführt werden soll und am Ende des Blocks steht, wie bei Lua üblich, das Schlüsselwort end. Ich weiß noch nicht, wie man in V5 prüft, ob ein Gleis besetzt ist. Deshalb bleibe ich bei meinem bisherigen Prinzip, dass ich ersatzweise einfach etwas Text ausgebe: for Gleis = 1, 10, 1 do print("Ich prüfe, ob Gleis "..Gleis.." besetzt ist.") end Wenn ihr diese drei Zeilen bei Lua-Demo eingebt und laufen lasst, dann steht im Ausgabefenster die Textzeile zehnmal untereinander. Dabei steht an Stelle der Variablen Gleis in jeder Zeile eine andere Nummer. Das ist die Zahl, welche bei jedem neuen Durchlauf der Schleife an die Variable Gleis übergeben wurde. Beim Programmieren muss man sehr genau auf das Verhalten solcher Methoden achten. Man muss zum Beispiel sehen, dass der Anfangs- und der Schlusswert beide enthalten sind. Die Schleife wird also mit den Zahlen 1 bis 10 inklusive durchgeführt. Muss man so etwas wissen? Nein! Muss man so etwas lernen? Auswendig können? Nein, auch nicht. Das ginge gar nicht. Es gibt zu viele Unterschiede, die man kennen müsste. Wenn man programmiert, dann muss man ein Bewusstsein für diese Fragen entwickeln. Dann muss man kurz innehalten und denken: "for ... do könnte sich so oder so verhalten. Es könnte inklusive oder exklusive zählen. Ich habe keine Ahnung, wie das bei Lua ist." Und dann probiert man es kurz aus. Wie einfach man solche Dinge testen kann, seht ihr im obigen Beispiel. Hier ist ein weiteres Beispiel: Was passiert, wenn man den Wert der Variablen innerhalb der Schleife ändert? Was bedeutet das für den nächsten Durchlauf? Keine Ahnung! Also probiere ich, was passiert: for Gleis = 1, 10, 1 do Gleis = Gleis + 2 print("Ich prüfe, ob Gleis "..Gleis.." besetzt ist.") end Werden jetzt Zahlen übersprungen? Oder werden alle Zahlen um 2 erhöht und dann ausgegeben? Das muss man nicht auswendig wissen. Das ist auch solange uninteressant, bis man einen Grund hat, den Wert der Variablen innerhalb der Scheife zu ändern. Aber dann will man es zuverlässig wissen. Also muss man sich jetzt bewusst machen, dass es zwei mögliche Verhaltensweisen gibt. Und man muss ausprobieren, welches von beiden das tatsächliche Verhalten ist. Programmieren ist nichts, was man auswendig lernt und dann nach Schema abspult. Programmieren ist eine sehr kreative Beschäftigung. Ständig muss man sich etwas einfallen lassen. Und immer mit der Neugier eines Detektivs betrachten, was genau passiert. Deshalb kann man Programmieren auch nur lernen, indem man sich aktiv damit beschäftigt.
  24. Das werde ich gerne tun. Vielen Dank für deine motivierenden Worte
  25. Im gewählten Beispiel sind natürlich beide gezeigten Methoden Blödsinn, weil man einfach den Wert direkt in den Text einbauen würde. Ich hoffe, dass niemand das missversteht. Ich wollte nur anhand möglichst simpler Beispiele die beiden Konstrukte vorstellen.
×
×
  • Neu erstellen...