Einer Variablen eine dynamische Formel zuweisen
-
Hi an alle,
ich habe vielleicht einfach nur ein Brett vor dem Kopf, vielleicht aber auch nicht, auf jeden Fall komme ich gerade nicht weiter.
Problem:
Ich möchte einer Variablen eine Formel zuweisen, nach der der Wert der Variablen berechnet wird.
Das Problem dabei: die Formel darf nicht Hard-Coded sein, sondern wird von einer anderen Klasse übergeben und nutzt Elemente der "Formel-Klasse".Konkret sieht das Ganze so aus:
Ich habe ein Struct, in dem die Formel und die Variablen, aus der die Formel zusammengesetzt werden kann, gespeichert sind.
Das sieht in etwa so aus:struct Formel{ int x; int y; int z; float formel; }
Nun möchte ich der Formel-Variablen z.B. die Formel "x*(2,5^y)" zuweisen.
Als Pseudocode quasi so:void setFormular(Formel* form){ form->formel = x*(2.5^y); }
Wenn jetzt eine Klasse/Funktion den Wert der Formel haben möchte, soll sie x und y einen Wert zuweisen und die Variable "formel" abfragen können.
Z.B. so:void getFormularValue(Formel* form){ int FormularValue; form->x = 1; form->y = 2; FormularValue = form->formel; }
Die einzelnen Werte des Structs werden natürlich beim Erstellen des Structs initialisiert, nur so nebenbei
.
Nun meine Frage:
Wie kann ich das am besten umsetzen?
So wie im Pseudocode wirds ja nicht gehen, da nur der Wert, aber eben nicht die Formel übergeben wird.Viele Grüße und Danke im voraus
Cherup
-
So wie du das bisher machst, geht es nicht. "float formel" stellt ja nur genau eine Fließkommazahl dar.
Um Formeln zu benutzen, benötigst du einen String sowie einen Parser (um diesen auszuwerten).
Schau dir mal den Artikel Interpreterbau - Ein Anfang an - dort wird ein einfacher Taschenrechner (d.h. Parser für mathematische Formeln) erstellt.
-
Vielen Dank für deine Antwort, das hilft mir weiter.
D.h. ich muss wirklich einen Parser bauen, so wie ich es befürchtet habe.
Ich hatte gehofft, dass es eine einfachere (bzw. für schreibfaule geeignete) Möglichkeit gibt.
Mal schauen wie ich den umsetze...
Das sollte eigentlich keine großen Schwierigkeiten bereiten, ich muss ja keinen Parser für eine komplett neue "Sprache" bauen sondern nur für Mathe-Operationen und ich hab früher schon 2 oder 3 Parser und Preprocessoren für Dateiinhalte gebaut.Viele Grüße
Cherup
-
Eventuell reicht auch eine simple Funktion:
float formula_1(int x, int y) { return x*std::pow(2.5, y); // ^ ist bitwises XOR } struct Formel{ int x; int y; int z; float(*formula)(int, int); }; void setFormular(Formel* form){ form->formel = formula_1; } void getFormularValue(Formel* form){ int FormularValue; form->x = 1; form->y = 2; FormularValue = form->formula(form->x, form->y); }
-
Danke für die Antwort.
Dein Vorschlag funktioniert leider nicht, weil die Formel dann Hard-Coded wäre. Genau das soll ja umgangen werden, da in dem Formel-Struct beliebige Formeln mit einem vordefinierten Satz aus Variablen gespeichert werden sollen. Die Formeln kommen aus Dateien, die vorher eingelesen werden und sind daher noch nicht bekannt.Und danke, dass du mich auf das "^" hingewiesen hast, ich habe das nur der Übersichtlichkeit halber so geschrieben. Aber man macht den Fehler schon sehr gerne, ist mir oft genug passiert
Viele Grüße
Cherup
-
Ok, wenn die aus Dateien kommen, dann geht das natürlich so nicht.