Veröffentlicht 6. November 200321 j Hallo, kennt jemand von euch eine Funktion, Möglichkeit einen arithmetischen ausdruckt der in einem string gespeichert ist auszuführen. Als Beispiel 10*53,2+10%
6. November 200321 j Ne, eine direkte "Funktion" wird es wahrscheinlich nicht geben. Dazu musst Du erstmal einen Parser schreiben, der auf (nimmt man üblicherweise bei Klammerstrukturen) rekursiven Stackaufrufen basiert. Google mal mit "Klammerausdrücken Stack". Wirst bestimmt fündig
6. November 200321 j Spirit ist eine Bibliothek, die sich mit Parsern beschäftigt. Man kann damit die Grammatikregeln sozusagen gleich im Quellcode schreiben: http://spirit.sourceforge.net/ Ist aber für diesen Anwendungsfall wahrscheinlich Overkill.
6. November 200321 j Hallo, je nach Betriebssystem kann man das auch wesentlich einfacher haben: #include <stdio.h> #include <stdlib.h> #define CMDSIZE 1024 int main() { char cmd[CMDSIZE]; char buf[CMDSIZE]; char *arith="10*53+10"; FILE *ptr; sprintf(cmd,"echo \"%s\"|bc -l", arith); if ((ptr = popen(cmd, "r")) != NULL) { if (fgets(buf, CMDSIZE, ptr)) printf("%s", buf); } pclose(ptr); return 0; } [/php] (Quick & Dirty, ohne große Fehlerabfrage, usw). Der arithmetische Ausdruck sollte natürlich der "bc" Syntax entsprechen (abgesehen davon ist mir etwas schleierhaft, was das + "10%" soll? 10% von was? Nic
6. November 200321 j Autor Original geschrieben von nic_power Hallo, je nach Betriebssystem kann man das auch wesentlich einfacher haben: #include <stdio.h> #include <stdlib.h> #define CMDSIZE 1024 int main() { char cmd[CMDSIZE]; char buf[CMDSIZE]; char *arith="10*53+10"; FILE *ptr; sprintf(cmd,"echo \"%s\"|bc -l", arith); if ((ptr = popen(cmd, "r")) != NULL) { if (fgets(buf, CMDSIZE, ptr)) printf("%s", buf); } pclose(ptr); return 0; } [/php] (Quick & Dirty, ohne große Fehlerabfrage, usw). Der arithmetische Ausdruck sollte natürlich der "bc" Syntax entsprechen (abgesehen davon ist mir etwas schleierhaft, was das + "10%" soll? 10% von was? Nic [/b] also so funktioniert es auf dem Windows 2000 nicht wirklich
6. November 200321 j Ich würde zeichen für zeichen durch das array gehen, wenn das aktuelle zeichen ne zahl ist, zahl merken, und so weiter, bis es mal keine Zahl ist. Die gemerkte Zahl dann atoi in einen vector<int> stecken. Das nächste Zeichen ist dann wohl ein Operator, den dann in einen vector<char> merken. Und wenn du das hast einfach durch den vector<int> laufen und mit dem entsprechenden operator (switch-case) im vector<char> behandeln. Sollte nicht allzuschwer sein.
6. November 200321 j Hallo, so einfach ist das nicht, Du kannst einen arithmetischen Ausdruck nicht linear von links nach rechts abarbeiten. Das fängt schon bei einfachen Operationen an, da es mathematische Regeln gibt, die eingehalten werden müssen (von anderen Aspekten wie der Klammerung mal ganz abgesehen). Das heisst, Du wirst nicht drum rum kommen, einen vernünftigen Parser (je nach Komplexität der Ausdrücke) zu schreiben. Falls die oben genannten Möglichkeiten nicht in Frage kommen, würde ich dafür auch lex und yacc zurückgreifen. Diese erzeugen aus einer BNF einen passenden Parser (und den Code dazu). Nic
6. November 200321 j Achso, stimmt ja, das hab ich vergessen zu Berücksichtigen. Danke für deine Berichtigung.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.