JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=73614bd8feb1e8ddd29ae2c84ea54a20Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

STL String durchlaufen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 16.11.2004, 17:12    Titel: STL String durchlaufen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 17:22    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 17:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 16.11.2004, 17:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 18:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 16.11.2004, 18:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 18:10    Titel: Antworten mit Zitat

hm ich wollt mich halt mit diesem Projekt auch ein bischen mehr in die Welt von STl einarbeiten.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 18:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 16.11.2004, 18:18    Titel: Antworten mit Zitat

*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 Wink)
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 18:21    Titel: Antworten mit Zitat

*lol* Very Happy
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 49
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 18:22    Titel: Antworten mit Zitat

Es gibt einen Tokenizer bei Boost.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 18:25    Titel: Antworten mit Zitat

Christian Rousselle
Jo der ist relativ gut. Boost bietet einfach sehr viele gute Sachen wie z.B. den dirstream und den lexical_cast Smile

Wer eine erweiterung der STL haben will: www.boost.org
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 18:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
xardias
JLI Master


Alter: 39
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 18:59    Titel: Antworten mit Zitat

boost::spirit kann ich nur empfehen. Wenns ums parsen von texten geht kenne ich nichts besseres :]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
GreveN
JLI Master


Alter: 38
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 16.11.2004, 22:06    Titel: Antworten mit Zitat

Im 3. Kapitel des Stroustrups wird recht ausführlich die Entwicklung eines Parsers behandelt, falls du da irgendwie rankommst... Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum