C++ - "Terme-Parser" in C - "Terme-Parser" umwandeln

12/11/2010 10:22 Shadow992#1
Ich hab mir einen Parser gebastelt, der mir einfach Terme löst und das Ergebniss zurückgibt. Das ganze habe ich mit C / C++ gemacht, ich bin aber gezwungen das ganze in reinen C - Code umzuwandeln.
Ich habe mich auch schon versucht, aber da ich wirklich extrem wenig und ungern Elemente aus C verwende bin ich gescheitert.


Hier mein C/C++ Code:
Und hier der Versuch von mir in C-Code (Von der alten Version):
Edit:
Ich habe den Code jetzt auskommentiert und hier nocheinmal ein "Anwendungsbeispiel":
Falls jemand einen kostenlosen Opensource-C-Parser hat, dann kann er ihn mir auch schicken. ;)
12/11/2010 14:59 Bot_interesierter#2
Code:
for (short i=0;i<sizeof(str);i++)
Diese Codezeile macht mich sehr sehr traurig, sizeof kann nur größen ermitteln die zur Zeit des Kompilierens bekannt sind, außerdem ist die Größe des Chararrays überhaupt nicht was du wissen willst, dich interessiert doch die String länge, also benützt auch die strlen Funktion.
Desweiteren kannst du in C keine Variablen im schleifenkopf deklarieren.
Ansonsten habe ich jetzt den Code noch nicht weiter inspiziert, denn die C Version hast du überhaupt nicht kommentiert, was mir allerdings aufgefallen ist, das while(1) aus der C++ Version fehlt in der C Version.
Codepad.org kann übrigens auch C kompilieren.
12/11/2010 15:12 Shadow992#3
Quote:
Originally Posted by Bot_interesierter View Post
Code:
for (short i=0;i<sizeof(str);i++)
Diese Codezeile macht mich sehr sehr traurig, sizeof kann nur größen ermitteln die zur Zeit des Kompilierens bekannt sind, außerdem ist die Größe des Chararrays überhaupt nicht was du wissen willst, dich interessiert doch die String länge, also benützt auch die strlen Funktion.
Desweiteren kannst du in C keine Variablen im schleifenkopf deklarieren.
Ansonsten habe ich jetzt den Code noch nicht weiter inspiziert, denn die C Version hast du überhaupt nicht kommentiert, was mir allerdings aufgefallen ist, das while(1) aus der C++ Version fehlt in der C Version.
Codepad.org kann übrigens auch C kompilieren.
Endlich versteh ich warum das nicht funktionieren kann. :D
Die for-Schleife hat mir nicht direkt einen fehler geliefert...
Aber ok, ich werde das aucheinmal beachten und dann den Code posten.
Danke aufjedenfall schoneinmal.

Edit:
Danke, endlich funktioniert es, falls es jemanden intressiert:

12/12/2010 21:04 MrSm!th#4
Quote:
string calcs[str.length()*2];
Und das mich.
Ich meine wtf? Wie soll der Compiler da genug Platz für lokale Variablen holen, wenn du ein Array aus Strings machst, das die doppelte Anzahl an Elementen hat, wie der Parameterstring an Zeichen?
Er muss die Anzahl doch schon zur Compilezeit kennen.
Das müsstest du schon mit new (und bei C mit malloc) machen.
Oder ist mir da ein seltsames Sprachkonstrukt entgangen, sodass ich die Wirkung dieser Zeile missverstanden habe?

Quote:
short size=strlen(str2)+1;
char calcs[size*2][18];
Hier genau so.

Wie gesagt, meines Wissens kann der Compiler keine Arrays dynamisch alloziieren, da lokale Variablen auf dem Stack abgelegt werden, der eben statisch festgelegten Platz pro Routine bietet.
Bisher habe ich es immer so gelernt, dass man wie gesagt so etwas mit new/malloc machen muss; falls ich falsch liege (du sagst ja, jetzt funktioniert es), warum? o.O
12/12/2010 22:06 MoepMeep#5
Quote:
Originally Posted by MrSm!th View Post
Und das mich.
Ich meine wtf? Wie soll der Compiler da genug Platz für lokale Variablen holen, wenn du ein Array aus Strings machst, das die doppelte Anzahl an Elementen hat, wie der Parameterstring an Zeichen?
Er muss die Anzahl doch schon zur Compilezeit kennen.
Das müsstest du schon mit new (und bei C mit malloc) machen.
Oder ist mir da ein seltsames Sprachkonstrukt entgangen, sodass ich die Wirkung dieser Zeile missverstanden habe?



Hier genau so.

Wie gesagt, meines Wissens kann der Compiler keine Arrays dynamisch alloziieren, da lokale Variablen auf dem Stack abgelegt werden, der eben statisch festgelegten Platz pro Routine bietet.
Bisher habe ich es immer so gelernt, dass man wie gesagt so etwas mit new/malloc machen muss; falls ich falsch liege (du sagst ja, jetzt funktioniert es), warum? o.O
^this.
Das dürfte Fehler jenseits von gut und böse werfen ._.
12/13/2010 20:43 Shadow992#6
Quote:
Originally Posted by MrSm!th View Post
Und das mich.
Ich meine wtf? Wie soll der Compiler da genug Platz für lokale Variablen holen, wenn du ein Array aus Strings machst, das die doppelte Anzahl an Elementen hat, wie der Parameterstring an Zeichen?
Er muss die Anzahl doch schon zur Compilezeit kennen.
Das müsstest du schon mit new (und bei C mit malloc) machen.
Oder ist mir da ein seltsames Sprachkonstrukt entgangen, sodass ich die Wirkung dieser Zeile missverstanden habe?



Hier genau so.

Wie gesagt, meines Wissens kann der Compiler keine Arrays dynamisch alloziieren, da lokale Variablen auf dem Stack abgelegt werden, der eben statisch festgelegten Platz pro Routine bietet.
Bisher habe ich es immer so gelernt, dass man wie gesagt so etwas mit new/malloc machen muss; falls ich falsch liege (du sagst ja, jetzt funktioniert es), warum? o.O
Zuerst: Das mit dem 2*size war ein Bug, Klammern hatten 2 Einträge gebraucht. In meiner geposteten Version ist das immernoch so, ich habe es aber bereits ausgebessert.

Ich bin mir nicht sicher warum es funktioniert, aber es funktioniert...

Ich will natürlich Fehler vorbeugen und wenn möglich, Fehlerquellen total eliminieren. Deswegen werde ich es auch mit malloc machen.

Es kann sein, dass es in meinem Beispiel funktioniert.
Denn der Eingabe-String hat ja eine feste Länge und dadurch kann der Compiler gleich die Größe des Arrays bestimmen, bei Eingaben könnte es Probleme geben. ;)
12/13/2010 20:53 MrSm!th#7
Ich meine, rein technisch wäre es schon möglich, dass zumindest lokale Arrays dynamisch alloziiert werden, aber es widerspricht den Sprachregeln von C++ und mit globalen wäre das nicht möglich, deswegen würde es mich schon sehr verwundern, wenn es dein Compiler macht.
Das mit der Länge des Strings bezweifle ich auch irgendwie, da der Compiler doch noch nicht den Rückgabewert von std::string::length() kennen kann, nur weil du ihn statisch initialisierst (bei dem char array sollte es mit sizeof gehen, da es ja ein array ist, nur bei pointern geht das damit nicht, aber naja, dass es mit strlen geht, ist mir auch ein rätsel).

Also wirklich, dein Code verwirrt mich o.o
12/13/2010 21:15 Shadow992#8
Quote:
Originally Posted by MrSm!th View Post
Ich meine, rein technisch wäre es schon möglich, dass zumindest lokale Arrays dynamisch alloziiert werden, aber es widerspricht den Sprachregeln von C++ und mit globalen wäre das nicht möglich, deswegen würde es mich schon sehr verwundern, wenn es dein Compiler macht.
Das mit der Länge des Strings bezweifle ich auch irgendwie, da der Compiler doch noch nicht den Rückgabewert von std::string::length() kennen kann, nur weil du ihn statisch initialisierst (bei dem char array sollte es mit sizeof gehen, da es ja ein array ist, nur bei pointern geht das damit nicht, aber naja, dass es mit strlen geht, ist mir auch ein rätsel).

Also wirklich, dein Code verwirrt mich o.o
Naja ich sagte ja reiner C-Code ist mir recht fremd und in C/C++ braucht man sehr selten new/malloc, das meiste macht man über Klassen (z.b. string o.ä.).

