Hey, nachdem ihr mir bei meinem Matrizenproblem so gut geholfen hat kommt diesmal eine etwas kompliziertere Frage.
Wir haben ein Projekt, bei dem jetzt auch native Calls in Spiel kommen sollen.
Das ganze läuft bis jetzt mit Antlr4.
Ich habe also eine Antlr4 Grammatik, die mathematische Funktion und Rechnungen erkennt und auswertet.
Also sowas wie (3+5*3)/9 oder f(x)=x^2; f(5); und Ähnliches. Der von Antlr4 generierte Parser baut mir also schöne Bäume, die ich dann mit einem Listener leicht auswerten kann.
Nun soll das Projekt so ausgeweitet werden, dass auch Integrale und Ableitungen berechnet werden. Das ganze soll aber in einer C+±Routine passieren.
Ich habe in meinem Java Projekt eine Klasse „Function.java“. Die Klasse sieht so aus:
{
ParseTree vars;
ParseTree term;
ParseTreeWalker walker;
public double eval(double... args) throws IllegalArgumentException,
RecognitionException {
...
}
Ich speichere also praktisch die Bäume weg.
Einmal den Variablenbaum und einmal den Expression-Baum.
In etwa so kann man sich das vorstellen:
In der eval-Methode werden praktisch bei einem Funktionsaufruf wie f(5, 7) die Werte 5 und 7, den Variablen a und b zugewiesen.
Danach läuft der TreeWalker einfach über den Expressiontree und mein Listener wertet die ganze Gleichung aus. So weit, so schön.
Die Grenzwerte sollen wohl über die Taylorreihe ausgrechnet werden, nur mein Problem ist, wie ich überhaupt die C+±Klasse aufrufen soll.
Ich weiß, das man JNI nutzen soll, aber ohne jegliches Hintergrundwissen frag ich mich, wie man ein Java Objekt(in diesem Fall ein Objekt der Klasse „Function“, an eine C-Routine übergeben soll.
Es heißt:
Mit Hilfe von gekapselten C Funktionszeigern und einer darauf abge-
stimmten C++ Funktionsklasse lassen sich effiziente Methoden
entwickeln, um beliebige C und Java Funktionen numerisch zu differenzieren
und bestimmte Integrale auszuwerten
Die eigentliche Frage, die ich mir also stelle ist, wie man es anstellt eine Funktion(die ja eigentlich ein Java Objekt ist) in C++ auszuwerten. Es hat anscheinend etwas mit dem überladen des ()-Operators zu tun.
Aber in C++ steht mir ja kein Listener oder TreeWalker zur Verfügung, die momentan das Rechnen für mich übernehmen, deswegen frag ich mich, wie man da das Integral oder den Differenzenquotienten berechnen soll.
Vllt hat da jemand ein kleines Beispiel, wie man sowelche Aufgaben an C++ Routinen „weitergibt“.
Grüße