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!
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
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.
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 ;-)
War nicht sogar im K&R ein Beispiel dazu? Habe ihn leider nicht greifbar, aber ich meine mich dunkel zu erinnern...
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...
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...
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
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.
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
Ganz simpel ist sowas in JavaScript: eval() und damit hat sich der Lack :-)
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
Ε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
... und dann vom Benutzer einen ungeprüften String rein füttern und ausführen :-) "Daddy, what does format C: mean?"
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.