Vom Benutzer vorgegebene Funktion verarbeiten

Gast #3343375
Lesenswert?

Hallo Zusammen!

Für eine Erweiterung eines kleine Auswerteprogramms würde ich eure Hilfe 
benötigen. Das Programm ist in VB.net geschrieben und wirklich winzig - 
ich könnte es also auch in Cpp übertragen.

Mein Problem ist folgendes:
Ich möchte, am besten im einem Textfeld, eine Funktion

z.B.: y(x,t) = k*x+d - x*t

übergeben.
Diese Funktion soll dann vom Programm erfasst werden und damit gerechnet 
werden.


Ich hab jetzt schon einiges probiert und bin immer daran gescheitert. 
des weiteren habe ich auch schon im Netz ein wenig gesucht, aber ich 
glaube ich hab die falschen Suchschlagworte.

Könnte mir jemand einen Ansatz nennen, wie ich das mache, bzw. ein 
Schlagwort mit dem ich Google befragen kann?

Vielen Dank für eure Hilfe!
#3343403
Lesenswert?

Das direkt in C zu machen ist tatsächlich eine Herausforderung.
Es gibt mehrere Ansätze:

- man ruft von C aus einen irgendwie gearteten Interpreter auf (python, 
php...) und schiebt dem die Funktion unter.
Nachteil: man ist auf den Interpreter angewiesen, und i.d.R. dessen 
niedrigere Geschwindigkeit.

- man schreibt sich einen Interpreter für solche Formelstrings in C 
selbst (das ist ein gewisser Aufwand, je nachdem wie schlau die Formeln 
interpretiert werden müssen, z.B. wie aufwändig Variablen, Konstanten, 
Winkelfunktionen... genutzt werden sollen.)
Das habe ich mal in C++ gemacht und nutze es in vielen eigenen 
Programmen, habe aber nicht vor, es zu veröffentlichen.
Der Aufwand misst sich schnell in Tagen und Wochen...
Der Vorteil ist, daß man so einen Formelinterpreter sehr häufig nutzen 
kann, z.B. nehme ich es regelmäßig, um Programme konfigurierbar zu 
machen.
Das Programm lädt einfach aus einer Datei Zeile für Zeile die Formeln 
und baut damit einen Variablensatz auf, der dann zur Laufzeit die 
Konfiguration enthält.

- man stellt sicher, daß auf dem Rechner, der letztlich genutzt wird, 
eine Entwicklungsumgebung läuft.
Dann lässt man sich vom Benutzer die Funktion geben, baut in seinem 
Programm etwas C-Quelltext drumrum, kompiliert und linkt das Ganze zu 
einer DLL bzw. SO und lädt es dynamisch.
Außer, daß man eine entsprechende Umgebung braucht, ist es sehr 
effizient. Sowohl die Entwicklung ist überschaubar, als auch zur 
Laufzeit recht effizient wenn die Formel häufig ausgewertet wird.
Gast #3343460
Lesenswert?

Du erfaßt also Meßwerte und willst diese nun mit einer Formel vom Nutzer 
auswerten.
Die schnellste Lösung wäre die Werte in eine Tabellenkalkulation zu 
übertragen wo der Anwender dann die Formel eintragen kann.
Ansonsten wirst Du selber einen Parser schreiben müssen.
Wie das geht kannst Du z.B. hier lesen:
http://www.highscore.de/cpp/boost/parser.html
Gibt sicherlich noch mehr Tutorials dazu ;-)
#3343550
Lesenswert?

So ein Formelinterpreter ist normalerweise eine Übungsaufgabe in der 
ersten oder zweiten Woche einer Compilerbau-Vorlesung.

Grammatik hinschreiben, und stupide in einen rekursiven Top-Down Parser 
übersetzen.
Auswertung/Berechnung dann direkt im Parser, oder über einen 
Syntaxbaum-Zwischenschritt, je nach dem...
#3343689
Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber Google kommt ja schön langsam auch aus der Mode.

