vector, string und c_str() Probleme



  • hi,
    ich habe folgenden Code geschrieben(eine Funktion eines Dialog, aber da liegt das Problem sicher nicht, deswegen habs ich es auch hier rein gepostet):

    void GebDialog::OnDblclkList2() 
    {
    	int id=m_geblist2.GetCurSel();
    	if((m_eisen>=m_geb1[id]->GetBauKosten().Get_Eisen())&&(m_wasser>=m_geb1[id]->GetBauKosten().Get_Wasser())&&(m_geld>=m_geb1[id]->GetBauKosten().Get_Geld()))
    	{
    		UpdateData(TRUE);
    		if(id<=10) m_geb.push_back(m_geb1[id]);
    		m_res.Set_Eisen(m_eisen-=m_geb1[id]->GetBauKosten().Get_Eisen());
    		m_res.Set_Wasser(m_wasser-=m_geb1[id]->GetBauKosten().Get_Wasser());
    		m_res.Set_Geld(m_geld-=m_geb1[id]->GetBauKosten().Get_Geld());
    		//Hier kommt der Speicherfehler:m_geb[id]->GetName().c_str();
    		m_geblist.AddString(m_geb[id]->GetName().c_str());
    		UpdateData(FALSE);
    	}else{ MessageBox("Nicht genug Ressourcen!",MB_OK);}
    }
    

    Das Programm stürtzt ab bei c_str(), wenn id den Wert ungelich 0 hat. m_geb1 ist ein vector mit Pointern von Klasse Gebaeude:

    class Gebaeude
    {
    	string m_name;
    	int m_ID;
    	int m_bauzeit;
    	int m_akt_bauzeit;
    	BOOL m_aktiv;
    	Res BauKosten;
    	Res LaufendeKosten;
    public:
    	Gebaeude(string name="NULL",int bauzeit=0 ,int ID=0):BauKosten(100,100,100),m_bauzeit(bauzeit),m_akt_bauzeit(0),m_aktiv(false),m_ID(ID){
    		m_name=name;
    	}
    	virtual void bauen();
    	string GetName(){return m_name;}
    	BOOL GetAktiv(){return m_aktiv;}
    	int GetID(){return m_ID;}
    	double GetBauzeit(){return m_bauzeit;}
    	double GetAktBauzeit(){return m_akt_bauzeit;}
    	Res GetBauKosten(){return BauKosten;}
    	Res GetLKosten(){return LaufendeKosten;}
    };
    

    Hier belege ich (Testhalber) die ersten drei mit unterschiedliche Werten:

    Gebs.push_back(new Gebaeude("nochzubauen"));
    Gebs.push_back(new Gebaeude("nochzubauen1"));
    Gebs.push_back(new Gebaeude("nochzubauen2"));
    

    (m_geb1 bekommt die werte von Gebs)
    Komischerweise kann der Debugger mir aber nicht die Adresse von m_geb[id] anzeigen, Also weiß ich auch nicht welchen wert der string hat.
    Was auch merkwürdig ist, ist das bei diesem Aufruf kein Fehler kommt(size hat den wert 2):

    CDialog::OnInitDialog();
    for(int i=0;i<m_geb.size();i++)
    {
    	if(!m_geb[i]->GetAktiv())
    		m_geblist.AddString(m_geb[i]->GetName().c_str());
    }
    for( i=0;i<m_geb1.size();i++)
    {
    	m_geblist2.AddString(m_geb1[i]->GetName().c_str());
    }
    return TRUE;
    

    Kann mir wer helfen?



  • hoi

    Archon schrieb:

    //Hier kommt der Speicherfehler:m_geb[id]->GetName().c_str();
    		m_geblist.AddString(m_geb[id]->GetName().c_str()); (1)
    		UpdateData(FALSE);
    	}else{ MessageBox("Nicht genug Ressourcen!",MB_OK);}
    }
    

    Das Programm stürtzt ab bei c_str(), wenn id den Wert ungelich 0 hat. m_geb1 ist ein vector mit Pointern von Klasse Gebaeude:

    bei (1) steht aber m_geb[id] und nicht m_geb1[id]. koennte das der fehler sein ?

    Meep Meep



  • Thx, es hätte das hingehört:

    m_geblist.AddString(m_geb[m_geb.size()-1]->GetName().c_str());
    

    Danke!


Log in to reply