• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Neuer Solver

salzkammergut

Geomaster
Ein neuer Solver, der hoffentlich viele Wünsche erfüllt ist jetzt mit Rev. 387 auf berlios.de verfügbar.

Beim Design ging es mir um folgende Kriterien:
- abwärtskompatibel (die alte Syntax soll weiter funktionieren)
- keine Hänger (z.B. wenn man ;;; eingibt)
- bessere Fehlerbehandlung (mehr Meldungen)
- stark erweiterter Funktionsumfang (viele neue Funktionen)
- Schreibarbeit am PDA (im Feld) minimieren
- leicht durch neue Funktionen erweiterbar

Derzeit sind die Fehlermeldungen noch in Englisch, spätestens am nächsten Wochenende werde ich sie aber eingedeutscht haben.

Genauere Beschreibungen der neuen Features folgen in diesem Thread (wer's nicht erwarten kann soll inzwischen mal in den Source von Parser.java schauen).
 
OP
S

salzkammergut

Geomaster
Hier eine kurze Übersicht über die wesentlichsten Neuigkeiten (Beispiele folgen):

- Strings und Zahlen können fast überall frei gemischt werden. Je nach Kontext wird konvertiert

- Variablen können Strings und Zahlen speichern

Code:
A=2; E=1;COORD="N 47 2"E"."A 3*A A+4
COORD
         ergibt
#----Output----------
# N 47 21.266
#----------------------

- Globale Variable (beginnend mit $) merken sich ihre Werte über mehrere Aufrufe des Solvers

- Globale Variable werden automatisch mit "" vorinitialisiert und können daher in Berechnungen sofort verwendet werden ohne vorher einen Wert zuzuweisen. Eine lokale Variable muß zunächst einen Wert zugewiesen bekommen ehe sie verwendet wird, oder es resultiert ein Fehler.

- Neu ist ein einfacher IF Befehl: Berechnungen können abhängig von Bedingungen durchgeführt werden.

- Viele neue Funktionen
Code:
   *   goto (Koordinate,optionaler_Wegpunktname)            Koordinate in GotoPanel bzw. Wegpunkt eintragen
   *   project (Koordinate, Winkel_in_Grad, Distanz_in_m)   Koordinate projizieren
   *   format (Koordinate, optionales_Format)               Koordinate formatieren
   *   len (String)                                         Stringlänge
   *   mid(String, start, optionale_Länge)                  wie in Basic
   *   substring(String, start,ende)                        wie in Java
   *   ucase (String)                                       wie in Basic
   *   lcase (String)                                       wie in Basic 
   *   reverse (String)                                     String umkehren 
   *   val(String)                                          A=1,B=2, ... und alle addieren 
   *   sval(String)                                         A=1,B=2, ... und Ergebnis in String
   *   encode(String,String2,String3)                       String encodieren
        Beispiel für encode (ergibt rot13 encoder):
               encode(s,"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "NOPQRSTUVWXYZABCDEFGHIJKLM")

- Funktionsnamen müssen nicht mehr ausgeschrieben werden. Es genügt wenn so viele Zeichen angegeben werden, wie notwendig um die Funktion eindeutig zu bestimmen. Beispiel: Statt crosstotal reicht auch cr

- Einige Funktionen sind auch unter mehrfachen Namen ansprechbar (alias). So kann statt crosstotal auch Quersumme geschrieben werden, bzw. wegen oben auch kurz q

- Die Funktion show kann weggelassen werden (sie ist aber noch erlaubt)

- Das Semikolon als Befehlsende ist nicht mehr notwending ausser wenn mehrere Befehle auf einer Zeile stehen sollen. Fortsetzungszeilen können durch _ oder \ erzwungen werden (sollte aber kaum notwendig sein).

- Es kann umgeschaltet werden ob Variablennamen Case-sensitiv sein sollen. Funktionsname sind nicht case-sensitiv.
 
A

Anonymous

Guest
WOW :shock:
Das is ja mal ne geniale Sache! :D
Danke!

Eine Frage noch: könnte bzw. wäre es sinnvoll, den vorherigen Output zu löschen? Sonst beginnt irgendwann das große scrollen...?
 

Kalli

Geowizard
Albsucher schrieb:
Eine Frage noch: könnte bzw. wäre es sinnvoll, den vorherigen Output zu löschen? Sonst beginnt irgendwann das große scrollen...?
Am Besten wäre eher ein eigener Outputbereich, jetzt wird nämlich in den gleichen Bereich geschrieben, in dem die Formeln eingegeben werden. Dies ist für das Abspeichern nicht so ganz sinnvoll.
Den Outputbereich könnte man dann einfach löschen, indem man einen Clear-Button spendiert.

Auf kleinen Bildschirmen wird es dann natürlich eng.

Ansonsten: Respekt! Der Sourcecode sieht so aus, als ob er relativ einfach erweiterbar ist, wenn man sich die Sache mal genauer angeschaut hat.
 

blackeye501

Geocacher
Hab mir grad auch mal den cw zusammengabaut, leider sieht es bei mir nicht so toll aus (winxp)

Code:
A=2; E=1;COORD="N 47 2"E"."A 3*A A+4 
COORD
#----Output----------
# N 47 21,0.2,06,06,0
#----------------------
 

MKW

Geocacher
Anscheinend ist Salzkammergut gerade dabei meine geheimsten CW-Träume zu erfüllen. :D
Vielen Dank!
 
OP
S

salzkammergut

Geomaster
@blackeye501: Das werde ich mir anschauen. Dürfte ein Problem mit dem Dezimalseparator sein. Kannst Du mal aus dem Hauptmenu "Über" -> "System" aufrufen und posten was bei Decimal seperator is: steht.

@albsucher,kalli: Ich habe auch schon daran gedacht das Solverpanel zu splitten (wie bei Hintlog mit veränderbarer Größe). Für das Löschen des Outputbereichs denke ich an zwei Möglichkeiten:
- eine Funktion cls() plus
- über das Kontextmenü (also mit Rechtsklick in den Outputbereich)
Das hat den Vorteil keinen weiteren Button zu brauchen der Platz verschwendet.
 

blackeye501

Geocacher
Hier bitte:

Code:
Platform: Win32
Locale lang is: DE
Locale country is: DEU
Decimal seperator is: ","
Device is PDA: false
Screen: 1600 x 1200
Font size: 14
Entries in DB: 282
File seperator is: "\"
Programme directory is c:\cw_test
 
OP
S

salzkammergut

Geomaster
@blackeye501: Habe eine überarbeitete Version eingestellt. Kannst Du die mal testen.

Ich habe noch ein Problem das Ding mit dem Dezimalseparator zu verstehen: Unter Windows habe ich auch das Komma eingestellt. CW zeigt mir aber einen Punkt an. Muß da noch ein bißchen forschen wo diese Änderung passiert.

Die überarbeitete Version kann jetzt auch
Code:
   instr([start],String1,String2)             Wie in Basic
   count(String1,String2)					      Zähle die Zeichen von String2 in String1
		   Wenn String2 aus einem Zeichen besteht, ist das Ergebnis eine Zahl.
		   Wenn String2 aus mehreren Zeichen besteht, ist das Ergebnis ein String.
   replace(String,StrWas,StrWomit)            Ersetze alle Vorkommen von StrWas mit StrWomit
   rot13(String)							         Rot13 encoder
           (habe ich bei der ersten Funktionsliste vergessen)
 

blackeye501

Geocacher
Test erfolgreich :D

Code:
A=2; E=1;COORD="N 47 2"E"."A 3*A A+4 
COORD 
#----Output----------
# N 47 21.266
#----------------------
 
OP
S

salzkammergut

Geomaster
So, das gesplittete SolverPanel gibt's jetzt auch. Der obere Teil ist editierbar und enthält den Code, der untereTeil (grauer Hintergrund) den Output.

Der Output kann, wie schon oben beschrieben, über das Kontextmenü gelöscht werden. Alternativ durch die Funktion
Code:
cls()
im Code.

Die Größe von Code-Panel und Output-Panel kann beliebig verändert werden. Ein Klick auf den Splitter maximiert jeweils eines von beiden.
 
OP
S

salzkammergut

Geomaster
Ich will hier einige Hinweise zum Arbeiten mit dem neuen Solver geben:

* Alle Ausdrücke werden schlußendlich in Strings umgewandelt.
* Durch Leerzeichen (falls erforderlich) getrennte Strings werden verkettet.

Beispiel 1:
Code:
1 2+3
        ergibt als Output
15
Der zweite Audruck berechnet sich zu 5 und wird (nachdem beide zu Strings umgewandelt wurden) an den ersten Ausdruck angehängt.

Beispiel 2:
Code:
"GC"1 3*(4-2)
        ergibt
GC16
Hier werden drei Ausdrücke verkettet: GC, 1 und 3*(2-4). Nach dem String "GC" ist kein Leerzeichen notwendig, da der Solver erkennt, daß ein neuer Ausdruck beginnt.


Vorsicht: Der Solver is "greedy", d.h. er versucht so viele Zeichen als möglich zu einem Ausdruck hinzuzufügen, ehe er einen neuen Ausdruck startet.
Beispiel 3:
Code:
"GC"1   -3*(2-4)
Hier handelt es sich nicht um drei Ausdrücke (GC, 1 und -3*(2-4) ), sondern nur um zwei: GC und 1-3*(2-4). Das Ergebnis ist daher
Code:
GC7  und nicht   GC16

Ausdrücke können natürlich auch Variablennamen beinhalten.

Beispiel 4:
Code:
A4C="123"
A4C*3
        ergibt
369
Das Beispiel zeigt, daß Variablennamen mit einem Buchstaben beginnen (Ausnahme globale Variable, doch dazu mehr später) und anschliessend beliebig viele Buchstaben und Ziffern ebinhalten können.

ACHTUNG: Standardmäßig sind Variablennamen anders als Funktionsnamen case-sensitiv!

Weiters ist ersichtlich, wie ein String wo notwendig automatisch in eine Zahl umgewandelt wird. Versucht mal A4C auf "123A" zu setzen.
 

greiol

Geoguru
salzkammergut schrieb:
Vorsicht: Der Solver is "greedy", d.h. er versucht so viele Zeichen als möglich zu einem Ausdruck hinzuzufügen, ehe er einen neuen Ausdruck startet.
Beispiel 3:
Code:
"GC"1   -3*(2-4)
Hier handelt es sich nicht um drei Ausdrücke (GC, 1 und -3*(2-4) ), sondern nur um zwei: GC und 1-3*(2-4). Das Ergebnis ist daher
Code:
GC7  und nicht   GC16
das wird noch für verwirrung sorgen, da viele spontan dem * eine höhere bindung als dem leerzeichen zusprechen würden.
 
OP
S

salzkammergut

Geomaster
Es ist auch möglich mehrere Befehle in einer Zeile zu schreiben. Dabei müssen sie durch Semikolons ; getrennt werden.

Beispiel 5:
Code:
"N 43 " 23 ".123" ; "E 013 45.798"; "Das war ""super"""
      ergibt
N 43 23.123
E 013 45.798
Das war "super"

Jeder Befehl schreibt seinen Output in eine neue Zeile. Bei Zeichenketten kann ein " eingefügt werden indem zwei " unmittelbar auf einander folgen.

Fortsetzungszeilen können erzwungen werden wenn das letzte Zeichen in der Zeile ein _ ist.

Beispiel 6:
Code:
"N 43 " 23 ".123 "_
 "E 013 45.798"; "Das war ""super"""
       ergibt
N 43 23.123 E 013 45.798
Das war "super"
 
OP
S

salzkammergut

Geomaster
Numerische Ausdrücke werden so weit als möglich als Ganzzahlen dargestellt.

Beispiel 7:
Code:
2*1.5
      ergibt
3

Durch Anhängen eines Formats an einen Ausdruck, kann die Darstellung bei der Umwandlung in eine Zeichenkette gesteuert werden. Ein Format wird in zwei Doppelpunkte eingeschlossen.

Beispiel 8:
Code:
2*1.5:000:
        ergibt
003

Beispiel 9:
Code:
3.14159:0.00:
        ergibt
3.14

Eine 0 steht im Format für eine Ziffer, der Punkt für das Dezimalzeichen.
 
OP
S

salzkammergut

Geomaster
@greiol: Das Problem tritt eigentlich nur auf wenn ein Ausdruck mit einem + oder - beginnt. Wer sich nicht sicher ist kann ja den ganzen Ausdruck einklammern.

Beispiel:
Code:
"GC"1(-3*(2-4))
     ergibt
GC16

Ich habe hier bewußt die Leerzeichen weggelassen. Besser schreibt man
Beispiel:
Code:
"GC"  1   (-3*(2-4))
dann ist klar, daß die Klammer nicht auf die 1 folgen kann und daher einen neuen Ausdruck beginnt.
 
OP
S

salzkammergut

Geomaster
Globale Variable beginnen mit einem $ Zeichen und merken sich Ihren Wert von einem Druck auf den Button "Solve!" zum nächsten.

Beispiel 10:
Code:
$stage=$stage+1; "STAGE " $stage
ergibt bei dreimaligem Druck auf "Solve!"
Code:
STAGE 1
STAGE 2
STAGE 3
 
OP
S

salzkammergut

Geomaster
Der IF Befehl erlaubt die Ausführung von Code abhängig von einer Bedingung.

Beispiel 11:
Code:
$stage=$stage+1
IF $stage=1 THEN
"Code für Stage 1 hier"
ENDIF
IF $stage=2 THEN
"Code für Stage 2 hier"
FI

ergibt bei zweimaligem "Solve!"
Code:
Code für Stage 1 hier
Code für Stage 2 hier
.

Zwischen dem THEN und ENDIF (oder auch kürzer FI) dürfen beliebig viele Befehle stehen. Das Schachteln von IFs ist nicht erlaubt (ich wollte es nicht zu kompliziert machen).

Zwischen dem IF und THEN werden zwei Ausdrücke A und B verglichen. Erlaubte Vergleichsoperatoren sind:
Code:
= oder ==      				 Wahr wenn A gleich B
<> oder >< oder !=          Wahr wenn A ungelich B
<                           Wahr wenn A kleiner als B
>                           Wahr wenn A gröper als B
<=                          Wahr wenn A kleiner oder gleich B
>=                          Wahr wenn A größer oder gleich B
Für gewisse Operatoren (gleich, ungleich) gibt es also mehrere Möglichkeiten, so daß sich jeder seine Präferenz heraussuchen kann.

Achtung: Der Typ des ersten Ausdrucks bestimmt ob der Vergleich als numerischer oder als Zeichenkettenvergleich durchgeführt wird.

Beispiel 12:
Code:
IF 2<12 THEN
"kleiner"
FI
         ergibt als Ergebnis
kleiner

Vergleiche dazu

Beispiel 13:
Code:
IF "2"<12 THEN
"kleiner"
FI
         ergibt KEIN Ergebnis

Im letzten Beispiel wird zunächst die Zahl 12 in eine Zeichenkette umgewandelt (weil "2" eine Zeichenkette ist). Dann erfolgt ein Zeichenkettenvergleich von "2" mit "12", der als Ergebnis FALSCH liefert.
 
OP
S

salzkammergut

Geomaster
Es gibt zahlreiche neue Funktionen. Generell hat ein Funktionsaufruf das Format
Code:
FunktionsName()                            oder
FunktionsName(Ausdruck1)                   oder
FunktionsName(Ausdruck1,Ausdruck2)         oder
FunktionsName(Ausdruck1,Ausdruck2, Ausdruck3)
usw. bis zu maximal 3 Ausdrücken. Manche Funktionen können auch mit einer unterschiedlichen Anzahl von Parametern aufgerufen werden.

Für diverse Funktionen gibt es Alternativnamen (=Alias): So kann z.B. statt crosstotal geschrieben werden Quersumme.

Der Funktionsname muß nicht voll ausgeschrieben werden. Es müssen nur so viele Zeichen eingegeben werden, wie notwendig. So reicht z.B. bei der Funktion crosstotal die Angabe von cr. Nur der Buchstabe c ist zuwenig (da es auch eine Funktion cos gibt).

Übersicht über die wichtigsten Funktionen:
Code:
Mathematische Funktionen
   sin                        Sinus
   cos                        Cosinus
   tan                        Tangens 
   asin                       ArcSinus
   acos                       ArcCosinus
   atan                       ArcTangens
   abs                        Absolutwert
   crosstotal 				    Quersumme (Alias: quersumme) 
   
Stringfunktionen
   length                     Länge
   mid                        Extrahiert Teilzeichenkette
   instr                      Prüft ob eine Zeichenkette in einer anderen enthalten ist
   ucase                      In Großbuchstaben umwandeln (Alias: toUpperCase) 
   lcase                      In Kleinbuchstaben umwandeln (Alias: toLowerCase) 
   replace                    Alle Vorkommnisse einer Zeichenkette ersetzen
   reverse                    Zeihenkette umdrehen   ABC => CBA
   encode                     Eine Zeichenkette verschlüsseln
   count                      Zählen wie oft Buchstaben vorkommen 
   rot13                      Rot13
   val                        String nach A=1, B=2 umwandeln und alle Werte addieren 
   sval                       String nach A=1, B=2 umwandeln und anzeigen
   
Koordinaten
   format                     Koordinaten zwischen Formaten umwandeln
   project                    Koordinate in Richtung und Distanz projizieren
   goto                       Koordinate in Goto-Panel und Wegpunkt eintragen
   
Andere
   clearscreen                Clear output screen (Alias: cls)

Alternativ kann die Funktion crosstotal auch über q aufgerufen werden. (Erklärung: q wird zu Quersumme expandiert und dann durch crosstotal ersetzt).
 
Oben