<?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[Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++?]]></title><description><![CDATA[<p>OpenGL hat folgende Funktion:</p>
<pre><code>void glGetShaderInfoLog(GLuint shader,
 	GLsizei maxLength,
 	GLsizei *length,
 	GLchar *infoLog);
</code></pre>
<p>Man kann sie aufrufen, wenn ein Shader nicht korrekt kompiliert wurde um weitere Infos zu bekommen. Diese werden in GLchar *infoLog gespeichert, den Speicher muss der Aufrufer zur Verfügung stellen.</p>
<p>Was ist der korrekte Weg Funktionen dieser Art in modernem C++ aufzurufen?</p>
<p>Ich hätte zum einen:</p>
<pre><code>std::string infoLog(logLength, ' ');  //oder dieses-&gt;   std::basic_string&lt;GLchar&gt; infoLog(logLength, ' ');   ?
glGetShaderInfoLog(shaderId, logLength, NULL, &amp;infoLog[0]);
std::cout&lt;&lt;infoLog&lt;&lt;&quot;\n&quot;;
</code></pre>
<p>Ist das denn legal? Darf man die Funktion einfach in &amp;infoLog[0] schreiben lassen, oder kann es Probleme geben?</p>
<p>Alternativ fällt mir noch ein:</p>
<pre><code>auto infoLogPtr = std::unique_ptr&lt;GLchar[]&gt;(new GLchar[logLength]);
glGetShaderInfoLog(shaderId, logLength, NULL, infoLogPtr.get());
std::cout&lt;&lt;infoLogPtr.get()&lt;&lt;&quot;\n&quot;;
</code></pre>
<p>Was ist der richtige Weg?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/332230/beschreibbares-char-array-für-c-funktion-bereitstellen-wie-in-modernem-c</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 10:57:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332230.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Apr 2015 18:39:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Thu, 16 Apr 2015 18:39:38 GMT]]></title><description><![CDATA[<p>OpenGL hat folgende Funktion:</p>
<pre><code>void glGetShaderInfoLog(GLuint shader,
 	GLsizei maxLength,
 	GLsizei *length,
 	GLchar *infoLog);
</code></pre>
<p>Man kann sie aufrufen, wenn ein Shader nicht korrekt kompiliert wurde um weitere Infos zu bekommen. Diese werden in GLchar *infoLog gespeichert, den Speicher muss der Aufrufer zur Verfügung stellen.</p>
<p>Was ist der korrekte Weg Funktionen dieser Art in modernem C++ aufzurufen?</p>
<p>Ich hätte zum einen:</p>
<pre><code>std::string infoLog(logLength, ' ');  //oder dieses-&gt;   std::basic_string&lt;GLchar&gt; infoLog(logLength, ' ');   ?
glGetShaderInfoLog(shaderId, logLength, NULL, &amp;infoLog[0]);
std::cout&lt;&lt;infoLog&lt;&lt;&quot;\n&quot;;
</code></pre>
<p>Ist das denn legal? Darf man die Funktion einfach in &amp;infoLog[0] schreiben lassen, oder kann es Probleme geben?</p>
<p>Alternativ fällt mir noch ein:</p>
<pre><code>auto infoLogPtr = std::unique_ptr&lt;GLchar[]&gt;(new GLchar[logLength]);
glGetShaderInfoLog(shaderId, logLength, NULL, infoLogPtr.get());
std::cout&lt;&lt;infoLogPtr.get()&lt;&lt;&quot;\n&quot;;
</code></pre>
<p>Was ist der richtige Weg?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450533</guid><dc:creator><![CDATA[Salzwasser]]></dc:creator><pubDate>Thu, 16 Apr 2015 18:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Thu, 16 Apr 2015 18:43:11 GMT]]></title><description><![CDATA[<p>Du koenntest einen vector aus chars nehmen, resizen und den pointer mit der data Funktion holen wenn du aus irgendeinem Grund mit einem char[1024] oder sowas in der Art nicht genehm ist. Was wirklich anderes passiert dann aber auch nicht, nur das der Speicher dann auf dem Heap liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450534</guid><dc:creator><![CDATA[TGGC]]></dc:creator><pubDate>Thu, 16 Apr 2015 18:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Thu, 16 Apr 2015 18:47:16 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::vector&lt;GLchar&gt; logBuffer(logLength);
glGetShaderInfoLog(shaderId, logBuffer.size(), nullptr, logBuffer.data());
std::cout &lt;&lt; logBuffer.data() &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>ps: Was TGGC gerade geschrieben hat, also gleich nen <code>char[1024]</code> aufm Stack verwenden, ist in den allermeisten Fällen vermutlich vollkommen ausreichend. Und wäre dann klar vorzuziehen (KISS).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450535</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 16 Apr 2015 18:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Thu, 16 Apr 2015 18:54:24 GMT]]></title><description><![CDATA[<p>Schön und gut, ich kenne aber die Länge des Logs nicht. Vielleicht reichen in diesem Fall 1024 aus, aber bei OpenGL werde ich noch auf viele Ähnliche Probleme stoßen.</p>
<p>Mich interessiert die Frage dennoch: Ist es erlaubt in &amp;infoLog[0] für den std::string zu schreiben, wenn er mit ausreichender Größe angelegt wurde?</p>
<p>Gleiche Frage zu dem anderen Vorschlag von TGGC, darf man in vector.data() schreiben, wenn die Größe vorher festgelegt wurde?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450536</guid><dc:creator><![CDATA[Salzwasser]]></dc:creator><pubDate>Thu, 16 Apr 2015 18:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Thu, 16 Apr 2015 18:55:49 GMT]]></title><description><![CDATA[<p>Also beim vector schätze ich mal ja, sorry hustbaer, hab deine Antwort nicht richtig gelesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450537</guid><dc:creator><![CDATA[Salzwasser]]></dc:creator><pubDate>Thu, 16 Apr 2015 18:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Thu, 16 Apr 2015 19:07:15 GMT]]></title><description><![CDATA[<p>Salzwasser schrieb:</p>
<blockquote>
<p>Ist das denn legal? Darf man die Funktion einfach in &amp;infoLog[0] schreiben lassen, oder kann es Probleme geben?</p>
</blockquote>
<p>Ja, überschreiben kannste. Also der Speicher ist da und es ist solange Deiner.</p>
<p>Hab mich gerade aber nicht erinnert, daß '\0' das Endezeichen ist, wo std::&lt;&lt; aufhört, den std::string auszugeben. *angst*<br />
Könnte er so aprilsonnig sein und bis zu seinem .end() ausgeben?</p>
<p>Salzwasser schrieb:</p>
<blockquote>
<p>Alternativ fällt mir noch ein:</p>
</blockquote>
<p>Hmm.</p>
<p>Salzwasser schrieb:</p>
<blockquote>
<p>Was ist der richtige Weg?</p>
</blockquote>
<p>Klar, man braucht C++-Wrapper um C-APIs. Aber mit Gewalt C++ ist nicht der Weg. C++ kann auch C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450539</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 16 Apr 2015 19:07:15 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Fri, 17 Apr 2015 09:25:37 GMT]]></title><description><![CDATA[<p>Salzwasser schrieb:</p>
<blockquote>
<p>Schön und gut, ich kenne aber die Länge des Logs nicht.</p>
</blockquote>
<p>Egal was du tust, bei diesem API <strong>musst</strong> du vorher eine Länge festlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450570</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Fri, 17 Apr 2015 09:25:37 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Fri, 17 Apr 2015 10:06:19 GMT]]></title><description><![CDATA[<p>Salzwasser schrieb:</p>
<blockquote>
<p>Schön und gut, ich kenne aber die Länge des Logs nicht.</p>
</blockquote>
<p>Dann lies nochmal in der Dokumentation zu <code>glGetShaderInfoLog()</code> , ob es nicht eine Möglichkeit gibt, die Länge beim Shader anzufragen.</p>
<p>Belohnt Deine Suche wird! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2450571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450571</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 17 Apr 2015 10:06:19 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Fri, 17 Apr 2015 17:44:58 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>Salzwasser schrieb:</p>
<blockquote>
<p>Schön und gut, ich kenne aber die Länge des Logs nicht.</p>
</blockquote>
<p>Dann lies nochmal in der Dokumentation zu <code>glGetShaderInfoLog()</code> , ob es nicht eine Möglichkeit gibt, die Länge beim Shader anzufragen.</p>
<p>Belohnt Deine Suche wird! <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>
</blockquote>
<p>Du hast mich falsch verstanden. Ich kenne die Länge zur <strong>Compilezeit</strong> nicht und möchte sie deshalb nicht auf 1024 fixieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450678</guid><dc:creator><![CDATA[Salzwasser]]></dc:creator><pubDate>Fri, 17 Apr 2015 17:44:58 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Fri, 17 Apr 2015 17:59:12 GMT]]></title><description><![CDATA[<p>Salzwasser schrieb:</p>
<blockquote>
<p>Furble Wurble schrieb:</p>
<blockquote>
<p>Salzwasser schrieb:</p>
<blockquote>
<p>Schön und gut, ich kenne aber die Länge des Logs nicht.</p>
</blockquote>
<p>Dann lies nochmal in der Dokumentation zu <code>glGetShaderInfoLog()</code> , ob es nicht eine Möglichkeit gibt, die Länge beim Shader anzufragen.</p>
<p>Belohnt Deine Suche wird! <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>
</blockquote>
<p>Du hast mich falsch verstanden. Ich kenne die Länge zur <strong>Compilezeit</strong> nicht und möchte sie deshalb nicht auf 1024 fixieren.</p>
</blockquote>
<p>Hä? Furble wurble hat dir die Lösung doch gesagt du kannst die Size von glgetshaderinfolog abfragen und dann einen entsprechend großen String oder vector zur Laufzeit erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450679</guid><dc:creator><![CDATA[Ruvi]]></dc:creator><pubDate>Fri, 17 Apr 2015 17:59:12 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Fri, 17 Apr 2015 18:06:40 GMT]]></title><description><![CDATA[<p>Ruvi schrieb:</p>
<blockquote>
<p>Hä? Furble wurble hat dir die Lösung doch gesagt du kannst die Size von glgetshaderinfolog abfragen und dann einen entsprechend großen String oder vector zur Laufzeit erstellen.</p>
</blockquote>
<p>Das weiß ich doch. Die Lösung von TGGC und Volkard oben war, ein char-Array mit fester Länge von 1024 anzulegen. Das mochte ich nicht.<br />
Es war niemals das Problem, die Länge dynamisch abzufragen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450680</guid><dc:creator><![CDATA[Salzwasser]]></dc:creator><pubDate>Fri, 17 Apr 2015 18:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Sat, 18 Apr 2015 10:27:55 GMT]]></title><description><![CDATA[<p>The size of the buffer required to store the returned information log can be obtained by calling glGetShaderiv with the value GL_INFO_LOG_LENGTH.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450750</guid><dc:creator><![CDATA[openkronos]]></dc:creator><pubDate>Sat, 18 Apr 2015 10:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Sat, 18 Apr 2015 17:27:44 GMT]]></title><description><![CDATA[<p>Persönliche finde ich die unique_ptr Lösung am besten. Beim Arbeiten mit C-APIs ist es meiner Meinung nach auch die eleganteste Lösung. Anschliessend das char Array in einen std::string hauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450788</guid><dc:creator><![CDATA[Märchenwald]]></dc:creator><pubDate>Sat, 18 Apr 2015 17:27:44 GMT</pubDate></item><item><title><![CDATA[Reply to Beschreibbares char Array für C-Funktion bereitstellen, wie in modernem C++? on Sat, 18 Apr 2015 18:32:39 GMT]]></title><description><![CDATA[<p><code>unique_ptr&lt;T[]&gt;</code> ist als Lösung sicher OK.<br />
Ich persönlicher finde allerdings <code>vector&lt;T&gt;</code> einfacher, und sehe keine Vorteil darin <code>unique_ptr</code> zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2450798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2450798</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 18 Apr 2015 18:32:39 GMT</pubDate></item></channel></rss>