man will halt, nicht, dass alles über Server in Ami-Land läuft und von 
denen gespeichert wird - ist also purer Selbstschutz, Google nicht zu 
benutzen ;-P

je nach komplexität, könnte man auch octave oder so in sein Programm 
integrieren.

Peter schrieb:
> Für eine Erweiterung eines kleine Auswerteprogramms würde ich eure Hilfe
> benötigen. Das Programm ist in VB.net geschrieben und wirklich winzig -
> ich könnte es also auch in Cpp übertragen.

Das hört sich allerdings so an, als wäre das mit Kanonen auf Spatzen 
geschossen und viel einfacher, das eigentliche Auswerte-Programm in 
einer vernünftigen Skriptsprache zu schreiben. Wahlweise Octave oder, 
wenn man Gui unbedingt braucht, Python.
#3343714
Lesenswert?

Wenn man sich beim Ausdruck rechts des Gleichheitszeichens auf die 
VB.net (oder auch C#) Syntax beschränkt, könnte man auch aus dem 
Ausdruck den Quelltext einer VB.net- bzw. C#-Methode erzeugen und diese 
durch den entsprechenden .net-Compiler (VBCodeProvider / 
CSharpCodeProvider) jagen. Der Vorteil: man muß keinen eigenen Parser 
schreiben und man hat sofort ausführbaren Code. Der Aufwand liegt eher 
beim Mapping der Benutzereingaben für die verwendeten Variablen zu den 
erforderlichen Methodenparametern. Das ist aber bei allen Lösungen 
erforderlich und auch nicht unbedingt schwierig.

http://support.microsoft.com/kb/304655/de
http://msdn.microsoft.com/de-de/library/microsoft.visualbasic.vbcodeprovider.aspx

Grüße
Markus
#3343814
Lesenswert?

Johann L. schrieb:
> Ganz simpel ist sowas in JavaScript: eval() und damit hat sich der Lack
> :-)

Nicht unbedingt...
Aus dem ECMA-"Compact Profile" für Javascript ist eval() schon 
rausgeflogen.

Und generell sollte man Programmier-Anfängern die "eval"-Funktionen 
(unabhängig von der Programmiersprache) nicht vorschlagen. Sonst kommen 
so PHP-Genialitäten wie <? echo eval($_GET['funktion']) ?> dabei 
heraus...
Gast #3344033
Lesenswert?

David_D schrieb:
> Was du suchst nennt man Formel Parser
>
> http://www.mycsharp.de/wbb2/thread.php?threadid=71995

Genau diese Auskunft hab ich gesucht! Vielen Dank auch für den 
interessanten Link!

Εrnst B✶ schrieb:
> So ein Formelinterpreter ist normalerweise eine Übungsaufgabe in der
> ersten oder zweiten Woche einer Compilerbau-Vorlesung.

Tja, leider studiere ich nicht Softwareentwicklung oder ähnliches....

Vlad Tepesch schrieb:
> Das hört sich allerdings so an, als wäre das mit Kanonen auf Spatzen
> geschossen und viel einfacher, das eigentliche Auswerte-Programm in
> einer vernünftigen Skriptsprache zu schreiben. Wahlweise Octave oder,
> wenn man Gui unbedingt braucht, Python.

Recht hast du Vlad Tepesch. Wär sicher leichter nach Python zu 
portieren. Aber da ich Zeit, Lust und Interesse habe werd ichs wie oben 
beschrieben probieren.

Karl Heinz Buchegger schrieb:
> Die pragmatische Lösung ist, in Google den Suchstring
> "vb.net evaluate math expression"
> einzugeben und dann ganz einfach die ersten paar Links abzuklappern.
>
> Aber Google kommt ja schön langsam auch aus der Mode.

Ich war leider nicht fähig (wie schon oben beschrieben) meine 
Suchbegriffe richtig zu formulieren... Probiert hab ichs ja.

Aber zum Glück gibts dieses Forum! Danke Leute für die Infos und Links - 
haben mir sehr weitergeholfen!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren