Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 18:32

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



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

Discussion on C++ - "Terme-Parser" in C - "Terme-Parser" umwandeln within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
C++ - "Terme-Parser" in C - "Terme-Parser" umwandeln

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.
Shadow992 is offline  
Old 12/11/2010, 14:59   #2
 
elite*gold: 20
Join Date: Sep 2006
Posts: 1,100
Received Thanks: 184
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.
Bot_interesierter is offline  
Thanks
1 User
Old 12/11/2010, 15:12   #3
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
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.
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:

Shadow992 is offline  
Old 12/12/2010, 21:04   #4


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,905
Received Thanks: 25,407
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
MrSm!th is offline  
Thanks
1 User
Old 12/12/2010, 22:06   #5
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
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 ._.
MoepMeep is offline  
Thanks
1 User
Old 12/13/2010, 20:43   #6
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
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.
Shadow992 is offline  
Old 12/13/2010, 20:53   #7


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,905
Received Thanks: 25,407
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
MrSm!th is offline  
Old 12/13/2010, 21:15   #8
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
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.

Shadow992 is offline  
Old 12/13/2010, 21:19   #9


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,905
Received Thanks: 25,407
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
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?
MrSm!th is offline  
Old 12/13/2010, 21:24   #10
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
Quote:
Originally Posted by MrSm!th View Post
lol hast du ne ahnung
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.
Shadow992 is offline  
Old 12/13/2010, 21:38   #11
 
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
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? ^.^
MoepMeep is offline  
Old 12/13/2010, 21:56   #12
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
Quote:
Originally Posted by MoepMeep View Post
Spielt da wer mit Mikrocontrollern rum? ^.^
***, 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?
Shadow992 is offline  
Reply


Similar Threads Similar Threads
Kann mir bitte jemmand eine Hmachi HP erstellen """""SOS HELP""""
09/15/2010 - Metin2 Private Server - 11 Replies
SO wie der Titel schon sagt ich suche einen der mir per Teamviwer eine hp machen kann habe schon alles ausprobiert aber es klappt nie!!!! PLS HELP...



All times are GMT +1. The time now is 18:34.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.