Merkwürdiger Fehler - tokenize [solved]



  • Hi,

    ich habe einen mir absolut völlig unbegreiflichen Fehler, an dem ich nun seit ein paar Stunden sitze. Ich habe die Funktion:

    vector<string> TokenizeString(const string& str, const string& delim)
    {
    	vector<string> tokens;
    	size_t p0 = 0, p1 = string::npos;
    	while(p0 != string::npos)
    	{
    		p1 = str.find_first_of(delim, p0);
    		if(p1 != p0)
    		{
    			string token = str.substr(p0, p1 - p0);
    			tokens.push_back(token);
    		}
    		p0 = str.find_first_not_of(delim, p1);
    	}
    	return tokens;
    }
    

    und möchte dann bei einer Dateneinlese entsprechend davon Gebrauch machen.
    Wenn ich dies wie folgt tue:

    for(int x = 0; x < tokens.size(); x++)
    			{
    				cout << "tokens["<<x<<"]: " << tokens[x] << endl;
    				cout << "token 0: " << tokens[0] << endl;
    			}
    

    ist das kein Problem. Möchte ich aber explizit auf den 1. Eintrag des Arrays zugreifen, also

    for(int x = 0; x < tokens.size(); x++)
    			{
    				cout << "tokens["<<x<<"]: " << tokens[x] << endl;
    				cout << "token 1: " << tokens[1] << endl;
    			}
    

    schlägt er fehl (" Segmentation fault (core dumped) "). Per "tokens[x]" funktioniert es aber..Ich verstehe einfach nicht, was geht da vor sich?? Ich habe ein Minimalbeispiel mal auf https://ufile.io/66rqt hochgeladen (kommt als main-file, klasse und makefile daher aber habe quasi alles unnötige entfernt).

    Ich bin für jede Hilfe sehr dankbar!



  • Allerblödste Frage zuerst:
    hast du sichergestellt, dass tokens.size() auch >= 2 ist, bevor du auf tokens[1] zugreifst? Ersetze es doch zur Sicherheit mal durch tokens.at(1) und schau mal, ob ne exception fliegt.

    Ansonsten: makefile+klasse+main != minimal. Hier kommen doch gar keine eigenen Klassen vor!



  • tokens[1] ist der zweite Eintrag des Arrays. Wenn dein Array nur einen Eintrag hat, knallt's eben.

    Zeit, den Umgang mit dem Debugger zu lernen. Ich tippe ja auf die Leerzeile am Anfang der Datei.



  • Hi,

    wenn ich die Schleife auf den Bildschirm ausgeben lasse, erhalte ich:

    ..
    tokens[0]: 1387
    tokens[1]: 1118
    tokens[2]:
    tokens[3]: EC
    tokens[4]: 199.946
    tokens[5]: 24.304
    tokens[6]: 24.335
    tokens[7]: 24.341
    tokens[8]: 24.315
    tokens[9]: 25.933
    tokens[10]: 25.954
    tokens[11]: 25.96
    tokens[12]: 25.944
    tokens[13]: 50.8
    tokens[14]: 71.5
    tokens[15]: 75.6
    tokens[16]: 0.08
    tokens[17]: 16.5496
    tokens[18]: 0.267361
    tokens[19]:
    tokens[20]: B-2
    tokens[21]: 1
    tokens[22]: 1
    tokens[0]: 1388
    tokens[1]: 1119
    tokens[2]:
    tokens[3]: EC
    tokens[4]: 199.965
    tokens[5]: 24.312
    tokens[6]: 24.331
    tokens[7]: 24.341
    tokens[8]: 24.317
    tokens[9]: 25.938
    tokens[10]: 25.95
    tokens[11]: 25.96
    tokens[12]: 25.944
    tokens[13]: 52.3
    tokens[14]: 72.1
    tokens[15]: 75.8
    tokens[16]: 0.24
    tokens[17]: 17.3488
    tokens[18]: 0.280272
    tokens[19]:
    tokens[20]: B-2
    tokens[21]: 1
    tokens[22]: 1
    tokens[0]: 1389
    tokens[1]: 1120
    tokens[2]:
    tokens[3]: EC
    tokens[4]: 199.959
    tokens[5]: 24.303
    tokens[6]: 24.325
    tokens[7]: 24.339
    tokens[8]: 24.32
    tokens[9]: 25.943
    tokens[10]: 25.957
    tokens[11]: 25.971
    tokens[12]: 25.961
    tokens[13]: 49.7
    tokens[14]: 71
    tokens[15]: 75.5
    tokens[16]: 0.29
    tokens[17]: 18.1744
    tokens[18]: 0.293609
    tokens[19]:
    tokens[20]: B-2
    tokens[21]: 1
    tokens[22]: 1
    ..

    Wenn ich mir die Größe von tokens per tokens.size() angeben lasse, ist es lediglich eine Größe von 1.
    Also dann wohl der 0te Eintrag vom Array. Würde erklären, warum er beim Zugreifen auf den 1ten Eintrag dann abbricht.
    Aber warum ist es dann in der Schleife kein Problem? Und wo genau liegt es vor allem??

    Ok. Ich packe es nochmal in eine einzelne Datei. Moment, bitte.



  • MFK schrieb:

    tokens[1] ist der zweite Eintrag des Arrays. Wenn dein Array nur einen Eintrag hat, knallt's eben.

    Zeit, den Umgang mit dem Debugger zu lernen. Ich tippe ja auf die Leerzeile am Anfang der Datei.

    Tatsache.. 😮 🙄

    editedit: Mal ne' blöde Frage: Aktiviere ich den debugger per Flag in der Makefile?
    Ok, also https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html dürften wohl die debugging-Optionen sein. Könnt ihr mir aus Erfahrung raten, welche denn nützlich sind? Eigentlich dachte ich ja, ich hätte welche, habe ja segmentation fault stets angezeigt bekommen 😕

    edit: Ahso, vielen Dank!


  • Mod

    Progressive schrieb:

    Aber warum ist es dann in der Schleife kein Problem?

    Weil x in deiner Schleife dank der Schleifenbedingung stets kleiner als tokens.size() ist. In diesem Fall also höchstens 0.

    Und wo genau liegt es vor allem??

    Wo liegt was?



  • SeppJ schrieb:

    Progressive schrieb:

    Aber warum ist es dann in der Schleife kein Problem?

    Weil x in deiner Schleife dank der Schleifenbedingung stets kleiner als tokens.size() ist. In diesem Fall also höchstens 0.

    Und wo genau liegt es vor allem??

    Wo liegt was?

    Richtig.. 😃

    oh man, so dumm.. 🙄

    Gut, dann kann ich ja jetzt wieder produktiv sein. Vielen Dank euch nochmal!


Log in to reply