AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Kompilierender Matheparser
Thema durchsuchen
Ansicht
Themen-Optionen

Kompilierender Matheparser

Ein Thema von Dax · begonnen am 26. Mai 2005 · letzter Beitrag vom 24. Aug 2006
Antwort Antwort
Seite 7 von 14   « Erste     567 89     Letzte »    
Dax
Huhu DP!

Ich hab (mal wieder ) einen Matheparser geschrieben, aber diesmal einen besonderen. Mit diesem kann man Ausdrücke nicht nur Parsen, sondern auch noch kompilieren (Habs mal duchgetestet, ist schneller als Delphieigene Kompilate)

Ich stells einfach mal so hier rein, zum Doks-schreiben ist es einfach zu.. heiß.. und das Interface erklärt sich eh fast von selbst, und mit den Comments in den Units und den Units selbst kommt man auch gut über die Runden. Hoffe ich

read you,
Dax

[edit] da waren ein paar Fehler, verzeiht [/edit]
nocheinedit: Wieder ein paar Fehler ausgebügelt
Angehängte Dateien
Dateityp: zip excqparser_207.zip (16,1 KB, 524x aufgerufen)
Dateityp: zip realdemo_442.zip (11,1 KB, 399x aufgerufen)
Dateityp: zip ecqpdemo-exe_649.zip (244,6 KB, 484x aufgerufen)
 
Dax
 
#61
  Alt 28. Mai 2005, 19:25
Zitat von Dust Signs:
Zitat von Dax:
Zitat von Dust Signs:
Ich war eigentlich der Meinung, das folgendes auch funktionieren sollte (wäre logischer):

i
2*i
pi*i
Ja, das is etwas verzwickt, weil i ja als Operator eingetragen wird.. einen anderen gescheiten Weg hab ich leider nicht gefunden
Solltest du aber, das ist ansonsten viel zu umständlich; nimm's doch einfach als multiplikative konstante... (sqrt(-1))
Oh, ich seh grade.. ich hatte da nen kleinen Denkfehler ^^ Ich machs mal im nächsten "Release", dann sehen wir, obs besser ist

Zitat von Dust Signs:
Zitat:
Zitat von Dust Signs:
sin(pi/2) nimmt dein Parser nicht ("Invalid expression").
Das wäre mir ganz neu. Bei mir kommt dabei immer "1 + 0i" heraus, egal ob Komplexer Modus oder Reller...

btw: Hast du die komplexe Arctan-Formel? Das wäre genial
Nein, leider noch nicht; könnt aber versuchen, sie herzuleiten.

Dust Signs
Uhhh das ist genial Deswegen funktioniert der komplexe ArcTan auch nicht

Edit: Neue EXE und Soßen sind oben, i ist jetzt eine Konstante.

read you,
Dax
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

 
Delphi 5 Standard
 
#62
  Alt 29. Mai 2005, 12:28
Hallo,

ich mal wieder Es gibt Leute die benutzen noch Delphi 5. Leider ist dein Code nicht ganz Delphi 5 Kompatibel aus folgenden Gründen:

1. in ECQ_Def: TParserMode = (pmReal = 1, pmComplex = 2, pmQuad = 4); wird in Delphi 5 nicht unterstützt. Hab es in TParserMode = (pmReal, pmComplex, pmQuad); Ist es wirklich notwendig, dem pmQuad eine 4 zuzuweisen?

2. gleiches Problem bei TRegister in ECQ_Assembler. Habs in TRegister = (rEAX, rECX, rEDX, rEBX); geändert, damit die Werte noch stimmen

3. Die Funktion Sign gibt es in Delphi 5 leider nicht. Habe Deshalb in EXCQP_Predefs die Funktion Sign manuell definiert:

Delphi-Quellcode:
function Sign(Value: double) : Integer;
begin
  if Value=0 then
    result:=0
  else if Value<0 then
    result:=-1
  else if Value>0 then
    result:=1;
end;
4. Die Funktion Coth gibt es ebenfalls nicht Da ich diese Funktion vermutlich erstmal nicht brauche hab ich es auskommentiert. Vielleicht findet ja jemand Ersatz ...

