Forum: PC-Programmierung Vom Benutzer vorgegebene Funktion verarbeiten


von Peter (Gast)


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!

von David_D (Gast)


Lesenswert?

Was du suchst nennt man Formel Parser

http://www.mycsharp.de/wbb2/thread.php?threadid=71995

von Klaus W. (mfgkw)


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.

: Bearbeitet durch User
von Klaus W. (mfgkw)


Lesenswert?

PS: man kann auch auf Systeme wie Matlab zurückgreifen.
Wenn man das aber nicht ohnehin hat, ist der Aufwand alleine dafür auch 
nicht zu verachten.

von cppler (Gast)


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 ;-)

von Klaus W. (mfgkw)


Lesenswert?

War nicht sogar im K&R ein Beispiel dazu?
Habe ihn leider nicht greifbar, aber ich meine mich dunkel zu 
erinnern...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> War nicht sogar im K&R ein Beispiel dazu?

Naja es ist ja nun nicht so, das dieses Problem komplett neu ist: 
http://warp.povusers.org/FunctionParser/  solches und ähnliches wird man 
denke ich mehrfach finden, bestimmt auch für VB...

von Εrnst B. (ernst)


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...

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Vlad T. (vlad_tepesch)


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.

von Markus V. (valvestino)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ganz simpel ist sowas in JavaScript: eval() und damit hat sich der Lack 
:-)

von Εrnst B. (ernst)


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...

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Εrnst B✶ schrieb:
> Aus dem ECMA-"Compact Profile" für Javascript ist eval() schon
> rausgeflogen.

Dann nimmt man eben irgendeine von zig anderen Programmiersprachen, die 
eval unterstützen. Hier sind ein paar Beispiele:

  http://en.wikipedia.org/wiki/Eval

von Klaus W. (mfgkw)


Lesenswert?

... und dann vom Benutzer einen ungeprüften String rein füttern und 
ausführen :-)

"Daddy, what does format C: mean?"

: Bearbeitet durch User
von Peter (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.