zweidimensionaler vektor Elemente spiechern schlägt fehl



  • ich habe folgende situtation...

    typedef struct{
     double x;
     double y;
    } vector_type_2d;
    
    typedef struct
      blah...
      blah...
      std::vector<vector_type_2d> pos; //polygon punkte
      std::vector<std::vector<vector_type_2d> > bounding_boxes; //genau 5 elemente
    } shape_type_2d;
    
    vector_type_2d tmp_vector2d;
    shape_type_2d * shape_2d;
    
    ...
    
    shape_2d->bounding_boxes[i].push_back(tmp_vector2d); //das kracht.....
    

    Ich hoffe ich konnte das Problem verdeutlichen. Ich denke bounding_boxes[i] gibts nicht, somit kann auch nichts "gepuscht" werden. Aber wie gehts??
    Also ich würde gerne in einer Loop für mehrere Polys dann die Bounding Box erzeugen...

    Gruß
    Franky



  • FrankTheFox schrieb:

    Ich hoffe ich konnte das Problem verdeutlichen.

    Du hast nur ein wenig Code gepostet, der abgesehn vom altbackenen C-Style "typedef struct ..." ganz normal und unproblematisch ist.
    Warums an der bezeichneten Stelle kracht geht aus dem Code nicht hervor.

    warum es krachen könnte:
    - i ist negativ
    - i ist >= bounding_boxes.size(), dann hast du evtl. vergessen bounding_boxes zu initialisieren bzw. mit einem resize() oder entsprechend vielen push_backs die richtige Größe zu geben. Bevor du an den (i+1)ten vector innerhalb von bounding_boxes etwas anhängen kannst, muss es in bounding_boxes schließlich erstmal mindestens i+1 vectoren geben 😉



  • Hi,

    i ist "0". Aber ich hatte vergessen den vector zu initialiseren.
    Es gab kein Element "0". Ja das "late struct Zeugs muß ich leider mit rumschleppen, da die header benötigt werden. Also C-Code mit C++ Code umgeben, aber die Struct nutzen, da dort die Daten stehen...

    vector_type_2d tmp_vector2d;
    std::vector< vector_type_2d > temp_box_positions;
    //Berechne erste Position der Bounding Box...
    //und speichern...
    temp_box_positions.push_back(tmp_vector2d);
    //Berechne zweite Position der Bounding Box...
    //und speichern...
    temp_box_positions.push_back(tmp_vector2d);
    //Berechne dritte Position der Bounding Box...
    //und speichern...
    temp_box_positions.push_back(tmp_vector2d);
    //Berechne vierte Position der Bounding Box...
    //und speichern...
    temp_box_positions.push_back(tmp_vector2d);
    //Berechne fünfte Position der Bounding Box... (ist gleich der ersten)
    //und speichern...
    temp_box_positions.push_back(tmp_vector2d);
    //dann ...
    shape_2d->bounding_boxes.push_back(temp_box_positions);
    

    Jetzt hängt der Code nicht mehr..

    Gruß
    Franky



  • Bei vernünftigen STL-Implementierungen gibt es im Debug-Modus Assertions, die dich sofort an die fehlerhafte Codestelle führen (du musst höchstens noch das richtige Frame finden). Ausserdem gibt es oft aussagekräftige Fehlermeldungen zur Laufzeit. Ich würde mich in Zukunft vermehrt auf solche Hilfsmittel achten, diese stellen nämlich einen der grossen Vorteile von Containern gegenüber rohen C-Arrays dar.



  • Hi,

    ja Du hast völlig recht, aber der Code ist schon seit geraumer Zeit gewaschsen, so das zum Teil noch Fortran oder ADA-Code genutzt wird. Ja dann kam C und jetzt C++. Vielleicht sollte der Code komplett neu aufgesetzt werden, aber so ist das manchmal. Tja und ich bin froh wenn ich mich durchgewühlt und neue Funktionen eingebaut habe und alles fehlerfrei läuft.

    Gruß
    Franky



  • Ich meinte damit eher, dass wenn du die STL nutzt, auch ihre Laufzeitunterstützung bei vielen Compilern berücksichtigen solltest. 😉



  • Nexus schrieb:

    Bei vernünftigen STL-Implementierungen gibt es im Debug-Modus Assertions...

    Genau das habe ich mit "ja Du hast völlig recht" gemeint 🙂

    FrankTheFox schrieb:

    aber der Code ist schon seit geraumer Zeit gewachsen,...

    wegen ...

    pumuckl schrieb:

    altbackenen C-Style "typedef struct ...

    Gruß
    Franky



  • Ich meinte die STL-Implementierung (der verwendeten C++-Standardbibliothek) und nicht euren Code... 🙂



  • Jupp, genau das habe ich gemeint! Die STL nicht den Code...


Anmelden zum Antworten