Auf jeden Fall, kann ich es jetzt mit Delphi 5 kompilieren Wäre vielleicht schön, wenn du die Änderungen in deine Sourcen mit einbauen würdest. Dann geht es auch unter Delphi 5, das bestimmt noch einige benutzen.

gruß vom nervendem jim
Christian Reich
  Mit Zitat antworten Zitat
Dax
 
#63
  Alt 29. Mai 2005, 12:41
hi jim, du nervst doch nicht

Ich seh zu, das ichs ändere

read you,
Dax
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

 
Delphi 5 Standard
 
#64
  Alt 29. Mai 2005, 19:17
Nächstes Problem: Wenn ich den Parser mit Free freigeben bekomme ich wieder unschöne AV. Ich weiss nicht ob es eine Rolle spielt aber hier mal der Code:

Delphi-Quellcode:
Parser:=TExCQParser.Create;
Parser.SolveMode:=smRM;
Parser.PreSolve:=false;

RegisterVarsAndConst(Parser);

Parser.Parse('UnitTreff*(1/(Range*Range))*(BaseRange*BaseRange)');

Parser.Free;
In RegisterVarsAndConst werden die entsprechenden Variablen mit Parser.RegisterVariable(xxx) registriert. Hoffe du kannst das Problem lösen bzw. erstmal nachstellen
Christian Reich
  Mit Zitat antworten Zitat
Dax
 
#65
  Alt 29. Mai 2005, 19:31
Danke jim, is korrigiert, neue Versionen oben

PS: Wenn du die Variablen und Konstanten eh am Anfang registrierst und nie löschst, leite doch vom ECQP ab und tu' alles in den Constructor (Tip von Robert_G)

read you,
Dax
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

 
Delphi 5 Standard
 
#66
  Alt 29. Mai 2005, 20:19
MMhh. Irgendwie ist der Wurm drin.

Habe jetzt zum Testen (wirklich nur zum Testen) folgendes:

Delphi-Quellcode:
  Parser:=TExCQParser.Create;
  Parser.SolveMode:=smVM;
  Parser.PreSolve:=true;

  Parser.RegisterVariable('Range');

  Parser.SetVariable('Range',[10]);

  Parser.Parse('(1/(Range*Range))');

  ShowMessage(FloatToStr(Parser.Solve.X));
  Parser.Free;
Leider stürzt er bei dem Solve wieder zuverlässig ab. Da ist es egal welcher SolveMode aktiv ist, und ob PreSolve an oder aus ist

P.S: Danke für den Hinweis mit dem Ableiten, allerdings hatte ich den Code etwas vereinfacht. In wirklichkeit lese ich die Formeln und die benötigten Variablen aus einer INI-Datei
Christian Reich
  Mit Zitat antworten Zitat
Dax
 
#67
  Alt 29. Mai 2005, 20:24
Hast du ne alte Version? Ich habs grad ausprobiert, es funktioniert ohne Probleme...

read you,
Dax
  Mit Zitat antworten Zitat
Nicodius

 
Delphi 2006 Architect
 
#68
  Alt 29. Mai 2005, 20:30
sry schnell ne frage(ich hab jetzt nicht alels durchgelesen)

was sind imaginäre Werte? ... also nur vorgestellte werte - was hat dass für nen sinn(weil auch immer kommt ()i
Nico Müller
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

 
Delphi 5 Standard
 
#69
  Alt 29. Mai 2005, 20:35
Zitat von Dax:
Hast du ne alte Version? Ich habs grad ausprobiert, es funktioniert ohne Probleme...
Diesmal nicht

Ich hab so das Gefühl, dass es an der Delphi Version hakt. Habs jetzt mal mit Delphi 5 und 7 getestet. Beides das gleich Problem Hab leider kein Delphi 2005 hier zum Testen.
Christian Reich
  Mit Zitat antworten Zitat
Dax
 
#70
  Alt 29. Mai 2005, 20:36
Bei meinem Delphi 6 und 2005 funktionierts

Edit: Mein Demoprogramm verarscht mich. Mit der Demo gehts, mit dem Code nicht.. Mal sehn was da schief gelaufen ist.

Edit2: Fehler beseitigt, neue Version
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 14   « Erste     567 89     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz