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*aypy
xmin+xdot*bxox
ymax-ydot*byoy
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"
1n
While n<20000
/4+0.1
sin()t
cos()t
2*t
n+1n
WhileEnd
Print "stop"

Für den letzten, bei dem die Grafik-Ausgabe getestet wurde, dieses:

Local n,,a,b
ClrText
Print "start"
1n
While n<10
0
While <12
7.7*cos()*/12a
3.8*sin()*/12b
Plot a,b
approx(+0.01)
WhileEnd
n+1n
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