Vector subscript out of range



  • Bei ausführen folgendes Codes kommt folgende Fehlermeldung:

    std::vector<int> numbers;
    	for(int n = 1; n <= Parameter[2]; ++n)
    	{                       
    	    numbers.push_back(n);
    	}
    	std::random_shuffle(numbers.begin(), numbers.end());
    
    	int Zahl[2000];
    	int Zahlen = 0;
    	String^ Keykette;
    	std::string Zeichen;
    	std::stringstream Reihe;
    	while (Zahlen < Parameter[2])
    	{
    		Zahlen ++;
    		std::stringstream convert;
    		Zahl[Zahlen] = numbers[Zahlen];
    		convert << Zahl[Zahlen];
    		Zeichen = convert.str();
    		convert.clear();
    		convert.str() = "";
    		Reihe << Zeichen.c_str();
    		Reihe << "|";
    	}
    	std::string Base = Reihe.str();
    	Reihe.clear();
    	Reihe.str() = "";
    	//richTextBox1->Text = String(BasePointer);
    	std::ofstream SaveKey;
    	SaveKey.open("Testkey.key",std::ios::out);
    	SaveKey << Base;
    	SaveKey.close();
    

    Fehlermeldung:

    Debug Assertion Failed

    Programm: ...
    File: D:\Programme\Microsoft Visual Studio 9.0\VC\include\vector
    Line: 779

    Expression: Vector subscript out of range

    ....

    Habe das Gefühl ,dass er mehr aus dem Vector lesen will als vorhanden ist.
    Parameter[2] ist 72



  • Dies steht in der Datei:

    526752|13|8|1233696|0|0|0|0|0|0|0|0|0|0|1232524|0|1232524|1232644|1232620|0|0|0|0|0|0|0|0|0|0|0|0|0|1233376|114614022|1232228|2050152206|-1|2045354333|2045354393|114613998|1232228|2050152206|-1|2045354333|2045354393|1232172|0|1232276|1232804|1233400|2045255066|114613934|512|1234188|1|1233376|1232240|2050147316|-1|2045255066|2045256313|114613894|512|1234188|1|1233376|1233908|2050093400|-1|2045243880|2046618582|114608122|

    also es hat nun geklappt mit Zahl[Zahlen-1] = numbers[Zahlen-1]

    diese Ausgabe irritiert mich etwas denn es sollte etwa so aussehen:

    25|1|56|52|37|9|72|.....|10|71|



  • Falls ich deinen Code richtig verstanden hab, ist er hier nochmal in kürzer (edit: und sollte funktionieren):

    // Zufällige Zahlen erzeugen
    std::vector<int> numbers( Parameters[2] );
    for( size_t i=0; i<numbers.size(); ++i )
        numbers[i] = i+1;
    std::random_shuffle( numbers.begin(), numbers.end() );
    
    // Version A, schreibt direkt in die Datei
    std::ofstream SaveKey( "Testkey.key", std::ios::out );
    for ( size_t i=0; i<numbers.size(); ++i )
        SaveKey << numbers[i] << '|';
    
    // Version B, setzt den String vorher zusammen
    std::stringstream ss;
    for ( size_t i=0; i<numbers.size(); ++i )
        ss << numbers[i] << '|';
    std::ofstream SaveKey( "Testkey.key", std::ios::out );
    SaveKey << ss.str();
    

    edit 2: Wobei sich die Schleife in Version A noch durch

    std::copy( numbers.begin(), numbers.end(), std::ostream_iterator<int>(SaveKey,"|") );
    

    ersetzen ließe.



  • Tim06TR schrieb:

    also es hat nun geklappt mit Zahl[Zahlen-1] = numbers[Zahlen-1]

    diese Ausgabe irritiert mich etwas

    Vielleicht hattest du vergessen, das "-1" auch in der Zeile darunter hinzuzufügen, bei convert << Zahl[Zahlen]; ?



  • Danke jetzt geht es FEHLERLOS
    Ganz nebenbei ist es 100 mal so kurz

    ich muss mich eben noch mit MFC vertraut machen, ich hab bisher nur Standart und VCL geschrieben

    EDIT: Danke und ich nahm Variante A, da das bei einem höheren Param (1920) schon etwas heftiger wird mit dem Stack.


Anmelden zum Antworten