Programmierung » ClassPad 300 » Basic » Allgemeines
Allgemeines
... zur Programmierung des ClassPad
Der Classpad, kennt im Prinzip drei Darstellungsmodi: Vollbild, Teilbild und Teilbild mit Tastatur. Es gibt jedoch keine Funktion (ich hoffe Casio wird dies per OS-Update ändern) zu bestimmen in welchem dieser Modi sich das Programm befindet oder dieses zu ändern.
Abhilfe schafft da nur die ViewWindow-Einstellungen zu setzen wie man das wünscht, ClrText und Cls (in dieser Reihenfolge) zu verwenden. Dadurch ist oben das Grafik-Fenster und unten das Text-Fenster.
ViewWindow 1,155,1,-77,-1,1 ClrText Cls
Dann ist da noch das Problem mit den verschiedenen Koordinatensystemen: Der Text-Befehl zählt in Pixel ab der oberen linken Ecke. Der "normale" Line-Befehl zeichnet aber in dem eingestellten Koordinatensystem.
Abhilfen kann man sich, indem man sich ein Programm schreibt, dass die Koordinaten umrechnet. Dieses Programm nimmt Pixel-Werte und zeichnet eine Linie. Dabei ist es unerheblich, welches Koordinatensystem eingestellt ist. Wenn man die ViewWindow-Einstellungen von oben verwendet, dann kann man auch für Funktionen, die das "normale" Koordinatensystem verwenden (Plot, Line, Circle, ...) negative Y angeben. Der obere linke Punkt ist dann (1, -1).
Name: pLine Parameter: ax,ay,bx,by Local px,py,ox,oy xmin+xdot*axpx ymax-ydot*ay
py xmin+xdot*bx
ox ymax-ydot*by
oy line px,py,ox,oy
Etwas,was mir noch aufgefallen ist, als ich mit HexEdit etwas rumgemacht habe, ist daß es noch ein paar andere Datentypen gibt, die nicht im Handbuch stehen: z.B. INT, FILE, REG und FLT. Ich habe keine Ahnung um was es sich dabei handelt und im ClassPad Manager kann man diese Dateien nicht öffnen.
Bei den Koordinaten von GetPen handelt es sich um Absolute Koordinaten. Um diese relativ zur oberen linken Ecke des oberen Fensters umzurechnen muß (x - 2) und (y - 33) verwendet werden. Für das untere Fenster ist sind das (x - 2) und (y - 132).
Sie sollten es vermeiden, denn Doppelpunkt (:) zu verwenden. Da dieser mit 2 Bytes übersetzt wird (im Gegensatz um Wagenrücklauf (CR)), bringt der also keinen kleineren Code und die Übersicht nimmt zudem noch ab. Auch hat er ein Heimtückisches Wesen: Wenn man in einem Kommentar einen Doppelpunkt verwendet, gilt alles, was hinter dem Doppelpunkt steht wieder als Anweisung (was unter Umständen Fehler verursachen kann).
höhere Geschwindigkeit
In einigen Foren habe ich gelesen, daß der ClassPad angeblich Programme schneller ausführt, wenn man sie komprimiert. Das stimmt nicht. Der ClassPad-Prozessor kennt nur seine Befehle und ist kein Interpreter. Beim Speichern wandelt eine Unter-Routine den Quell-Text in den Code um, den der ClassPad-Prozessor versteht.
Hier der Beweis: Ausgangspunkt ist das einfache Programm
Print 99 Cls Print 88
Wenn man es ausführt sieht man 99 und 88 im Text-Fenster und das Grafik-Fenster wird gelöscht. Nun habe ich die MCS-Datei mit einem Hex-Editor geöffnet und dann den Code für das Cls (0xE82B) in den von ClrText (0xE910) geändert. Und siehe da: Man sieht nach dem Ausführen die 88. Das alles obwohl der Quell-Text immer noch der von oben (mit Cls) ist.
Geschwindigkeit optimieren
Der ClassPad ist nicht für schnelle (sondern genaue) Berechnungen ausgelegt. Das CAS-System ist um einiges langsamer
als eine einfache FP-Einheit. Wenn man dennoch ein relativ schnelles Programm braucht sollte man die approx()-Funktion
einsetzen. Dadurch berechnet immer noch das CAS-System die Werte, jedoch mit angenäherten Werten, was deutlich
schneller von statten geht. Dabei zu beachten ist aber, das ein approx eines Wertes der nicht weiter verwendet wird
nicht sinnvoll ist und wieder - wegen des (unnötigen) Aufrufs von approx - bremst.
Auch kann man Geschwindigkeit gewinnen indem man so viele lokale Variablen wie möglich verwendet.
Für die ersten beiden Tests wurde folgendes Programm verwendet:
Local n,,t ClrText Print "start" 1
n While n<20000
/4+0.1
sin(
)
t cos(
)
t 2*
t n+1
n WhileEnd Print "stop"
Für den letzten, bei dem die Grafik-Ausgabe getestet wurde, dieses:
Local n,,a,b ClrText Print "start" 1
n While n<10 0
While
<12 7.7*cos(
)*
/12
a 3.8*sin(
)*
/12
b Plot a,b approx(
+0.01)
WhileEnd n+1
n WhileEnd Print "stop"
Hier eine Tabelle mit Test-Ergebnissen. Die Tests wurden auf dem Manager gemacht, verhalten sich im ClassPad aber ähnlich.
| Variablentyp | Verwendung v. approx | Zeit für Durchläufe | ||
| 10000 | 20000 | 10 | ||
| global | keine | 19 | 37 | 26 |
| global | nur für ![]() |
20 | 40 | 31 |
| global | alle Ausdrücke | 21 | 42 | 38 |
| lokal | keine | 21 | 37 | 25 |
| lokal | nur für ![]() |
17 | 34 | 29 |
| lokal | alle Ausdrücke | 21 | 41 | 38 |
strToExp(x)
Mit dieser Funktion kann man Zeichenketten die Werte (und auch Formeln) enthalten, in Werte umwandeln. Doch durch einen Bug im ClassPad kann es zu einem Fehler kommen, wenn eine leere Zeichenkette übergeben wird.
Statt einfach:
InputStr s,"Einen Wert eingeben" strToExp(s)w
Muss erst der Wert, den der Nutzer eingegeben hat, auf den Inhalt geprüft werden:
InputStr s,"Einen Wert eingeben" StrCmp s,"",t If t=0 Then 'nichts eingegeben... (eingabe wiederholen lassen) IfEnd strToExp(s)w
px
ymax-ydot*ay
,t
ClrText
Print "start"
1
/4+0.1