bigpoint Geschrieben 6. November 2003 Geschrieben 6. November 2003 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% Zitieren
gugelhupf Geschrieben 6. November 2003 Geschrieben 6. November 2003 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 Zitieren
Klotzkopp Geschrieben 6. November 2003 Geschrieben 6. November 2003 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. Zitieren
nic_power Geschrieben 6. November 2003 Geschrieben 6. November 2003 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 Zitieren
bigpoint Geschrieben 6. November 2003 Autor Geschrieben 6. November 2003 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 Zitieren
FinalFantasy Geschrieben 6. November 2003 Geschrieben 6. November 2003 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. Zitieren
nic_power Geschrieben 6. November 2003 Geschrieben 6. November 2003 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 Zitieren
FinalFantasy Geschrieben 6. November 2003 Geschrieben 6. November 2003 Achso, stimmt ja, das hab ich vergessen zu Berücksichtigen. Danke für deine Berichtigung. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.