<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[C++ GUI-Problem]]></title><description><![CDATA[<p>Hallo,</p>
<p>vor kurzem habe ich angefangen, eine eigene GUI in C++ zu schreiben. Das Funktioniert zumindest schon mal ein bisschen. Ich kann schon ein Button hinzufügen, und für diesen die Events verwalten.<br />
Das funktioniert aber nur mit einem Button so gut. Sobald ich mehrere Buttons habe( ich habs mit 2 getestet ), so stürtzt das Programm am Ende ab( also wirklich ganz am Ende des Programmes ).</p>
<p>Folgender Aufbau der GUI( gekürzt ):</p>
<pre><code class="language-cpp">//Anlehnung an Javascript ;)
#define getElementById(x) elems[x]

//Die Klasse verwaltet alles für ein Element
class _gui_element
{
    private:
        // (alle Valiablen und Strukturen)...
    public:
       //Jegliche Methoden
};

//Diese Klasse ist die Hauptklasse
class _gui
{
        private:
                int           number;                           //Die Anzahl aller Elemente in der GUI.

        public:
                _gui_element *elems;                           //Das Element-Array in dem die Eigenschaften aller Elemente stehn

                //Methoden
                          _gui         ( void );            //Konstruktor
                             ~_gui         ( void );            //Destruktor
                int           createElement( int type );        //Erzeugt ein neues Element
};

//Die Methoden der Klasse _gui
_gui::_gui( void )
{
        _gui::number          =     0;
        _gui::elems           =  NULL;
        _gui::isElementActive = false;
        _gui::ActiveElementId =    -1;
}

_gui::~_gui( void )
{
        _gui::number          =     0;
        _gui::isElementActive = false;
        _gui::ActiveElementId =    -1;
        //Elemente löschen
}

int _gui::createElement( int type )
{
        int element_id = -1;

        //Prüfen, ob der Typ gültig ist
        if( type &gt;= 1  &amp;&amp;  type &lt;= 1 ) // Bis jetzt ist es nur ein Element
        {
                //Das Array um ein Element erweitern
                _gui::elems = (_gui_element *) realloc( _gui::elems, ( ( _gui::number + 1 ) * sizeof(_gui_element) ) );
                if( _gui::elems != NULL )
                {
                        element_id = _gui::number;             //Die ID übernehmen
                        _gui::elems[element_id].reset( type ); //Eine extra Funktion setzt alle Werte des Elementes zurück, da der Konstruktor irgendwie nicht aufgerufen wird.
                        _gui::number++;                        //Die Anzahl an Elementen erhöhen
                }
        }

        //Die ID des Elementes zurückgeben
        return element_id;
}

/*******************\
    Hauptfunktion
\*******************/
//Das Objekt wird global angelegt:
_gui document;

int main()
{
        int newElem = document.createElement( BUTTON );
        document.getElementById( newElem ).setBackground( 93, 51, 10 );
        document.getElementById( newElem ).setPosition( 50, 50 );

        newElem = document.createElement( BUTTON );
        document.getElementById( newElem ).setBackground( 93, 51, 10 );
        document.getElementById( newElem ).setPosition( 50, 80 );

        while( !keypressed() )
        {
                //...
        }

        //Selbst hier funktioniert das Programm noch
        return 0;
}
</code></pre>
<p>Da das Programm wirklich erst zum Schluss abstürzt( Vista Fehlermeldung: &quot;Das Progarmm funktioniert nicht mehr...&quot; ), denke ich, das es am Destruktor von &quot;_gui&quot; liegt. Nur was mache ich da falsch?<br />
Ich hab schon &quot;delete _gui::elems&quot; und &quot;free( _gui::elems )&quot; versucht. Ich hab das freigeben auch schon weggelassen.<br />
Bzw. mache ich etwas bei der Speicherreservierung( _gui::createElement() ) falsch?</p>
<p>Danke schonmal im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242692/c-gui-problem</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 14:11:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242692.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Jun 2009 08:59:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 08:59:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>vor kurzem habe ich angefangen, eine eigene GUI in C++ zu schreiben. Das Funktioniert zumindest schon mal ein bisschen. Ich kann schon ein Button hinzufügen, und für diesen die Events verwalten.<br />
Das funktioniert aber nur mit einem Button so gut. Sobald ich mehrere Buttons habe( ich habs mit 2 getestet ), so stürtzt das Programm am Ende ab( also wirklich ganz am Ende des Programmes ).</p>
<p>Folgender Aufbau der GUI( gekürzt ):</p>
<pre><code class="language-cpp">//Anlehnung an Javascript ;)
#define getElementById(x) elems[x]

//Die Klasse verwaltet alles für ein Element
class _gui_element
{
    private:
        // (alle Valiablen und Strukturen)...
    public:
       //Jegliche Methoden
};

//Diese Klasse ist die Hauptklasse
class _gui
{
        private:
                int           number;                           //Die Anzahl aller Elemente in der GUI.

        public:
                _gui_element *elems;                           //Das Element-Array in dem die Eigenschaften aller Elemente stehn

                //Methoden
                          _gui         ( void );            //Konstruktor
                             ~_gui         ( void );            //Destruktor
                int           createElement( int type );        //Erzeugt ein neues Element
};

//Die Methoden der Klasse _gui
_gui::_gui( void )
{
        _gui::number          =     0;
        _gui::elems           =  NULL;
        _gui::isElementActive = false;
        _gui::ActiveElementId =    -1;
}

_gui::~_gui( void )
{
        _gui::number          =     0;
        _gui::isElementActive = false;
        _gui::ActiveElementId =    -1;
        //Elemente löschen
}

int _gui::createElement( int type )
{
        int element_id = -1;

        //Prüfen, ob der Typ gültig ist
        if( type &gt;= 1  &amp;&amp;  type &lt;= 1 ) // Bis jetzt ist es nur ein Element
        {
                //Das Array um ein Element erweitern
                _gui::elems = (_gui_element *) realloc( _gui::elems, ( ( _gui::number + 1 ) * sizeof(_gui_element) ) );
                if( _gui::elems != NULL )
                {
                        element_id = _gui::number;             //Die ID übernehmen
                        _gui::elems[element_id].reset( type ); //Eine extra Funktion setzt alle Werte des Elementes zurück, da der Konstruktor irgendwie nicht aufgerufen wird.
                        _gui::number++;                        //Die Anzahl an Elementen erhöhen
                }
        }

        //Die ID des Elementes zurückgeben
        return element_id;
}

/*******************\
    Hauptfunktion
\*******************/
//Das Objekt wird global angelegt:
_gui document;

int main()
{
        int newElem = document.createElement( BUTTON );
        document.getElementById( newElem ).setBackground( 93, 51, 10 );
        document.getElementById( newElem ).setPosition( 50, 50 );

        newElem = document.createElement( BUTTON );
        document.getElementById( newElem ).setBackground( 93, 51, 10 );
        document.getElementById( newElem ).setPosition( 50, 80 );

        while( !keypressed() )
        {
                //...
        }

        //Selbst hier funktioniert das Programm noch
        return 0;
}
</code></pre>
<p>Da das Programm wirklich erst zum Schluss abstürzt( Vista Fehlermeldung: &quot;Das Progarmm funktioniert nicht mehr...&quot; ), denke ich, das es am Destruktor von &quot;_gui&quot; liegt. Nur was mache ich da falsch?<br />
Ich hab schon &quot;delete _gui::elems&quot; und &quot;free( _gui::elems )&quot; versucht. Ich hab das freigeben auch schon weggelassen.<br />
Bzw. mache ich etwas bei der Speicherreservierung( _gui::createElement() ) falsch?</p>
<p>Danke schonmal im voraus!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722577</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Sun, 07 Jun 2009 08:59:23 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 09:29:24 GMT]]></title><description><![CDATA[<ol>
<li><code>realloc</code> ist C. Du willst C++ programmieren, also nimm <code>new[]</code> oder noch besser <code>std::vector</code><br />
2. Bezeichner mit einem Underscore am Anfang sind für den Compiler reserviert<br />
3. Tipp: es gibt <code>enum</code></li>
<li><code>(void)</code> für eine leere Argumentliste ist C. In C++ schreibt man einfach ()<br />
5. Funktionen sind besser als Makros</li>
</ol>
<p>Tipp: lies ein ordentliches Buch oder Tutorial und wirf das, was du bisher benutzt hast weg, weil es offenbar übelst schlecht ist und dir einen miesen &quot;C++ ist C mit Klassen&quot;-Stil beibringt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722591</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Sun, 07 Jun 2009 09:29:24 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 09:44:57 GMT]]></title><description><![CDATA[<p>Kannst du mal ein Beispiel bringen mit dem new[] ?</p>
<p>Was meinst du bei 2.? Es ist doch egal, wie ich meine Klassen nenne, oder? es sind doch nur Namen.</p>
<p>Das es enum gibt weis ich. Nur wo sollte ich das hier einsetzen?</p>
<p>Ja ok, das mit dem void bin ich noch aus C gewoht. Werde ich ändern.</p>
<p>Funktionen sind nicht besser als Makros. Makros können im günstigsten Fall zu konstanten ersetzt werden. Wobei Funktionen erst vergleichsweise Lange durchgekaut werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722597</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Sun, 07 Jun 2009 09:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 09:50:00 GMT]]></title><description><![CDATA[<p>Funktionen haben den Vorteil, das Sie Code lesbarer und besser debugbar machen. Die Verlangsamung des Codes ist eher zu vernachlässigen, da gute Compiler hier sehr gut optimieren können.<br />
Makros werden nicht zu unrecht in C++ vergleichsweise selten eingesetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722599</guid><dc:creator><![CDATA[Mr X]]></dc:creator><pubDate>Sun, 07 Jun 2009 09:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 09:54:48 GMT]]></title><description><![CDATA[<p>hmm, ja.<br />
Nur wie würdest du den JavaScript-Stil machen?</p>
<pre><code class="language-cpp">document.funktion().funktion()
</code></pre>
<p>dahinter verbirgt sich ja nur</p>
<pre><code class="language-cpp">document.array[].function()
</code></pre>
<p>Dieses Makro ist also genaugenommen keines sondern nur eine &quot;verschönerung&quot;. Zudem ist das das einzige Makro im Code neben verschiedenen Flags( #define FLAG 1 )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722604</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Sun, 07 Jun 2009 09:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 10:01:06 GMT]]></title><description><![CDATA[<p>ChristophLu schrieb:</p>
<blockquote>
<p>Kannst du mal ein Beispiel bringen mit dem new[] ?</p>
</blockquote>
<pre><code class="language-cpp">Type *data = new Type[anzahl];
</code></pre>
<p>Ich lege dir dennoch dringend ans Herz, einen Standardcontainer zu benutzen. Zum Beispiel <code>std::vector</code> .<br />
Lies ein Tutorial. Hier in der FAQ gibt es bestimmt Links auf gute Tutorials für das grundlegende Einmaleins.</p>
<blockquote>
<p>Was meinst du bei 2.?</p>
</blockquote>
<p>Dass du Bezeichner mit einem _ am Anfang nicht benutzen darfst.</p>
<blockquote>
<p>Das es enum gibt weis ich. Nur wo sollte ich das hier einsetzen?</p>
</blockquote>
<pre><code class="language-cpp">int _gui::createElement( int type )
</code></pre>
<p>Wenn du aus dem <code>int type</code> einen Enum-Typen machst, wird dein Code besser lesbar und weniger fehleranfällig, weil man dann kaum noch falsche Parameter aus Versehen übergeben kann.</p>
<blockquote>
<p>Funktionen sind nicht besser als Makros. Makros können im günstigsten Fall zu konstanten ersetzt werden. Wobei Funktionen erst vergleichsweise Lange durchgekaut werden.</p>
</blockquote>
<p>Naja, du solltest zuerst mal fähig sein korrekte Programme zu schreiben, bevor du dir über solche Nichtigkeiten Gedanken machst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722610</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Sun, 07 Jun 2009 10:01:06 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 10:06:04 GMT]]></title><description><![CDATA[<blockquote>
<p>Kannst du mal ein Beispiel bringen mit dem new[] ?</p>
</blockquote>
<p><a href="http://en.wikipedia.org/wiki/New_(C%2B%2B)" rel="nofollow">http://en.wikipedia.org/wiki/New_(C%2B%2B)</a></p>
<blockquote>
<p>Was meinst du bei 2.? Es ist doch egal, wie ich meine Klassen nenne, oder? es sind doch nur Namen.</p>
</blockquote>
<p>Er meint wahrscheinlich das du deine Klasse nicht mit einem &quot;_&quot; beginnen sollst, weil die Präprozessoranweisungen meistens so beginnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722614</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Sun, 07 Jun 2009 10:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 10:06:25 GMT]]></title><description><![CDATA[<p>ja, nur dann erstell ich ja ein komplett neues Array. Ich will aber das vorhandene nur erweitern.</p>
<p>Ich kann sehr wohl korrekte Programme schreiben! Nur lerne ich gerade C++, weil ich vorher nur in C programmiert habe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722617</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Sun, 07 Jun 2009 10:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 10:15:34 GMT]]></title><description><![CDATA[<p>ChristophLu schrieb:</p>
<blockquote>
<p>ja, nur dann erstell ich ja ein komplett neues Array. Ich will aber das vorhandene nur erweitern.</p>
</blockquote>
<p>Ich schreibs jetzt zum dritten und letzten mal: Lies ein Tutorial und lerne, wie Standardcontainer funktionieren.</p>
<p>ChristophLu schrieb:</p>
<blockquote>
<p>Ich kann sehr wohl korrekte Programme schreiben!</p>
</blockquote>
<p>Ich rede von C++, und da bist du noch ein gutes Stück davon entfernt.</p>
<blockquote>
<p>Nur lerne ich gerade C++, weil ich vorher nur in C programmiert habe!</p>
</blockquote>
<p>Das sieht man. Wenn du kannst, versuch dein Wissen über C nicht nach C++ zu übertragen. In C++ macht man so ziemlich alles anders und C-Techniken sind da nur hinderlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722623</guid><dc:creator><![CDATA[Registrierter Troll]]></dc:creator><pubDate>Sun, 07 Jun 2009 10:15:34 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 10:27:17 GMT]]></title><description><![CDATA[<p>ChristophLu, für Konstruktoren solltest du die Initialisierungsliste verwenden:</p>
<pre><code class="language-cpp">gui::gui() : number(0), elems(NULL), isElementActive(false), ActiveElementId(-1)
{ 
}
</code></pre>
<p>Wie du siehst, brauchst du auch die Klassenzugehörigkeit nicht (bzw. nur in Zweifelsfällen) anzugeben, solange du dich innerhalb von Memberfunktionen der Klasse befindest. Aber ich würde dir auch raten, ein gutes C++-Buch zu kaufen und C++ nochmals von vorne neu zu beginnen. Das bringt mehr, als wenn du verkrampft versuchst, dein C in C++ anzuwenden.</p>
<p>Registrierter Troll schrieb:</p>
<blockquote>
<p>Das sieht man. Wenn du kannst, versuch dein Wissen über C nicht nach C++ zu übertragen. In C++ macht man so ziemlich alles anders und C-Techniken sind da nur hinderlich.</p>
</blockquote>
<p>Wäre ein gutes Beispiel für die Diskussion von neulich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722633</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Jun 2009 10:27:17 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 11:59:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22527">@ChristophLu</a>'s Code</p>
<pre><code>Es                              wäre
lustig                          wenn
du                             sehen
könntest                         wie
deine                          Augen
behindert                        von
links                           nach
rechts                        hüpfen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1722684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722684</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sun, 07 Jun 2009 11:59:47 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 14:08:55 GMT]]></title><description><![CDATA[<p>sieht nämlich JS style aus. bist wahrscheinlich voll der JS freak was</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722744</guid><dc:creator><![CDATA[JnZn558]]></dc:creator><pubDate>Sun, 07 Jun 2009 14:08:55 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 14:17:15 GMT]]></title><description><![CDATA[<p>Habt ihr Langeweile? Das einzige, was bei ChristophLus Code vielleicht anzumerken ist, sind die etwas grossen Einrückungen. Aber wenigstens hat er konsequent eingerückt, die CPP-Tags richtig verwendet und seinen Code auch sonst recht übersichtlich gestaltet. Ihr könntet eure Kommentare lieber für die Leute sparen, die es nach fünfmaliger Aufforderung immer noch nicht schaffen, Code anständig zu formatieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722751</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Jun 2009 14:17:15 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 14:34:19 GMT]]></title><description><![CDATA[<p>Was war an meinem Kommentar so schlimm ? Ich denke es war verständlich genug das er es mit der Einrückung nicht ganz so übertreiben soll. Ich dachte &quot;wo is der Rückgabetyp für createElement?&quot;. 3 Tabulator weiter hinten hab ich ihn dann gefunden. Immer 2 Tabulator für Einrückung muss net sein. Was macht er denn wenn er mal eine kompliziertere Verschachtelung schreiben muss ? 2 Minuten lang nach rechts scrollen?<br />
Klar, der code ist so okay und er hat die Einrückung immer eingehalten. Bei den Funktionen ist es nicht ma so schlimm, aber die Klasse find ich schlimm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722763</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Sun, 07 Jun 2009 14:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 15:30:26 GMT]]></title><description><![CDATA[<p>Also ich persönlich finde die Einrückungen nicht übertrieben und äußerst leserlich. Mag vielleicht sein, das sie in eureim Browser anders angezeigt werden...</p>
<p>Zudem hab ich immer noch das Problem mit dem Instanz-Array. Einfach nur ein dynamisches(!) Array anzulegen/erweitern/löschen, welches die Instanzen von _gui_element( ja, die Klassen habe ich in der zwischenzeit umbenannt ) speichert.</p>
<p>Anlegen erscheint mir einfach:</p>
<pre><code class="language-cpp">_gui_element *elems;
</code></pre>
<p>Außerdem noch das löschen:</p>
<pre><code class="language-cpp">delete [] elems;
</code></pre>
<p>Nur wie kann ich das um ein Element erweitern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722794</guid><dc:creator><![CDATA[ChristophLu]]></dc:creator><pubDate>Sun, 07 Jun 2009 15:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to C++ GUI-Problem on Sun, 07 Jun 2009 15:33:19 GMT]]></title><description><![CDATA[<p>ChristophLu schrieb:</p>
<blockquote>
<p>Nur wie kann ich das um ein Element erweitern?</p>
</blockquote>
<p>Indem du die Ratschläge befolgst und mit STL-Containern arbeitest. Dynamische Arrays kannst du in C++ nicht &quot;erweitern&quot; (statische erst recht nicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1722797</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1722797</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 07 Jun 2009 15:33:19 GMT</pubDate></item></channel></rss>