Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.11.2004, 17:12 Titel: STL String durchlaufen |
|
|
Also ich schreib so ne Art Parser und will aus ner Funktion Zahlen ermitteln. Also such ich zuerst nach enem * Zeichen weil ja Punkt vor Strich. Nun brauc ich die Start bzw. Endpositionen der Zahlen links und rechts. Meine Idee war es jeweils nach links bzw. rechts nach dem näcsten rechenzeiche zu suchen, also nach dem nächsten Zeichen, welches nicht mehr zu der Zahl dazugehört. Wie macht man das am besten? Wenn es nur * gäb könnt ich ja find() benutzen, aber es ist ja eine Suche nach dem nähsten Zeichen aus der Menge der Rechenzeichen relativ zur ermittelten Rechenzeichenposition (in diesem Fall erst einmal nur ein *) nach rechts bzw. links gehend. Und dafür hab ich keine Standardfunktion gefunden (wunder, wunder)
Mein Ansatz mit den [] funktioerte auch nicht so recht:
Code: |
while( (iPosition=sFunktion.find(TEXT("*")))!=unistring::npos)
{
//indexnummer des Operators
int iTempPosition=iPosition;
//Da das mit [] bei strings anscheinend irgendwie nicht geht, nimm ich eben char!
const char* cZahl=new char[sFunktion.length()];
cZahl=sFunktion.c_str();
for(iTempPosition--; iTempPosition>0; iTempPosition--)//nach vorne (rückwärts) laufen, um anfang der Zahl zu finden
{
if(TestCalcChar(cZahl[iTempPosition-1]))
{
break;
}
}
delete[] (char*)cZahl;
|
Das oben ist mein Ansatzt mit einem Char Array, welches aber den Programmabsturz nach sich zog. Die Version mit den Stirng ist mit der oben eigentlich identisch, sFunktion wurde halt mit cZahl vertauscht. Bei der Stringverison gab es keine Abstürze, allerdings hörte die For Schleife erst auf wenn der String zu ende war, nicht wenn ein Rechnezeichen gefunden wurde. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 16.11.2004, 17:22 Titel: |
|
|
Hey, am einfachsten ist es, wenn du ersteinmal den String nach Operatoren und Zahlen aufsplittest und danach sortierst. Etwa so:
Aus "3 + 4 * 5" machst du:
3, "+", "4", *, "5
Danach sortierst du Operatoren und Zahlen so, wie du es rechnen würdest:
*, +
4, 5, 3
Dann nimmst du das erste Rechenzeichen und die ersten zwei Zahlen, danach das zweite Rechenzeichen, das erste Zwischenergebnis und die nächste Zahl, usw. So sollte es am einfachsten gehen und du musst nicht umständlich im String rumwurschteln. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.11.2004, 17:44 Titel: |
|
|
ok, und wie würde das aufsplitten praktisch aussehen? da muss ich doch auch nach den unterschidlichen Zeichen suchen, oder wie? und wenn ich das wüsste, könnte ich es doch auch nahc meinem ersten Ansatzt machen? _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 16.11.2004, 17:58 Titel: |
|
|
Du kannst dir ja mal das hier anschaun: http://www.dragonfx.de/download/parser.zip
Das macht genau das was du möchtest, is leider kaum kommentiert. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.11.2004, 18:03 Titel: |
|
|
hm, erstens Blick ich da net so gaanz durch, und zweitens sieht das so aus, als ob das irgendwie gar nix mit stl strings zu tun hätte. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 16.11.2004, 18:07 Titel: |
|
|
Wo ist das Problem nen stl string in char* umzuwandeln, ausserdem wars ja nurn Tip, ob dus nutzt hängt von dir ab. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 16.11.2004, 18:10 Titel: |
|
|
hm ich wollt mich halt mit diesem Projekt auch ein bischen mehr in die Welt von STl einarbeiten. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 16.11.2004, 18:10 Titel: |
|
|
Ich habe mir den Code nicht ganz angeguckt aber nur mal die Header und daher guter Rat: willste was lernen weg mit dem Code!
Allein schon sowas
Code: | //extern Parser functions
#define DFXPARSERGLOBALBEGIN
#define DFXPARSERGLOBALEND
#define DFXPARSERFUNCTION(fname,narg,nusage) inline double DFXParser_##fname(char argc, double *arg, LPVOID plug,unsigned int *line, unsigned int *word)
class CDFXParser;
#include "Parser.pcl"
#undef DFXPARSERFUNCTION
#undef DFXPARSERGLOBALBEGIN
#undef DFXPARSERGLOBALEND
#define DFXPARSERGLOBALBEGIN if(0){
#define DFXPARSERGLOBALEND } |
sollte einen Abstoßen!
Kollege HummeSikkins aus dem C++Forum hat einen sehr guten Beitrag ins FAQ gestopft:
http://www.c-plusplus.de/forum/viewtopic.php?t=39468
- Patrick _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 16.11.2004, 18:18 Titel: |
|
|
*hust* Was du von defines hälst hast du schon oft genug kund getan. Der Code ist tierisch alt und ich nutzte nun Lua anstatt was eigen entwickeltes.
Das defines nicht so das wahre sind is mir klar, aber ab und zu ein bissl macromagic macht Spass. (Für das nun folgende bissige Kommentar von dir, lass es mich in der FH internen Sprache sagen: m0wl ) _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 49 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 16.11.2004, 18:22 Titel: |
|
|
Es gibt einen Tokenizer bei Boost. |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 16.11.2004, 18:36 Titel: |
|
|
Wenn du Leerzeichen zwischen den einzelnen Komponenten hast kannst du das mit folgendem Algo erledigen:
Code: |
// Geklaut
void Tokenize(vector<string> &Tokens, const string &String, const string &Delimiters)
{
string::size_type lastPos(String.find_first_not_of(Delimiters, 0));
string::size_type pos(String.find_first_of(Delimiters, lastPos));
while(string::npos != pos || string::npos != lastPos)
{
Tokens.push_back(String.substr(lastPos, pos - lastPos));
lastPos = String.find_first_not_of(Delimiters, pos);
pos = String.find_first_of(Delimiters, lastPos);
}
}
vecor<string> myTokens;
string rechnung = "21 + 13 * 74";
Tokenize(myTokens, rechnung, " ");
|
Danach hast du ein Array mit allen einzelnen Komponenten:
Code: |
myTokens[0] -> "21"
myTokens[1] -> "+"
myTokens[2] -> "13"
myTokens[3] -> "*"
myTokens[4] -> "74"
|
Dann musst du das ganze nur noch nach Operatoren und Zahlen sortieren und kannst loslegen mit dem rechnen. ;) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
xardias JLI Master

Alter: 39 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 16.11.2004, 18:59 Titel: |
|
|
boost::spirit kann ich nur empfehen. Wenns ums parsen von texten geht kenne ich nichts besseres :] |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 16.11.2004, 22:06 Titel: |
|
|
Im 3. Kapitel des Stroustrups wird recht ausführlich die Entwicklung eines Parsers behandelt, falls du da irgendwie rankommst...  |
|
Nach oben |
|
 |
|