<?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[cout verändert char-Array? Wie und warum?]]></title><description><![CDATA[<p>Hi alle,</p>
<p>ich hab folgendes Problem:<br />
Ich benutze diese Funktion um Text auf den Bildschirm zu bekommen:</p>
<pre><code class="language-cpp">void drawstr(GLuint x, GLuint y, const char* format, ...)
{
    va_list args;
    char buffer[255], *s;

    va_start(args, format);
    vsprintf(buffer, format, args);
    va_end(args);

    glRasterPos2i(x, y);
    for (s = buffer; *s; s++)
        glutBitmapCharacter(font_style, *s);
}
</code></pre>
<p>Gebe zu, die va und vs Befehle kenn´ und verstehe ich nicht, aber die sollten zu meinem eigentlichen Problem nichts beitragen. Denn, um jetzt auch Floatwerte auszugeben, habe ich angefangen mir eine Funktion zu basteln, die floats in char* umwandelt:</p>
<pre><code class="language-cpp">char* floatToCString(float fValue)
{
	bool bNegative = fValue &lt; 0;
	if(bNegative)
		fValue =  -fValue;
	//Vorkommastellen:
	int temp = (int)fValue;//Nachkommastellen abschneiden
	int iDezimalLenght = 1;// Eine Stelle ist immer

	while(temp &gt;= 10){//Länge über 1 ermitteln
		iDezimalLenght++;
		temp = temp / 10;		
	}

	char acDezimalChars[255];
	temp = (int)fValue;
	acDezimalChars[iDezimalLenght] = 0;//Zeichenkette beenden
	iDezimalLenght--;
	// Array mit den Ziffern von oben nach unten füllen
	for (iDezimalLenght; iDezimalLenght &gt;= 0; iDezimalLenght--){
		acDezimalChars[iDezimalLenght] = (temp%10)+48;
		temp = (int)(temp / 10);
	}
	//	Wenn diese Zeile fehlt, kommt keine Ausgabe ???
	std::cout &lt;&lt; acDezimalChars &lt;&lt; &quot;\n&quot;;

	return acDezimalChars;
}
</code></pre>
<p>Wenn ich jetzt drawstr aufrufe,</p>
<pre><code class="language-cpp">drawstr(150, 200, floatToCString(fTranslateX));
</code></pre>
<p>bekomme ich nur eine Ausgabe, wenn die Zeile</p>
<pre><code class="language-cpp">std::cout &lt;&lt; acDezimalChars &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>mit dabei ist. Wieso und wie verändert cout die Zeichenkette, bzw. was muss ich tun, um ohne cout meinen Bitmapfont ins Glutfenster zu bekommen? (Mal davon abgesehen, dass es bestimmt eine Standardbibliotheksfunktion gibt, die den Job viel besser erledigt)</p>
<p>Wenn jemand die Geduld aufbringt, wäre ich dankbar, wenn er mir auch erklären könnte, warum</p>
<pre><code class="language-cpp">char* floatToCString(float fValue)
{
	return &quot;test&quot;;
}
</code></pre>
<p>zu einer Ausgabe führt, nicht aber</p>
<pre><code class="language-cpp">char* floatToCString(float fValue)
{
	char test[5];
	test[0] = 't';
	test[1] = 'e';
	test[2] = 's';
	test[3] = 't';
	test[4] = '\0';

	return test;
}
</code></pre>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/230883/cout-verändert-char-array-wie-und-warum</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 03:54:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230883.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 Jan 2009 15:24:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to cout verändert char-Array? Wie und warum? on Sat, 03 Jan 2009 15:24:57 GMT]]></title><description><![CDATA[<p>Hi alle,</p>
<p>ich hab folgendes Problem:<br />
Ich benutze diese Funktion um Text auf den Bildschirm zu bekommen:</p>
<pre><code class="language-cpp">void drawstr(GLuint x, GLuint y, const char* format, ...)
{
    va_list args;
    char buffer[255], *s;

    va_start(args, format);
    vsprintf(buffer, format, args);
    va_end(args);

    glRasterPos2i(x, y);
    for (s = buffer; *s; s++)
        glutBitmapCharacter(font_style, *s);
}
</code></pre>
<p>Gebe zu, die va und vs Befehle kenn´ und verstehe ich nicht, aber die sollten zu meinem eigentlichen Problem nichts beitragen. Denn, um jetzt auch Floatwerte auszugeben, habe ich angefangen mir eine Funktion zu basteln, die floats in char* umwandelt:</p>
<pre><code class="language-cpp">char* floatToCString(float fValue)
{
	bool bNegative = fValue &lt; 0;
	if(bNegative)
		fValue =  -fValue;
	//Vorkommastellen:
	int temp = (int)fValue;//Nachkommastellen abschneiden
	int iDezimalLenght = 1;// Eine Stelle ist immer

	while(temp &gt;= 10){//Länge über 1 ermitteln
		iDezimalLenght++;
		temp = temp / 10;		
	}

	char acDezimalChars[255];
	temp = (int)fValue;
	acDezimalChars[iDezimalLenght] = 0;//Zeichenkette beenden
	iDezimalLenght--;
	// Array mit den Ziffern von oben nach unten füllen
	for (iDezimalLenght; iDezimalLenght &gt;= 0; iDezimalLenght--){
		acDezimalChars[iDezimalLenght] = (temp%10)+48;
		temp = (int)(temp / 10);
	}
	//	Wenn diese Zeile fehlt, kommt keine Ausgabe ???
	std::cout &lt;&lt; acDezimalChars &lt;&lt; &quot;\n&quot;;

	return acDezimalChars;
}
</code></pre>
<p>Wenn ich jetzt drawstr aufrufe,</p>
<pre><code class="language-cpp">drawstr(150, 200, floatToCString(fTranslateX));
</code></pre>
<p>bekomme ich nur eine Ausgabe, wenn die Zeile</p>
<pre><code class="language-cpp">std::cout &lt;&lt; acDezimalChars &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>mit dabei ist. Wieso und wie verändert cout die Zeichenkette, bzw. was muss ich tun, um ohne cout meinen Bitmapfont ins Glutfenster zu bekommen? (Mal davon abgesehen, dass es bestimmt eine Standardbibliotheksfunktion gibt, die den Job viel besser erledigt)</p>
<p>Wenn jemand die Geduld aufbringt, wäre ich dankbar, wenn er mir auch erklären könnte, warum</p>
<pre><code class="language-cpp">char* floatToCString(float fValue)
{
	return &quot;test&quot;;
}
</code></pre>
<p>zu einer Ausgabe führt, nicht aber</p>
<pre><code class="language-cpp">char* floatToCString(float fValue)
{
	char test[5];
	test[0] = 't';
	test[1] = 'e';
	test[2] = 's';
	test[3] = 't';
	test[4] = '\0';

	return test;
}
</code></pre>
<p>Danke im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638856</guid><dc:creator><![CDATA[nils2]]></dc:creator><pubDate>Sat, 03 Jan 2009 15:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to cout verändert char-Array? Wie und warum? on Sat, 03 Jan 2009 16:09:03 GMT]]></title><description><![CDATA[<p>hehe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
typischer Anfängerfehler, aber naja, da muss man durch, sonst lernt mans nie.<br />
Also, es liegt an folgendem:</p>
<pre><code class="language-cpp">char* func(float x)
{
   char bla[256];
  // ...
  return bla;
}
</code></pre>
<p>Du gibst hier einen Zeiger auf Speicher zurück, der nach dem funktionsaufruf nicht mehr existiert. Wenn deine funktion verlassen wird, wird der Speicher, der für bla reserviert wurde, wieder freigegeben. So gehts also nicht.</p>
<p>Merke: niemals Zeiger auf eine lokale Variable zurückgeben</p>
<p>Um dein Problem zu lösen, gibt es jetzt verschiedene Ansätze:</p>
<p>Der einfachste ist sicherlich folgender:</p>
<pre><code class="language-cpp">drawstr(100, 100, &quot;%f&quot;, 1.0f);
</code></pre>
<p>Du kannst mehrere Parameter an deine drawstr-funktion übergeben, der erste string gibt dann an, welche Parameter folgen. Die Formatierung vom ersten Parameter folgt der von printf und konsorten. Deshalb gibt es auch ein vprintf in deinem Code. Beispielsweise findest du hier eine Übersicht:<br />
<a href="http://cermics.enpc.fr/~ts/C/FUNCTIONS/format.html" rel="nofollow">http://cermics.enpc.fr/~ts/C/FUNCTIONS/format.html</a></p>
<p>Eine zweite, wesentlich modernere Lösung ist folgende, dabei wird boost::format verwendet:</p>
<pre><code class="language-cpp">#include &lt;boost/format.hpp&gt;

void drawstr(int x, int y, const std::string&amp; c)
{
   const char* text = c.c_str();

  // hier jetzt deine Ausgabefunktion, diese muss die variable text ausgeben.
}

// aufruf:
drawstr(100, 100, str(boost::format(&quot;Hallo %s, ich bin %d Jahre alt&quot;) % &quot;Maxi&quot; % 123));
</code></pre>
<p>Die Format-Spezifierer sind dabei auch wie bei printf. Dazu musst du aber boost installieren (ist aber sowieso sehr empfehlenswert).</p>
<p>Weiterhin kann ich dir noch den FAQ-Artikel &quot;Einmal string nach zahl und zurück&quot; empfehlen.</p>
<p>Ich hoffe, ich konnte dir helfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Maxi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638869</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638869</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 03 Jan 2009 16:09:03 GMT</pubDate></item><item><title><![CDATA[Reply to cout verändert char-Array? Wie und warum? on Sat, 03 Jan 2009 16:08:09 GMT]]></title><description><![CDATA[<p>Warum sich mit den C-Mitteln herumschlagen?</p>
<p>Für die Verwaltung von Zeichenketten gibt es die Klasse <code>std::string</code> . Die kann man auch gefahrlos als Rückgabetyp von Funktionen verwenden. Zudem muss man sich nicht immer um Nullterminierung, Pufferüberläufe und manuelles Kopieren kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638871</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 03 Jan 2009 16:08:09 GMT</pubDate></item><item><title><![CDATA[Reply to cout verändert char-Array? Wie und warum? on Sat, 03 Jan 2009 16:09:28 GMT]]></title><description><![CDATA[<p>Du musst darauf achten, dass Elemente, die innerhalb einer Funktion erstellt werden und nach Ende der Funktion noch gebraucht werden, dann auch noch vorhanden sind.</p>
<p><strong>acDezimalChars</strong> z.B. wird bei dir innerhalb der Funktion <strong>floatToCString</strong> definiert. Sobald <strong>floatToCString</strong> beendet ist, ist aber auch dieses Array verschwunden. Der Zeiger den du zurückgibst zeigt also auf einen Speicherbereich, der, je nachdem, wie der Rest des Programms aussieht auf irgendetwas undefiniertes zeigt.</p>
<p>Wurde der Speicherbereich von <strong>acDezimalChars</strong> noch nicht wieder überschrieben, dann merkst du nichts von diesem Fehler.</p>
<p>Du musst aber dafür sorgen, dass dein <strong>acDezimalChars</strong> auch nach Ende der Funktion noch gültig ist.</p>
<p>Da gibt es einige Möglichkeiten. Wenn man wie du C-ähnlich programmiert, dann könntest du z.B. ein Array verwenden, welches vorher bereits definiert wurde und nur per Zeiger an <strong>floatToCString</strong> übergeben wird. Nur ein Vorschlag. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638872</guid><dc:creator><![CDATA[NurEinTipp]]></dc:creator><pubDate>Sat, 03 Jan 2009 16:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to cout verändert char-Array? Wie und warum? on Sat, 03 Jan 2009 16:11:50 GMT]]></title><description><![CDATA[<p>Wurde bereits ausführlicher beantwortet. Ich ziehe meinen obigen Beitrag zurück.:D</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638873</guid><dc:creator><![CDATA[NurEinTipp]]></dc:creator><pubDate>Sat, 03 Jan 2009 16:11:50 GMT</pubDate></item><item><title><![CDATA[Reply to cout verändert char-Array? Wie und warum? on Sat, 03 Jan 2009 16:11:57 GMT]]></title><description><![CDATA[<p>Du konntest mir super helfen. Danke für die ausführliche Antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638874</guid><dc:creator><![CDATA[nils2]]></dc:creator><pubDate>Sat, 03 Jan 2009 16:11:57 GMT</pubDate></item><item><title><![CDATA[Reply to cout verändert char-Array? Wie und warum? on Sat, 03 Jan 2009 16:14:41 GMT]]></title><description><![CDATA[<p>Ihr konntet mir super helfen. Danke für die ausführlichen Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638877</guid><dc:creator><![CDATA[nils2]]></dc:creator><pubDate>Sat, 03 Jan 2009 16:14:41 GMT</pubDate></item></channel></rss>