Noch zwei Dinge, die mir grade so aufgefallen sind:
Ihr solltet für euch selbst definieren, was passiert, wenn jemand eine ungültige Operation ausführen will. Also etwa durch 0 teilen oder von einem leeren Stack poppen. Ich für meinen Teil werde solche Befehle schlicht ignorieren und eine Warnmeldung ausgeben. Ähnliche Überlegungen sollte man auch für die Multiplikation mit 0 anstellen, weil sich der Stift anschließend nicht mehr bewegen bzw. nicht mehr rotieren lässt.
Außerdem wird natürlich auch die Farbe auf den Stack gepusht. Das hatte ich vorhin vergessen.
Hier ist meine Abgabe.
Einmal der Source-Code, eine Windows-, Mac- und Linux-Version.
Ich kann persönlich nur die Windows-Version testen, für die Mac- und Linux-Versionen ist keine Garantie von meiner Seite, dass sie starten werden.
Code ist in Java geschrieben.
Für den Grafikkontext wird OpenGL verwendet, als Wrapper lwjgl.
Der Source-Code kann einfach erweitert werden um zusätzliche Operationen hinzuzufügen.
Wird das Programm über die Kommandozeile gestartet wird das erste übergebene Argument, falls vorhanden, als Code kompiliert.
Weitere Argumente werden ignoriert.
Sollte kein Argument übergeben werden oder nicht über die Kommandozeile gestartet werden wird ein zufälliger Code von Länge 500 oder mehr Zeichen erzeugt.
Fehler werden, sofern nicht über eine Kommandozeile gestartet wurde, in die Datei Out.txt geschrieben.
An Operationen sind derzeit nur die vorgegebenen implementiert. Weitere Funktionen sollten jedoch sehr einfach selbst erstellt werden können.
Da das ganze Programm sehr Objektorientiert programmiert ist, und zudem in Java, ist es bei weitem nicht so effizient wie es sein könnte. Falls man einen sehr langen Code mit sehr vielen Zeichenaufrufen verwendet muss man eventuell die Heap-Size vergrößern.
Fenstergröße ist fix auf 640x480 eingestellt, kein Vollbild. V-Sync ist aktiviert, framerate zum Zeichnen liegt bei 10 FPS.
Mit Druck auf die Escape-Taste kann die Anwendung beendet werden.
Special thanks to lwjgl für die wundervolle API und die aktive Hilfe im Forum.
Hier ein Beispiel wie der (OpenGL) Compiler Initialisiert werden kann:
Und hier ein Beispiel wie eine einzelne Operation implementiert werden kann:
Sollte das Programm zufälligerweise nicht starten dann bitte ich darum, dass so schnell wie möglich Bescheid gegeben werden kann.
Bei Fragen und Anregungen bitte hier im Forum kontaktieren oder per Mail an: CornixMail@gmail.com
Edit:
Mir ist aufgefallen, dass ich einen ziemlich dummen Fehler in dem Algorithmus für den zufälligen Code habe. Allerdings stellt dies in dieser Situation kein Problem dar, ganz im Gegenteil, das Ergebnis wird durch den Fehler sogar noch verbessert.
Hier ist ein Screenshot von dem, von DFYX als Beispiel angegebenen, rekursiven Code-Schnipsels:
it seems that the JAWT/NSView API will intentionally not be included in OpenJDK 7
...
Zitat
the OS X port of LWJGL needs to be completely rewritten
...
So wie es aussieht, heist das also, dass dieses Programm auf Mac nicht laufen wird.
Zumindest nicht solange die nächste Version von lwjgl erscheint.
Ich werde mich trotzdem versuchen noch ein bisschen zu diesem Thema schlau zu machen, vielleicht lässt sich ein Weg finden, immerhin ist dieser Beitrag bereits ein Jahr alt.
Weird. Ich denke allerdings nicht, dass das ein generelles Problem von LWJGL ist. Schließlich laufen genug andere Programme, die auf die Bibliothek setzen, einwandfrei unter OS X (allen voran Minecraft)
Edit:
Es könnte ein Kompatibilitätsproblem von LWJGL mit Java 1.7 unter OS X sein. Evtl. mal mit dem vorinstallierten Java 1.6 probieren. Allerdings muss ich dafür deinen Code erstmal neu kompilieren.
Zuerst hatte ich nicht vor teilzunehmen, aber irgendwie hat mich das Thema dann doch gepackt Sehr schönter Contest! Echt toll, was man mit so einem kleinen Spielzeug für interessante Bilder erzeugen kann. Mein Programm steht im groben, einzig die Farben sind noch nicht integriert. Wenn mir bis zur Abgabe noch lustige Features einfallen, kommen die noch rein.
Nocheinmal eine Frage:
Ist die angegebene Syntax aus dem Eröffnungsbeitrag verpflichtend oder dürfen wir die Operationen umbenennen falls wir es für passend empfinden? Wenn wir sie umbenennen dürfen werden parametrisierte Eingaben erlaubt oder nur atomare Operationen?
Aufgrund der besseren Vergleichbarkeit würde ich doch eher vorschlagen, dass die eingesendeten Programme lediglich nur das besitzen, was vorgeschrieben wurde.
Gedacht war, dass eure Programme die oben genannte Syntax verstehen sollten. Ihr dürft sie natürlich um zusätzliche Befehle erweitern oder wegen mir auch zusätzlich eine zweite davon unabhängige Syntax unterstützen. Da sollen eurer Fantasie erstmal keine Grenzen gesetzt werden.