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, dasstokens.size()
auch >= 2 ist, bevor du auftokens[1]
zugreifst? Ersetze es doch zur Sicherheit mal durchtokens.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 bekommenedit: Ahso, vielen Dank!
-
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!