[C] Gleichungen lösen - Equation Solver

B

ByeBye 224935

Haaaaaallo Leute.

Ich habe schon das gesamte Forum durchkämmt, also tut es mir leid, wenn dieses Thema doppelt drinsteht, aber ich habe alles gegeben.

Kennt jemand ein Tutorial, dass einem beibringt, wie man einen Equation Solver in C programmiert?
Also damit ihr wisst, was ich meine: Nachher soll ich so eine Funktion haben:
C:
double dbValue = solveEquation("( 1 - 4 ) ^ 4 / ( 3 - 2 * 9 )");
Ich find auch bei google nix gescheites, aber ich finde, dass ist eine nennenswerte Problemstellung...

Danke im Voraus,
mfG
Me
 
Ein paar Anmerkungen habe ich doch noch.

  • Möglicherweise hatte sich ein 'Müllzeichen' in den Quellcode eingeschlichen.
  • Für solche Problemstellungen verwendet man meistens einen Syntaxbaum.
  • Mit den Tools lex und yacc kann man sich die Arbeit wesentlich erleichtern. Bei GnuWin32 gibt es diese UNIX-Tools auch für Windows; sie heißen dort flex und byacc. Herzlichen Dank noch mal an deepthroat, der mich mal darauf aufmerksam gemacht hat.
  • Es gibt ein Tutorial für lex und yacc bei epaperpress, in dem genau das implementiert wird, was du gemacht hast.
  • Ich verwende als SDK CodeBlocks mit dem mingw.Compiler. Zusätzlich habe ich wxWidgets installiert.
 
Zuletzt bearbeitet:
Dann schau am besten mal nach, ob du den angeforderten Speicher auch korrekt initialisierst. Möglicherweise hast du einen verirrten Pointer. Was geschieht, wenn du calloc statt malloc verwendest? Gibt es dann eine NullPointerException oder ähnliches?
 
Hi.
Problem dahingegen gelöst, dass ich DEV-Cpp langsam (datei für datei) gelöscht habe, denn mit openwatcom gibts 0 probleme.
Wie kann man nur nen compiler vertreiben, der so nen mist macht....
The Pragmatic Programmer Tip #26: "select" Isn't Broken.
It is rare to find a bug in the OS or the compiler, or even a third-party product or library. The bug is most likely in the application.


Du hast einige Fehler im Code. Mal ganz abgesehen von Speicherlecks.

Du reservierst nicht genug Speicher für czTerm2 und schreibst in irgendwelchen Speicherbereichen die du nicht alloziert hast. => undefiniertes Verhalten

Du terminierst den String czNumber nicht (strncpy terminiert den String nicht immer siehe z.B. http://www.cplusplus.com/reference/clibrary/cstring/strncpy/) und liest in nicht allozierten Speicherbereichen. => undefiniertes Verhalten

Du greifst auf (eigentlich) leere Stacks zu. (die enthalten bei dir zwar mind. ein Element, welches aber nicht initialisiert ist). => undefiniertes Verhalten

Gruß

PS: Außerdem ist dein Code zu kompliziert. Du solltest einfacheren Code schreiben. Und du mußt eigentlich nicht x-mal durch den String iterieren brauchst eigentlich auch keine Rekursion.
 
Zuletzt bearbeitet:
Hi.

Speicherlecks sehe ich jetzt keine mehr, aber du greifst wieder auf ein Arrayelement zu welches nicht existiert => undefiniertes Verhalten.

C:
if(isLowerOperator(sElElement.chOperator,chaOperatorStack[nOperatorStackSize-1]) && nOperatorStackSize >= 2){
Du greifst hier schon auf den Stack zu und schaust danach ob der Index überhaupt valide ist. Das mußt du umgekehrt machen:
C:
if(nOperatorStackSize >= 2 && isLowerOperator(sElElement.chOperator,chaOperatorStack[nOperatorStackSize-1])){
Gruß

PS: Es gibt kein Format %lf bei printf.
PPS: Warum muss man denn Leerzeichen zwischen die Operanden/Operatoren schreiben?
 
Zuletzt bearbeitet:
Warum nennst du die Funktion nicht zB
Code:
double dCalcTerm_sTmP_nP(struct sTerm *sTmInput,int *nError);
bool   bIsLowerOperator_c_c( char chO1 , char chO2 );

Sind ja schließlich von dem entspechenden Typ...

Sorry, konnt ich mir jetzt bei deinem Variablen-Benennungsschema nicht verkneifen ;)
 
Das Variabelnbennungsschema, welches er verwendet finde ich sehr gut. Ich wende das in ähnlicher Form an. Hat mir schon vor vielen Fehlern bewahrt, weil ich falsche Variabeln mit falschen Werten kombiniert habe und ähnliches. Gegen eine entsprechende Typenbennenung ist eigentlich nichts einzuwenden.
 
Ich finde das macht eher Sinn in dynamisch getypten Sprachen wie php, python und co.
In C haben die Variablen jedoch bereits durch die Deklaration einen festen Typ und spätestens der Compiler warnt mich, wenn ich versuche falsche Variablen zu kombinieren.
 
Zumindest mir geht es eher darum während dem Programmieren ständig den Überblick zu haben, was der Sinn und der Typ einer Variabeln ist indem ich einfach ihren Namen anschaue.

Ebenfalls habe ich ein konstantes System beim Bennen von Funktionen. So weiss ich sofort wie eine Funktion heisst, die die Aktion X ausführen soll ohne einmal in der Definition der Klasse nachsehen zu müssen, usw.
 

Neue Beiträge

Zurück