Programm stürtz bei beenden ab. Nicht immer.



  • Hallo, ich beginne neu in der C++ Programmierung.

    ich habe ein Struct:

    typedef struct MY_TEXT
    {
    	char*       pString;
    	int	   x;
    	int	   y;
    }MY_TEXT;
    

    Und hier die Funktion die diese Struktur füllt.

    CGraphic::Text(int x,int y,char* text)
    {
    	// Neuer Text
    	m_String.push_back(MY_TEXT());
    
    	// Struktur füllen
    	m_String[m_dwLines].pString = text;
    	m_String[m_dwLines].x       = x;
    	m_String[m_dwLines].y       = y;
    
    	// Zeilen um eins erhöhen
    	m_dwLines++;
    
    	return OK;
    }
    

    Hier wird der Text ausgegeben:

    CGraphic::RenderWorld(void)
    {	...
    	// Text schreiben
    	for(int line =0; line < m_dwLines; line++)
    	{
            m_Font->DrawText( m_String[line].x ,m_String[line].y, D3DCOLOR_XRGB(255,255,255),
                              m_String[line].pString );
    	}
    
    	// Textzeilen löschen...
    	m_String.erase( m_String.begin(), m_String.end() );
    	// ...Anzahl linien auf 0 setzten
    	m_dwLines=0;
    
    	return OK;
    }
    

    In der Anwendung sieht das so aus das man erst eine Reihe von Texten schreibt.

    Diese werden erst beim Aufruf der Funktion RenderWorld gezeichnet.

    while()
    {
      Text(.....
      RenderWorld(....
      if ESC ende
    }
    

    Das ganze funktioniert sogar 😮

    Aber das Programm kann ich mehrmals ohne Probleme starten und beenden. Doch auf einmal stürzt das Programm beim beenden ab. 😕

    Ich weiss auch nicht warum und wieso. Ich ändere nichts am Code. Das Problem kamm auf als ich anfing die STL zu benutzen.
    Der Debugger zeigt eine Stelle im Quellcode der STL als Fehlerquelle.

    Auch Tips zur korrekten Verwendung der STL sind willkommen. 😃



  • Hi

    Sehe grad den Fehler net aber schau doch mal hier vorbei.
    http://www.germandevnet.de/tutorials/cpp-stl/

    Gruß
    de_Bert



  • Der wichtigste Schritt wäre wohl, std::string aus <string> statt char* zu verwenden. Da kann man sich schon wesentlich schwerer ins Bein schießen.
    Außerdem wäre besser:

    struct Name
    {
    };
    

    Die typedef braucht man in C++ nicht 🙂

    Und wenn dwLines nur die Anzahl der Elemente von mString ist, warum verwendest du dann nicht mString.size()? Und für das letzte Element in mString dann mString.back()... Und leeren kann man einen STL-Container am bequemsten mit .clear().



  • Danke für die Tips.

    Aber wie konvertiere ich eine std::string in char*?

    bei (char*)text gibt es eine Fehlermeldung.



  • string hat ne Funktin dafür:

    std::string st("jdfkajf");

    char* text = st.c_str();



  • c_str() gibt aber nur einen "const char*" zurück, d.h. du kannst den String über c_str() nicht beschreiben. Wenn eine Funktion den String nur auslesen will, aber trotzdem einen "char*" erwartet (kommt bei schlechten Schnittstellen vor), kannst du den String mit const_cast übergeben:

    c_funktion_mit_fehlendem_const(const_cast<char*>(str.c_str()));
    


  • operator void schrieb:

    Die typedef braucht man in C++ nicht 🙂

    Warum hat man es in C verwendet? Sehe es recht oft bei Codes, wozu ist das gut (gewesen)? 😮
    Stroustrup lehrt ja:

    struct A {};
    

    ist 'ne Abkürzung für

    class A { public: };
    

    und so verstehe ich es auch aus C++ :p



  • Strogij schrieb:

    Warum hat man es in C verwendet? Sehe es recht oft bei Codes, wozu ist das gut (gewesen)? 😮

    In C++ bedeutet eine Strukturdefinition auch eine implizite Typdefinition, das war in C noch nicht der Fall.
    Dennoch ist IMO das

    typedef struct MY_TEXT
    {
    /* ... */
    } MY_TEXT;
    

    nicht so richtig sinnvoll, sowas

    typedef struct
    {
    /* ... */
    } MY_TEXT;
    

    sieht für meine (C-ungewohnten) Augen besser aus.

    Stroustrup lehrt ja:

    struct A {};
    

    ist 'ne Abkürzung für

    class A { public: };
    

    und so verstehe ich es auch aus C++ :p

    Hm, was willst Du damit sagen? In C gab es noch keine Klassen...



  • nman schrieb:

    Hm, was willst Du damit sagen? In C gab es noch keine Klassen...

    Ich weiß, deswegen meine ich auch Stroustrup. 🙄 Aber ist jetzt klar, typedef auf Strukturen sollte man bei C++ nicht benutzen. 🙂



  • Strogij schrieb:

    Aber ist jetzt klar, typedef auf Strukturen sollte man bei C++ nicht benutzen. 🙂

    "Sollte man nicht beuntzen" ist vielleicht nicht ganz klar, "ist künstliche Arbeitsbeschaffung und erschwert die Lesbarkeit" trifft das ganze wahrscheinlich besser, C++ übernimmt schließlich den typedef für Dich.



  • So wie ich es verstanden habe (nie mit C gearbeitet):
    Wenn man in C eine struct definiert (dasselbe gilt auch für enums)

    struct S {};
    

    definiert man damit einen Typen namens "struct S". Weil "struct S" irgendwann zu viel Tipparbeit wurde, hat man alles über typedefs einmal umgeleitet, weil typedefs kein solches Präfix kriegen. In C++ kann man den Typen über "struct S" und auch einfach über "S" ansprechen. Das hat den Vorteil, dass der Code kürzer ist, man keinen unnötigen neuen Typen einführt und (was mit einem impliziten typedef nicht funktionieren würde) man structs zuverlässiger vorausdeklarieren kann.



  • const_iterator begin() const
    		{return ((const_iterator)_First); }
    	iterator end()
    Hier---->		{return (_Last); }
    

    in der Datei <vector> zeigt er mir ab und zu an dieser Stelle einen Fehler.

    Ich finde den Fehler nicht. Kann es am String liegen?

    Ich kann das Programm 10mal starten ohne ein Problem und auf einmal bringt es einen Fehler.


Anmelden zum Antworten