[Gelöst] std::vector<std::vector<bool > > bringt Fehler



  • Hallöchen 🙂

    ich hoffe, ich habe mich nicht verguckt im Forum ^^"
    Mein Problem:
    Ich muss einen schon geschriebenen Code(eine dll) nachvollziehen und mit ein paar Beispielen füttern, damit ich auch die ergebnisse verstehe.

    Dabei hat der ursprüngliche Programmierer für ein bool Array diese Deklarierung verwendet.

    std::vector<std::vector<bool > > matrix
    

    Mein Problem sobald ich es so einbinden will in meine Testklasse kann es nicht mehr kompiliert werden; bzw. das Array wird gar nicht erst befüllt, wenn ich zB es über eine Schleife nur mit "false" befüllen will.

    // Zurücksetzen AM
    	for (int i = 0; i < iNNodes-1; i++){
    		for (int j = i + 1; j < iNNodes; j++){
    			matrix[i][j] = false;
    		}
    	}
    

    Beide Quellcode-Stückchen sind noch aus dem Original-Quellcode, daher dachte ich es würde keinen Fehler bringen.
    Aber der Kompiler sagt mir dann immer ich bin "out of range" .__."

    Wenn ich dem Array aber dann Dimensionen zuweise zB

    bool matrix[12][12]
    

    klappt alles... (was mir logisch erscheint).

    Ich stehe leider am Anfang meiner C++ "Karriere" (hab bisher nur (ein wenig)in C# /Java programmiert), und komme auch mit der Deklaration von "matrix" im Original-Quellcode nicht ganz klar.

    Vielleicht könnt ihr mir ja einen Denkanstoß geben 🙂
    Das wäre schön.
    An sich kann ich ja für den Test ersteinmal die vorgegebene Dimension verwenden, aber irgendwann muss ich meinem Betreuer ja auch mal "handfeste" Beispiel liefern, und die Dimension nicht immer nur von Hand füllen 🙂

    Viele Grüße.



  • du musst dem Vektor noch eine Groesse zuweisen. Der out_of_range weisst dich klar darauf hin, dass dein Vektor leer ist.



  • otze_logout schrieb:

    Der out_of_range weisst dich klar darauf hin, dass dein Vektor leer ist.

    Das ist mir schon klar, ein bisschen Ahnung habe ich und im debuggen habe ich ja gesehen, dass er das Array leer ist.

    Da muss ich nun mal fragen: Ich verstehe es schon richtig, dass ich

    std::vector<std::vector<bool>>matrix
    

    als 2d Array auffassen kann?
    Mein Arbeitskollege meinte ich kann es wie eine Art Liste auffassen und muss nicht unbedingt eine Dimension angeben.

    Ich frage mich ja nun, warum, wenn ich das Array wie in meinem obigen zweiten Codeauszug mit false befülle, es einfach die Werte nicht annimmt? Im Debuggen überspringt er komplett den Abschnitt.



  • Ein Array ist zu beginn leer, bis du resize() aufgerufen hast oder im Constructor mit den richtigen Werten initialisierst. Oder bis du push_back aufrufst, oder insert...

    ach lies die Referenz 🙂

    http://www.sgi.com/tech/stl/Vector.html


  • Mod

    Norchen schrieb:

    Da muss ich nun mal fragen: Ich verstehe es schon richtig, dass ich

    std::vector<std::vector<bool>>matrix
    

    als 2d Array auffassen kann?
    Mein Arbeitskollege meinte ich kann es wie eine Art Liste auffassen und muss nicht unbedingt eine Dimension angeben.

    2D-Array würde ich das Konstrukt nicht nennen. Der Kollege ist schon auf der richtigen Spur. Eine Liste von (unterschiedlich langen**!**) Zeilen trifft es wohl ganz gut. Unter 2D-Array versteht man ja eher, dass die Zeilenlänge fix ist und die Zeilen auch geordnet im Speicher stehen. Das entspräche einem vector (oder statischem Array bei fester Zeilenzahl) von einer statischen Arrayklasse (z.B. std::array).

    Ich frage mich ja nun, warum, wenn ich das Array wie in meinem obigen zweiten Codeauszug mit false befülle, es einfach die Werte nicht annimmt? Im Debuggen überspringt er komplett den Abschnitt.

    Computer machen keine Fehler und überspringen nicht einfach so Programmteile. Dein vector<vector> hat weder Zeilen, noch haben diese Zeilen eine Länge. Wenn du trotzdem darauf zugreifst, passiert eben undefiniertes Verhalten. Das darf auch einfach sein, dass nichts passiert. Es darf auch sein, dass dadurch der Ätna ausbricht.



  • btw: von std::vector<bool> wird zu recht abgeraten... kannst du evtl auf std::bitset umsteigen? (zur compilezeit bekannte dimension)
    ansonsten musst du halt extrem aufpassen, welche funktionen du aufrufst, in denen am vector umhermanipuliert wird.



  • otze schrieb:

    Ein Array ist zu Beginn leer, bis du resize() aufgerufen ...

    Vielen Dank für den Hinweis; ich habe nun auch nochmal nach intensiver suche in diesem unübersichtlichen Code den Initialisierer gefunden: mit resize ❤
    (war eben ein bisschen tricky sich durchzufinden x.x)
    Den Befehl resize kannte ich noch nicht, und dachte auch ich benötige ihn nicht...
    Wieder etwas gelernt 🙂

    Und auch ganz vielen lieben Dank für die anderen Hinweise/Anregungen, das hilft mir definitv weiter 🙂

    Liebe Grüße


Anmelden zum Antworten