std::out_of_range was mache ich falsch ?



  • Ok das ist mein erster Post hier, also bitte nachsichtig sein wenn ich gegen irgendwelche Forenregeln verstoße oder ähnliches.

    Ich schreibe gerade eine Funktion mit der ich eine .txt Datei zeilenweise als String einlese, diesen string dann splite ( ":" als delemiter) und dann in einem std::vector<float> speichere.

    folgende for-schleife habe ich als fehlerquelle lokalisiert.

    this->split(buf, delemiter, result) // das ist die split funktion die einen vector von strings in result (vector<string> & result) liefert.

    for(int j = 0; j < (result.size()); ++j) //++j weil der erste wert nicht benötigt wird
    {
    string str = result.at(j);
    istringstream in(str);
    in >> f;
    v.at(j) = f;
    }

    bei einer größe von 12 für result werden alle 12 werte in float umgewandelt und auch in den vector gepackt. aber dann hängts.

    fehlermeldung in console: terminate called after throwing an instance of 'std::ou_of_range' what(): vector::_M_range_check
    Aborted (core dumped)



  • 1. Benutze bitte cpp-Tags um deinen Code
    2.

    KA51O schrieb:

    for(int j = 0; j < (result.size()); ++j) //++j weil der erste wert nicht nötig
    

    Der Kommentar zeugt von einem großen Missverständnis. Schau dir nochmal die Semantik der for-Schleife und von Post- und Inkrementoperator an.

    KA51O schrieb:

    v.at(j) = f;
    

    Mach daraus ein

    v.push_back (f);
    

    v hat zu dem Zeitpunkt noch kein j-tes Element, also häng das Ergebnis einfach hinten dran.



  • ups peinlich peinlich.

    aber das mit .push_back() hatte ich zuerst. dann kommt die fehlermeldung segmentation fault (core dumped).

    den vector v hab ich folgender maßen initialisiert: vector<float> v(4096) deshalb dachte ich das der schonmal für 12 werte ausreichend groß ist.



  • Poste doch bitte mal das, was du da GENAU hast.
    Weil ich sehe hier auch nirgends, dass du was mit einem txt File machst. 🙄



  • SampleBag::Bag SampleBag::read(char *filename)
    {
    	SampleBag::Bag b;
    	vector<float> v(4096);
    	Sample::Sample *s = new Sample();
    	float f;	
    
    	if(!(filename == ""))
    	{
    		FILE *fp = fopen(filename,"r");
    		char buf[4096];
    		int i = 0;
    		while(fgets(buf,sizeof(buf),fp))
    		{
    			char delemiter = *":";
    			vector<string> result;	 		
    			this->split(buf, delemiter, result);
    			for (int j = 0; j < (result.size()-1); ++j)
    			{
    				string str = result.at(j);
    				istringstream in(str);
    				in >> f;
    				v.at(j) = f;
    /*test*/	//std::cout << f << result.size() << v.at(j) << std::endl;
    /*test*/	//cout << "sample: " << this->m_container[i].m_sample.m_vectors[0] << " = ";
    /*test*/	//std::cout << f << std::endl;				
    			}
    			s->add(v);
    			this->add(s,i);
    			v.clear();
    			i++;
    		}
    		fclose(fp);
    	cout << "sample: " << this->m_container[i].m_sample.m_vectors.back() << endl;
    	cout << f << std::endl;
    	}
    	return b;
    }
    

    achso und SampleBag::Bag b ist im endeffekt das: vector<vector<float>>



  • ok hat sich erledigt.

    danke .filmor und drakon

    war ein problem in der funktion add von SampleBag

    manchmal hilft es schon wenn man anderen sein Problem erzählt und aufeinmal fällt einem selber die lösung ein. 😉



  • KA51O schrieb:

    den vector v hab ich folgender maßen initialisiert: vector<float> v(4096) deshalb dachte ich das der schonmal für 12 werte ausreichend groß ist.

    Mit

    std::vector<float> v(4096);
    

    erstellst du aber 4096 und nicht 12 Elemente. Wieso meinst du 2^12 Elemente? Oder hab ich dich falsch verstanden?



  • die Datei mit der ich teste hat 12 Werte die Funktion soll aber für "beliebig" viele werte funktionieren. wenn ich immer nur eine feste anzahl werte hätte sähe die funktion anders aus.



  • KA51O schrieb:

    std::vector<float> v(4096);
    

    die Datei mit der ich teste hat 12 Werte die Funktion soll aber für "beliebig" viele werte funktionieren. wenn ich immer nur eine feste anzahl werte hätte sähe die funktion anders aus.

    naja - trotzdem reicht halt ein

    std::vector <float> name;
    

    die 4096 heißt, dass du für 4096 floats speicher reservierst - das macht vector sonst immer von allein für dich - kann aber halt sein, dass er erst nur 5 reserviert und dann noch mal umkopieren muss, wenn du nen 6. brauchst - das sollte aber in der größenordnung zu vernachlässigen sein - und ist in meinen augen besser, als 20KB speicher einfach so zu blockieren - auch wenn das (heutzutage) nicht mehr wirklich viel ist...

    bb ^^



  • KA51O schrieb:

    die Datei mit der ich teste hat 12 Werte die Funktion soll aber für "beliebig" viele werte funktionieren. wenn ich immer nur eine feste anzahl werte hätte sähe die funktion anders aus.

    Dann könntest du gerade so gut ein statisches Array mit der Dimension 4096 erstellen. Der Vorteil an dynamischen Containern wie std::vector besteht ja unter anderem gerade darin, dass seine Grösse zur Laufzeit verändert werden kann.



  • ok, ok ruhig bleiben leute ^^.

    ich stells wieder um. hatte das eh nur gemacht wegen dem out of range error.
    dachte das würde es vielleicht beheben.

    aber danke für die rege anteilnahme an meinem problem. hätte nicht gedacht das man hier so schnell so viel hilfe bekommt. werde in nächster zeit häufiger auf dieses Forum zurückgreifen.

    👍

    ich poste morgen nochmal die funktion wie sie jetzt aussieht. bin gerade nicht an meinem Festrechner


Log in to reply