Komme an Objekt im Vektor nicht heran



  • Hallo,

    ich habe einen Vektor aus Pointern zu Objekten. Auf diesen Vektor kann ich zugreifen, jedoch nicht auf die einelnen Objekte. Es funktioniert weder mit "vector->at(0)" noch mit "vector[0]".

    Hier ist ein Bild mit dem Codefragment und den Objekten:
    http://imageshack.us/photo/my-images/692/cppfehler.png/

    Wie komme ich an ein Objekt heran? Sie sind ja eindeutig da.

    Auf Wunsch kann ich auch noch gerne Code nachreichen.

    Schonmal vielen Dank
    Suimann



  • Auf diesen Vektor kann ich zugreifen, jedoch nicht auf die einelnen Objekte.

    Was heisst Du kannst nicht zugreifen? Exceptions? Compiler / Linker Error?...
    Der Code wäre nicht schlecht.

    Ausserdem: Warum nimmst Du std::vector<..> wenn Du .NET programmierst? Nimm doch List<..> und mache alle deine Typen zu .NET - verstehe nicht wie jmd. auf die Idee kommt C++ und C++/CLI zu mischen ausser es ist explizit für Interoperabilität.

    Simon



  • Was heisst Du kannst nicht zugreifen? Exceptions? Compiler / Linker Error?...

    Ich versuche ja einen DargAndDrop. Am Ende passiert allerdings gar nichts. Das Programm läuft weiter ohne, dass eine Meldung kommt und ohne dass die Funktion ausgeführt wurde.

    Auf Die Idee für sowas kommt man, wenn man in der Uni ANSI C++ lernt und zur Projektarbeit gesagt kriegt: "Programmiert in .NET". Jedoch nie etwas von .NET gehört hat.

    Hier mal der Code:

    #pragma once
    
    #include "Cards.h"
    #include "Robot.h"
    #include <vector>
    
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    
    namespace RoboRally {
    
    	/// <summary>
    	/// Summary for ChooseCards
    	///
    	/// WARNING: If you change the name of this class, you will need to change the
    	///          'Resource File Name' property for the managed resource compiler tool
    	///          associated with all .resx files this class depends on.  Otherwise,
    	///          the designers will not be able to interact properly with localized
    	///          resources associated with this form.
    	/// </summary>
    	public ref class ChooseCards : public System::Windows::Forms::Form
    	{
        private: System::Windows::Forms::Panel^  panel1;
        private: System::Windows::Forms::Panel^  panel2;
        private: System::Windows::Forms::Panel^  panel3;
        private: System::Windows::Forms::Panel^  panel4;
        private: System::Windows::Forms::Panel^  panel5;
    
        public:
    
            Robot* ptrRobot;
            int iBoxesToCheck;
            vector<card*>* vCards;
    
            ChooseCards(Robot* ptrRobot)
    		{
    			InitializeComponent();
                //
                // initialisiere Variablen
                //
                this->iBoxesToCheck = 5 - ptrRobot->burnedInCards();
                this->ptrRobot = ptrRobot;
                //
                // initialisiere Karten
                //
                ptrRobot->robGenerateCards();
                vCards = &ptrRobot->vCards;
    
                //
                // Bilder der Karten in die Pictureboxen setzen
                //
                this->pictureBoxCard1->ImageLocation = gcnew String(vCards->at(0)->getCardImage().c_str());
                this->pictureBoxCard2->ImageLocation = gcnew String(vCards->at(1)->getCardImage().c_str());
                this->pictureBoxCard3->ImageLocation = gcnew String(vCards->at(2)->getCardImage().c_str());
                this->pictureBoxCard4->ImageLocation = gcnew String(vCards->at(3)->getCardImage().c_str());
                this->pictureBoxCard5->ImageLocation = gcnew String(vCards->at(4)->getCardImage().c_str());
                this->pictureBoxCard6->ImageLocation = gcnew String(vCards->at(5)->getCardImage().c_str());
                this->pictureBoxCard7->ImageLocation = gcnew String(vCards->at(6)->getCardImage().c_str());
                this->pictureBoxCard8->ImageLocation = gcnew String(vCards->at(7)->getCardImage().c_str());
                this->pictureBoxCard9->ImageLocation = gcnew String(vCards->at(8)->getCardImage().c_str());
                this->pictureBoxCard10->ImageLocation = gcnew String(vCards->at(9)->getCardImage().c_str());
                //
                // Zahlen Der Karten anzeigen
                //
                this->labelCard1->Text = vCards->at(0)->getCardNumber().ToString();
                this->labelCard2->Text = vCards->at(1)->getCardNumber().ToString();
                this->labelCard3->Text = vCards->at(2)->getCardNumber().ToString();
                this->labelCard4->Text = vCards->at(3)->getCardNumber().ToString();
                this->labelCard5->Text = vCards->at(4)->getCardNumber().ToString();
                this->labelCard6->Text = vCards->at(5)->getCardNumber().ToString();
                this->labelCard7->Text = vCards->at(6)->getCardNumber().ToString();
                this->labelCard8->Text = vCards->at(7)->getCardNumber().ToString();
                this->labelCard9->Text = vCards->at(8)->getCardNumber().ToString();
                this->labelCard10->Text = vCards->at(9)->getCardNumber().ToString();
    
    		}
    // ======================================
    // Windows Forms code ausgeschnitten ...
    // ======================================
    
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 //
                 ChooseCards::Close();    //muss noch eine Prüfung der Eingaben enthalten!!
                 //
             }
    
    private: System::Void pictureBoxCard1_MouseDown(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e) {
                 pictureBoxCard1->DoDragDrop(0, System::Windows::Forms::DragDropEffects::Copy);
             }
    private: System::Void panel1_DragEnter(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e) {
                 e->Effect = DragDropEffects::Copy;
             }
    private: System::Void panel1_DragDrop(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e) {
                 this->ptrRobot->vCardsElected.at(0) = vCards->at((int) sender);
             }
    };
    

    Oben im Konstruktor komme ich noch an die Objekte und an die einzelnen Werte heran. Hier bei den DragDrop ereignissen jedoch nichtmehr.

    Suimann



  • Ein Fehler ist sicher, dass sender kein int ist!

    ➡
    Ich würde erst der Problematische Code umschreiben, break point setzen und dann debuggen (=durchsteppen). Hier ein paar kleine Änderungen, die helfen könnten.

    private: System::Void panel1_DragDrop(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e)
    {
        if (e->Data->GetDataPresent(int::typeid))
        {
            int index = (int) e->Data->GetData(int::typeid);
            card* theCard = vCards->at(index);
            this->ptrRobot->vCardsElected.at(0) = theCard;
        }
    }
    

    Auf Die Idee für sowas kommt man, wenn man in der Uni ANSI C++ lernt und zur Projektarbeit gesagt kriegt: "Programmiert in .NET". Jedoch nie etwas von .NET gehört hat.

    Fatal. Wieder mal so eine Uni. 😮



  • So habe das Ganze wie folgt geändert:

    private: System::Void panel1_DragDrop(System::Object^  sender, System::Windows::Forms::DragEventArgs^  e) {
                 //this->ptrRobot->vCardsElected.at(0) = vCards->at(0);
                 if(e->Data->GetDataPresent(int::typeid))
                 {
                     int index = (int) e->Data->GetData(int::typeid);
                     card* theCard = vCards->at(index);
                     this->ptrRobot->vCardsElected.at(0) = theCard;
    
                     ChooseCards::labelCard2->Text = gcnew String("Hallo");
                 }           
             }
    

    Ab Zeile 7 scheint das Programm einfach aus der Funktion herauszuspringen. labelCard2->Text wird nicht neu gesetzt und auch im Debug Modus werden alle Breakpoints, die nach der Zeile kommen ignoriert/nicht ausgeführt.
    Wenn ich diese Zeile jedoch auskommentiere, wird das Label verändert.

    Ich kann beim Debug also nicht Kontrollieren, ob etwas im vCardsElected drinsteht, bzw. wieder Werte herausholen.



  • suimann schrieb:

    Auf Die Idee für sowas kommt man, wenn man in der Uni ANSI C++ lernt und zur Projektarbeit gesagt kriegt: "Programmiert in .NET". Jedoch nie etwas von .NET gehört hat.

    Kannst du uns sagen, welche Uni genau?

    Zur Frage, hast du mal versucht ein Breakpoint vor der besagten Zeile zu setzen und "durchzusteppen" ( Bei VS im Normalfall F11)



  • Gib mal vor dem

    this->ptrRobot->vCardsElected.at(0) = theCard;
    

    die Grösse des vector's aus:

    vector::size_type size = this->ptrRobot->vCardsElected.size();
    

    Was hat size für ein Wert?



  • Rhombicosidodecahedron schrieb:

    Zur Frage, hast du mal versucht ein Breakpoint vor der besagten Zeile zu setzen und "durchzusteppen" ( Bei VS im Normalfall F11)

    Ja beim "durchsteppen" werden alle weiteren Zeilen übersprungen.

    theta schrieb:

    Was hat size für ein Wert?

    vector<card*>::size_type size = this->ptrRobot->vCardsElected.size();
                     ChooseCards::textBox1->Text = size.ToString();
    

    Damit bekomme ich dann den Wert 0 in der Textbox.



  • vector<card*>::size_type size = this->ptrRobot->vCardsElected.size(); 
                     ChooseCards::textBox1->Text = size.ToString();
    

    Damit bekomme ich dann den Wert 0 in der Textbox.

    Sehr schön - dann hast Du den Fehler gefunden! Du möchtest mittels std::vector<..>::at(0) auf das erste Element zugreifen - es existiert aber keines!

    Du musst diesen vector z.B. mit resize(..) (im Form1 Konstruktor) gleich gross machen wie der vCards vector.

    Simon

    [EDIT]
    Eigentlich sollte AFAIK eine std::out_of_range Exception geworfen werden beim Zugriff auf at(..) mit einem ungültigen Index.



  • Vielen Dank theta 🙂

    Ich habe jetzt beim Initialisieren einer Spielfigur den Vektor in die richtige Größe gebraucht und nun hab ich die Karte dort wo sie hin soll. 😃


Anmelden zum Antworten