Quote:
Originally Posted by MrSm!th View Post
Ich meine, rein technisch wäre es schon möglich, dass zumindest lokale Arrays dynamisch alloziiert werden, aber es widerspricht den Sprachregeln von C++ und mit globalen wäre das nicht möglich, deswegen würde es mich schon sehr verwundern, wenn es dein Compiler macht.
Tja ist eben ein guter/schlechter Compiler, kommt darauf an von welcher Seite man es sieht. ;)

Ich habe den ganzen Code nocheinmal überarbeitet und eine "Interpret-Funkton" mit eingebaut, die im Grunde eine sehr einfache Skriptsprache ist, mit der man aber kleinere Sachen automatisieren kann.

Die Funktion Calculate unterstützt jetzt auch Konstante (Pi,Goldener Schnitt...) und man kann, falls nötig, noch zusätzliche Konstante über die Eingangsparamater setzen.
Die Funktion Calculate beherrscht nun auch XOR, Or, Modulo und And.

Btw. Wundert euch nicht, dass alle Arrays so "klein" sind, denn der gesamte genutzte Ram darf 4kB nicht übersteigen.
Ihr könnt die Arrays natürlich, wenn ihr die Funktionen auf einen Computer benutzt, vergrößern und somit auch größere Rechnungen genauer lösen. ;)

12/13/2010 21:19 MrSm!th#9
Quote:
Originally Posted by Shadow992 View Post
Naja ich sagte ja reiner C-Code ist mir recht fremd und in C/C++ braucht man sehr selten new/malloc, das meiste macht man über Klassen (z.b. string o.ä.).
lol hast du ne ahnung :D
klar, man braucht nix dynamisches, gibt ja klassen von anderen für alles ;OO

Quote:
Tja ist eben ein guter/schlechter Compiler, kommt darauf an von welcher Seite man es sieht. ;)
ich glaube nicht, dass er es wirklich tut, welchen hast du?
12/13/2010 21:24 Shadow992#10
Quote:
Originally Posted by MrSm!th View Post
lol hast du ne ahnung :D
klar, man braucht nix dynamisches, gibt ja klassen von anderen für alles ;OO
Ganz ehrlich, darüber bin ich sehr froh, dass viele Klassen mit new/malloc arbeiten ist klar, aber ich als Benutzer merke davon recht wenig. :P
Quote:
Originally Posted by MrSm!th View Post
ich glaube nicht, dass er es wirklich tut, welchen hast du?
MinGw, müsste eine "abgespeckte" GNU GCC Version sein (wenn ich richtig informiert bin). Ich habe den bei Code-Blocks ,sozusagen, mitgelieferten Compiler genommen. Der hat mir bisher immer sehr gute Ergebnisse geliefert. :D
12/13/2010 21:38 MoepMeep#11
Quote:
Originally Posted by Shadow992 View Post


Btw. Wundert euch nicht, dass alle Arrays so "klein" sind, denn der gesamte genutzte Ram darf 4kB nicht übersteigen.

Spielt da wer mit Mikrocontrollern rum? ^.^
12/13/2010 21:56 Shadow992#12
Quote:
Originally Posted by MoepMeep View Post
Spielt da wer mit Mikrocontrollern rum? ^.^
Jap, ich bin an die ganze Sache eigentlich vor knapp einem halben Jahr mit der Einstellung: "Ich mache einen Roboter." rangegangen, aber mir fehlen einfach die physikalischen Verständnisse für die ganzen Vorgänge (SteUp-Wandler,Spannungsverstärker[invertierend, nicht invertierend]...).
Mit dem bisschen Schul-Physik, kam ich da nicht weit, also dachte ich mir ich fang mit etwas "Leichtem" an. Nachdem ich überlegt habe, was ich machen könnte bin ich durch Zufall auf so ein Anfänger-Tutorial für irgendeine Sprache gestoßen und da hieß es dann: "Wir machen etwas einfaches, einen Taschenrechner.".

Und da ich den C/C++ Code von dem mathematischen Parser noch hatte, dachte ich mir ich mache mir einen Taschenrechner, der auch etwas fordert (Softwaremäßg, die Hardware ist in diesem Fall ja relativ einfach).

So far...

Btw. Ich bin bei dem maximal belegten Platz für den Ram (für Variablen) auf ca 3.5kB gekommen, stimmt das?