<?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[Überlauf Problem]]></title><description><![CDATA[<p>Bei der folgenden Klasse in der Funktion Aktualisiere muss irgentwo ein Fehler sein, dann beim erstellen dieser Klasse werden plötzlich andere Variablen geändert. Ich tippe auf strcpy, aber mir fällt nicht auf, was ich falsch gemacht habe. Die Klasse erstelle ich mit ZentrierteSchrift ZSchrift(&quot;blabla&quot;);</p>
<pre><code class="language-cpp">class ZentrierteSchrift
{
    private:
        char *Text; /* Zeiger auf den Text */
        GLfloat x; /* Hälfte der Breite des Textes (negativ) */
        GLfloat y; /* Viertel der &quot;Hoehe des Textes&quot; */
    public:
        ZentrierteSchrift() : Text(0) {} /* Zeiger mit 0 initialisieren */
        ZentrierteSchrift(const char *Text) : Text(0)
        {
            Aktualisiere(Text);
        }
        ~ZentrierteSchrift() { delete[] Text; } /* Speicher freigeben */
        void Aktualisiere(const char *was) /* Welcher Text soll eigentlich gezeichnet werden? */
        {
            delete[] Text; /* Da Text am Anfang 0 ist, geschieht dann noch nichts. */
            Text = new char[strlen(was) + 1]; /* Reserviere 1 Zeichen mehr für 0-Terminierung */
            strcpy(Text,was); /* Kopiert Text inklusive 0-Terminierung */
            SIZE Groesse; /* Lege SIZE Struktur für WinAPI Funktion an */
            GetTextExtentPoint32(hDC,Text,strlen(Text),&amp;Groesse); /* Groesse ermitteln */
            x = static_cast&lt;GLfloat&gt;(Groesse.cx) / -2; /* Hälfte und negativ */
            y = static_cast&lt;GLfloat&gt;(Groesse.cy) / 4; /* Viertel, da Windows auch noch Zeilenabstand mit einberechnet */
        }
        void Ausgabe()
        {
// nicht so wichtig
        }
};
</code></pre>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/131861/überlauf-problem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 06:39:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/131861.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Jan 2006 14:00:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 14:00:55 GMT]]></title><description><![CDATA[<p>Bei der folgenden Klasse in der Funktion Aktualisiere muss irgentwo ein Fehler sein, dann beim erstellen dieser Klasse werden plötzlich andere Variablen geändert. Ich tippe auf strcpy, aber mir fällt nicht auf, was ich falsch gemacht habe. Die Klasse erstelle ich mit ZentrierteSchrift ZSchrift(&quot;blabla&quot;);</p>
<pre><code class="language-cpp">class ZentrierteSchrift
{
    private:
        char *Text; /* Zeiger auf den Text */
        GLfloat x; /* Hälfte der Breite des Textes (negativ) */
        GLfloat y; /* Viertel der &quot;Hoehe des Textes&quot; */
    public:
        ZentrierteSchrift() : Text(0) {} /* Zeiger mit 0 initialisieren */
        ZentrierteSchrift(const char *Text) : Text(0)
        {
            Aktualisiere(Text);
        }
        ~ZentrierteSchrift() { delete[] Text; } /* Speicher freigeben */
        void Aktualisiere(const char *was) /* Welcher Text soll eigentlich gezeichnet werden? */
        {
            delete[] Text; /* Da Text am Anfang 0 ist, geschieht dann noch nichts. */
            Text = new char[strlen(was) + 1]; /* Reserviere 1 Zeichen mehr für 0-Terminierung */
            strcpy(Text,was); /* Kopiert Text inklusive 0-Terminierung */
            SIZE Groesse; /* Lege SIZE Struktur für WinAPI Funktion an */
            GetTextExtentPoint32(hDC,Text,strlen(Text),&amp;Groesse); /* Groesse ermitteln */
            x = static_cast&lt;GLfloat&gt;(Groesse.cx) / -2; /* Hälfte und negativ */
            y = static_cast&lt;GLfloat&gt;(Groesse.cy) / 4; /* Viertel, da Windows auch noch Zeilenabstand mit einberechnet */
        }
        void Ausgabe()
        {
// nicht so wichtig
        }
};
</code></pre>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/958781</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/958781</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Fri, 06 Jan 2006 14:00:55 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 14:18:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mach mal so:</p>
<pre><code class="language-cpp">class ZentrierteSchrift {
         /*...*/   
        ZentrierteSchrift(const char *s) {
            Aktualisiere(s);
        }
        void Aktualisiere(const char *was) 
        {
            delete[] Text;  
            Text = new char[strlen(was) + 1]; 
            strncpy(Text, was, strlen(was));
            /*...*/
        }
};
</code></pre>
<p>Problem war Null-Pointer, den du im Element-Initialiser angegeben hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/958805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/958805</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 06 Jan 2006 14:18:53 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 14:22:24 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>mach mal so:</p>
<pre><code class="language-cpp">class ZentrierteSchrift {
         /*...*/   
        ZentrierteSchrift(const char *s) {
            Aktualisiere(s);
        }
        void Aktualisiere(const char *was) 
        {
            delete[] Text;  
            Text = new char[strlen(was) + 1]; 
            strncpy(Text, was, strlen(was));
            /*...*/
        }
};
</code></pre>
<p>Problem war Null-Pointer, den du im Element-Initialiser angegeben hast.</p>
</blockquote>
<p>Warum ist der Null-Pointer ein Problem??</p>
<p>Und wenn ich das ganze durch strncpy ersetze, kopiere ich ja das 0-Terminierungszeichen nicht mit, oder?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/958814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/958814</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Fri, 06 Jan 2006 14:22:24 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 18:49:04 GMT]]></title><description><![CDATA[<p>joomoo schrieb:</p>
<blockquote>
<p>Warum ist der Null-Pointer ein Problem??</p>
</blockquote>
<p>Verfolge doch mal genau, was dein Konstruktor tut. Du übergibst nen Null-Pointer an Aktualisiere (und rufst dann strlen und strcpy darauf auf), das macht (für mich) alles wenig Sinn.<br />
Btw. welches Verhalten zeigt sich denn genau? Dann kann ich vllt. genaueres sagen.</p>
<blockquote>
<p>Und wenn ich das ganze durch strncpy ersetze, kopiere ich ja das 0-Terminierungszeichen nicht mit, oder?</p>
</blockquote>
<p>So wie ich's geschrieben hab nicht. Aber das könnte man leicht ändern, indem man einfach Text[n] = '\0' schreibt oder ein Element mehr kopiert.<br />
Wäre nicht schlecht, wenn du noch ne size_t Variable für die Größe hättest, dann müsstest du nicht immer mit strlen rumeiern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959001</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 06 Jan 2006 18:49:04 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 18:51:39 GMT]]></title><description><![CDATA[<p>GPC schrieb:</p>
<blockquote>
<p>joomoo schrieb:</p>
<blockquote>
<p>Warum ist der Null-Pointer ein Problem??</p>
</blockquote>
<p>Verfolge doch mal genau, was dein Konstruktor tut. Du übergibst nen Null-Pointer an Aktualisiere (und rufst dann strlen und strcpy darauf auf), das macht (für mich) alles wenig Sinn.<br />
Btw. welches Verhalten zeigt sich denn genau? Dann kann ich vllt. genaueres sagen.</p>
</blockquote>
<p>Stimmt! Ist mir gar nicht aufgefallen. Ich hab ausversehen den Parameter und den privaten Zeiger gleich benannt, beide Text. Ich werde das mal ändern und gucken ob es was hilft.</p>
<p>Aber das strcpy kann ich auch so lassen oder?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959002</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Fri, 06 Jan 2006 18:51:39 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 18:53:53 GMT]]></title><description><![CDATA[<p>joomoo schrieb:</p>
<blockquote>
<p>Stimmt! Ist mir gar nicht aufgefallen. Ich hab ausversehen den Parameter und den privaten Zeiger gleich benannt, beide Text.</p>
</blockquote>
<p>Bingo.</p>
<p>joomoo schrieb:</p>
<blockquote>
<p>Aber das strcpy kann ich auch so lassen oder?</p>
</blockquote>
<p>Lieber nicht, das ist unsicher und schreibt, wenn's blöd läuft bzw. der Zielstring zu kurz ist, wild im Speicher rum und das führt zu undefiniertem Verhalten. Freunde dich mit strncpy an (und mit strncat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959004</guid><dc:creator><![CDATA[GPC]]></dc:creator><pubDate>Fri, 06 Jan 2006 18:53:53 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:09:20 GMT]]></title><description><![CDATA[<p>Okay ich hab jetzt alles so gemacht, leider klappt's immer noch nicht. Um das Problem mal genauer zu beschrieben:</p>
<p>Die Klasse Menu hat mehrere vectoren, einige enthalten GLfloat Objekte und einer ZentrierteSchrift Objekte. Beim hinzufügen neuer Elemente zum Vector mit den ZentrierteSchrift Objekten ändern sich plötzlich die im vector&lt;GLfloat&gt; Werte zu ziemlich komischen Zahlen wie: 67200099052103200000.000000 oder so ähnlich. Auf jeden Fall sehr groß. Manchmal passiert es auch dass sich das Programm mit einem Laufzeitfehler verabschiedet. Für mich spricht das alles nach einem undefinierten Verhalten weil ich irgentwo einen Fehler gemacht habe. Und ich glaube dass er in dieser Klasse liegt. Es ist zum verzweifeln.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959028</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:09:20 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:14:59 GMT]]></title><description><![CDATA[<p>Machs doch einfach so:</p>
<pre><code class="language-cpp">Text[ strncpy(Text, was, strlen(was)) ] = '\0';
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/959034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959034</guid><dc:creator><![CDATA[Any]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:14:59 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:21:31 GMT]]></title><description><![CDATA[<p>Any schrieb:</p>
<blockquote>
<p>Machs doch einfach so:</p>
<pre><code class="language-cpp">Text[ strncpy(Text, was, strlen(was)) ] = '\0';
</code></pre>
</blockquote>
<p>Der Rückgabe wert von strncpy ist glaub ich ein Zeiger auf den String und nicht die übertragenen Bytes.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959043</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:21:31 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:31:14 GMT]]></title><description><![CDATA[<p>Ich hatte jetzt kein Bock mehr auf den Kack, und hab jetzt alles durch std::strings ersetzt:</p>
<pre><code class="language-cpp">class ZentrierteSchrift
{
    private:
        std::string Text; /* Text */
        GLfloat x; /* Hälfte der Breite des Textes (negativ) */
        GLfloat y; /* Viertel der &quot;Hoehe des Textes&quot; */
    public:
        ZentrierteSchrift() {} /* Zeiger mit 0 initialisieren */
        ZentrierteSchrift(const char *was)
        {
            Aktualisiere(was);
        }
        ~ZentrierteSchrift() { } /* Speicher freigeben */
        void Aktualisiere(const char *was) /* Welcher Text soll eigentlich gezeichnet werden? */
        {
            Text = was;
            SIZE Groesse; /* Lege SIZE Struktur für WinAPI Funktion an */
            GetTextExtentPoint32(hDC,Text.c_str(),Text.size(),&amp;Groesse); /* Groesse ermitteln */
            x = static_cast&lt;GLfloat&gt;(Groesse.cx) / -2; /* Hälfte und negativ */
            y = static_cast&lt;GLfloat&gt;(Groesse.cy) / 4; /* Viertel, da Windows auch noch Zeilenabstand mit einberechnet */
        }
        void Ausgabe()
        {
            Schrift2.AusgabeEx(Text.c_str(),x,y); /* Schrift zentriert ausgeben */
        }
};
</code></pre>
<p>Das klappt auch. Falls trotzdem jemand den Fehler sieht, würde ich mich darüber freuen, denn ich seh ihn immer noch nicht.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959061</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:31:14 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:42:03 GMT]]></title><description><![CDATA[<p>joomoo schrieb:</p>
<blockquote>
<p>Ich hatte jetzt kein Bock mehr auf den Kack, und hab jetzt alles durch std::strings ersetzt:</p>
</blockquote>
<p>Warum nicht gleich so <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/959078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959078</guid><dc:creator><![CDATA[Any]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:42:03 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:43:26 GMT]]></title><description><![CDATA[<p>joomoo dein Code ist ja voll gefrickelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959081</guid><dc:creator><![CDATA[Halbherziger Profi]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:43:41 GMT]]></title><description><![CDATA[<p>joomoo schrieb:</p>
<blockquote>
<p>Any schrieb:</p>
<blockquote>
<p>Machs doch einfach so:</p>
<pre><code class="language-cpp">Text[ strncpy(Text, was, strlen(was)) ] = '\0';
</code></pre>
</blockquote>
<p>Der Rückgabe wert von strncpy ist glaub ich ein Zeiger auf den String und nicht die übertragenen Bytes.</p>
<p>mfg.</p>
</blockquote>
<p>Hast recht, man müsste es so machen: strncpy(Text, was, strlen(was)+1) dann wird die 0 mitkopiert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959083</guid><dc:creator><![CDATA[Any]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:45:37 GMT]]></title><description><![CDATA[<p>Halbherziger Profi schrieb:</p>
<blockquote>
<p>joomoo dein Code ist ja voll gefrickelt.</p>
</blockquote>
<p>Das heißt?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959085</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 19:48:54 GMT]]></title><description><![CDATA[<p>Any schrieb:</p>
<blockquote>
<p>joomoo schrieb:</p>
<blockquote>
<p>Ich hatte jetzt kein Bock mehr auf den Kack, und hab jetzt alles durch std::strings ersetzt:</p>
</blockquote>
<p>Warum nicht gleich so <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
</blockquote>
<p>Jetzt muss jeden Frame std::string::c_str() aufgerufen werden. Ist das resourcenfressend?</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959088</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Fri, 06 Jan 2006 19:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 20:26:40 GMT]]></title><description><![CDATA[<p>Nö, eigentlich nicht. Üblicherweise liegen die Strings im Speicher so vor und es wird nur der Zeiger rausgegeben. Klar, das garantiert einem niemand, dass das wirklich immer so ist, aber es ist sehr wahrscheinlich.</p>
<p>Allerdings: Ist std::string referenzgezählt und ist der String 'gesharet', so muss vor dem Aufruf von c_str eine Kopie angefertigt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959118</guid><dc:creator><![CDATA[7H3 N4C3R]]></dc:creator><pubDate>Fri, 06 Jan 2006 20:26:40 GMT</pubDate></item><item><title><![CDATA[Reply to Überlauf Problem on Fri, 06 Jan 2006 21:36:33 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>du brauchst für die klasse einen copy-construktor, der nicht nur den Zeiger Text, sondern auch dessen Inhalt mitkopiert. Ansonsten hast du, im vector, lauter &quot;ZentrierteSchrift&quot;en, deren Text-Pointer alle auf den selben speicher-inhalt zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/959175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/959175</guid><dc:creator><![CDATA[tipp]]></dc:creator><pubDate>Fri, 06 Jan 2006 21:36:33 GMT</pubDate></item></channel></rss>