Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Formeln speichern und wieder einlesen, gibts da Tricks?


daywalker0086 - Fr 25.07.14 13:21
Titel: Formeln speichern und wieder einlesen, gibts da Tricks?
Hallo Leute,
ich wollte einmal nachfragen wie ihr das machen würdet:
Folgendes:
Ich habe einen Wert, welcher mit einer Formel verändert werden soll:
Zum Beispiel:

Delphi-Quelltext
1:
value:= value*1000;                    

Soweit kein Problem, jetzt möchte ich aber ds die Fomel nicht direkt einprogrammiert ist, sondern aus einer XML Datei ausgelesen wird und so quasi veränderbar ist.

Also value:= value "Platzhalter";
jetzt stellt sich nur die Frage wie ich sowas abspeichere, ich würde jetzt einen String nehmen und dann quasi den String zerlegen und mich nach mathemtischen Zeichen umschauen, und dann eben mit einer if oder Case Anweisung ala:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if string[i] = '*' then
begin
value:=value*stringrest_nach_math_Zeichen;
end;
if string[i] = '/' then
begin
value:=value/stringrest_nach_math_Zeichen;
end;

aber dann kann ich keine Formeln frei wählen also mit mehreren Formelzeichen ala value:= value*1000/3;
aufbauen oder ich müsste das alles irgendwie berücksichtigen.
Ich will auch keine wilden Formeln da rein bringen aler 2 Rechenzeichen wären schon niocht schlecht.
Wie würdet ihr sowas machen?
Hintergrund ist der: der wert kommt von einem Prüfgerät. Und je nach dem welcher Prüfgegenstand angeschlossen ist muss der Wert noch verrechnet werden damit dann die richtigen Werte erscheinen ( Bsp: Das Gerät misst immer nur eine Spannung, wenn ich jetzt damit aber einen Stromwert messe(shunt) muss ich die Spannung eben noch umrechnen, diese Infos stehen in einer xml Datei)

Grüße Christian


jaenicke - Fr 25.07.14 13:40

So einen Parser kann man gut als endlicher Automat umsetzen, je nach Wunsch auch mit Rekursion. Sprich du gehst zeichenweise durch und analysierst dann anhand des aktuellen Zeichens was du machen musst.

Wenn du nach mathematischen Parsern suchst, wirst du aber auch sehr viele fertig finden.


Xion - Fr 25.07.14 16:48

Ganz klar und mit Delphi in letzter Zeit schon mehrfach gemacht: Werf XML über Bord und binde deine Formel als Lua-Sript ein. Der Interpreter dazu ist nur eine dll und fertige Wrapper dafür gibts auch für Delphi.
Dann hast du eine vollständige Programmiersprache, mit der du jegliche Form von Formel dem Nutzer zugänglich machst. Mit vergleichsweise wenig Aufwand.

Sähe dann in etwa so aus:


Quelltext
1:
2:
3:
function meineFormel( x )
  return x*x*4
end


Die Formel kannst du dann direkt von Delphi aus mit Hilfe der dll aufrufen/ausführen. Aufrufe sind übrigens auch in umgekehrter Richtung, von Lua zu Delphi, möglich.


jaenicke - Fr 25.07.14 20:33

Da würde ich dann eher Pascal Script empfehlen, denn das kann man ohne DLL einkompilieren. Wir haben auch an Lua gedacht, es dann aber nach einigen Versuchen und Tests verworfen und sind bei DWScript [https://code.google.com/p/dwscript/] geblieben. Das ist echt genial.


Xion - Fr 25.07.14 21:08

Klingt interessant.
Müsste man aber erstmal sehen, ob das unter Delphi 2005 (meine und Threadstarter Version) läuft.
https://code.google.com/p/dwscript/wiki/FAQ hat folgendes geschrieben:
Delphi 2009 is the current minimum version. Development happens on Delphi XE however, so SVN version may temporarily become incompatible with previous versions.


Der Vorteil von Lua ist allerdings, dass es Haufenweise Informationen dazu im Netz gibt, auch da es etwa gerne in der Spieleindustrie verwendet wird.


jaenicke - Fr 25.07.14 21:15

Es gibt ja auch andere Pascal Script Projekte, so wie dieses:
http://www.remobjects.com/ps.aspx
Da Inno Setup das auch nutzt, muss es auch mit alten Versionen gehen.