<?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[was ist die beste Möglichkeit einen Datenpuffer aus einer Funktion zurückzugeben??]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>wie gebt ihr eigentlich Daten aus einer Funktion zurück, wenn wir mal annehmen dass die Größe der Datenmenge nicht bekannt ist?</p>
<p>Variante 1:</p>
<pre><code>unsigned char* getBuffer(int &amp;bufSize);
</code></pre>
<p>Hier reserviert die Funktion getBuffer dynamischen Speicher und schreibt die Größe in die Variable bufSize. Bei Erfolg wird ein Pointer zurückgegeben und im Fehlerfall ein nullptr. Nachteil ist schon mal, dass ich den Speicher manuell freigeben muss. ...eventuell kann man aber auch einen SmartPointer verwenden (bin mir nicht sicher)</p>
<p>Variante 2:</p>
<pre><code>int getBuffer(unsigned char &amp;buffer, int maxBufSize);
</code></pre>
<p>Hier schreibt die Funktion die Daten in die gegebene Referenz 'buffer'. maxBufSize stellt dabei die Größe des Puffers dar. Rückgabewert wäre z.B. Die Anzahl der kopierten Bytes</p>
<p>Variante 3:</p>
<pre><code>typedef struct {
    unsigned char *buf;
    unsigned int size;
}data_t;

data_t getBuffer();
</code></pre>
<p>Hier werden die Daten einfach in eine struct gepackt.</p>
<p>Variante 4:</p>
<pre><code>std::vector&lt;unsigned char&gt; getBuffer();
</code></pre>
<p>Wahrscheinlich die beste Methode. Speicher wird automatisch erweitert und man muss sich keine Gedanken um die Freigabe machen.<br />
Frage: Kann ich einfach einen std::vector zurückgeben oder kann das irgendwelche Probleme verursachen? Was gebe ich im Fehlerfall zurück? Sowas: 'return std::vector&lt;unsigned char&gt;();'?</p>
<p>... gibt es noch bessere Varianten? Wie macht ihr es?</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337607/was-ist-die-beste-möglichkeit-einen-datenpuffer-aus-einer-funktion-zurückzugeben</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 23:44:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337607.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Apr 2016 08:07:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to was ist die beste Möglichkeit einen Datenpuffer aus einer Funktion zurückzugeben?? on Thu, 14 Apr 2016 08:07:04 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>wie gebt ihr eigentlich Daten aus einer Funktion zurück, wenn wir mal annehmen dass die Größe der Datenmenge nicht bekannt ist?</p>
<p>Variante 1:</p>
<pre><code>unsigned char* getBuffer(int &amp;bufSize);
</code></pre>
<p>Hier reserviert die Funktion getBuffer dynamischen Speicher und schreibt die Größe in die Variable bufSize. Bei Erfolg wird ein Pointer zurückgegeben und im Fehlerfall ein nullptr. Nachteil ist schon mal, dass ich den Speicher manuell freigeben muss. ...eventuell kann man aber auch einen SmartPointer verwenden (bin mir nicht sicher)</p>
<p>Variante 2:</p>
<pre><code>int getBuffer(unsigned char &amp;buffer, int maxBufSize);
</code></pre>
<p>Hier schreibt die Funktion die Daten in die gegebene Referenz 'buffer'. maxBufSize stellt dabei die Größe des Puffers dar. Rückgabewert wäre z.B. Die Anzahl der kopierten Bytes</p>
<p>Variante 3:</p>
<pre><code>typedef struct {
    unsigned char *buf;
    unsigned int size;
}data_t;

data_t getBuffer();
</code></pre>
<p>Hier werden die Daten einfach in eine struct gepackt.</p>
<p>Variante 4:</p>
<pre><code>std::vector&lt;unsigned char&gt; getBuffer();
</code></pre>
<p>Wahrscheinlich die beste Methode. Speicher wird automatisch erweitert und man muss sich keine Gedanken um die Freigabe machen.<br />
Frage: Kann ich einfach einen std::vector zurückgeben oder kann das irgendwelche Probleme verursachen? Was gebe ich im Fehlerfall zurück? Sowas: 'return std::vector&lt;unsigned char&gt;();'?</p>
<p>... gibt es noch bessere Varianten? Wie macht ihr es?</p>
<p>viele Grüße,<br />
SBond</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2493141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493141</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 14 Apr 2016 08:07:04 GMT</pubDate></item><item><title><![CDATA[Reply to was ist die beste Möglichkeit einen Datenpuffer aus einer Funktion zurückzugeben?? on Thu, 14 Apr 2016 08:22:27 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>Variante 4:</p>
<pre><code>std::vector&lt;unsigned char&gt; getBuffer();
</code></pre>
<p>Wahrscheinlich die beste Methode. Speicher wird automatisch erweitert und man muss sich keine Gedanken um die Freigabe machen.<br />
Frage: Kann ich einfach einen std::vector zurückgeben oder kann das irgendwelche Probleme verursachen?</p>
</blockquote>
<p>Das sieht vernünftig aus, denn: 1) Der Besitzer des Speichers ist eindeutig festgelegt, 2) Speicher wird automatisch freigegeben ⇒ Exception sicher</p>
<p>SBond schrieb:</p>
<blockquote>
<p>Was gebe ich im Fehlerfall zurück?</p>
</blockquote>
<p>Wirf eine Exception.</p>
<p>SBond schrieb:</p>
<blockquote>
<p>... gibt es noch bessere Varianten? Wie macht ihr es?</p>
</blockquote>
<p>Besitzverhältnisse müssen klar (sprich durch den Compiler erzwungen) festgelegt werden. Daher bieten sich hier nur besitzergreifende Container an, wie z.B. vector, unique_ptr, etc.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2493142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493142</guid><dc:creator><![CDATA[Biolunar]]></dc:creator><pubDate>Thu, 14 Apr 2016 08:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to was ist die beste Möglichkeit einen Datenpuffer aus einer Funktion zurückzugeben?? on Thu, 14 Apr 2016 08:36:39 GMT]]></title><description><![CDATA[<p>sehr gut <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>kann man eigentlich einen std::vector&lt;unsigned char&gt; irgendwie als Parameter verwenden, in dem eigentlich ein unsigned char* erwartet wird?</p>
<p>wenn ich z.B. solche Funktionen habe (z.B. aus Bibliotheken):</p>
<pre><code>int getBuffer(unsigned char *buffer, int maxBufSize);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2493144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493144</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 14 Apr 2016 08:36:39 GMT</pubDate></item><item><title><![CDATA[Reply to was ist die beste Möglichkeit einen Datenpuffer aus einer Funktion zurückzugeben?? on Thu, 14 Apr 2016 08:58:55 GMT]]></title><description><![CDATA[<p>Das kommt darauf an, was die Funktion</p>
<pre><code>int getBuffer(unsigned char *buffer, int maxBufSize);
</code></pre>
<p>macht. Was macht sie?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2493145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493145</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 14 Apr 2016 08:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to was ist die beste Möglichkeit einen Datenpuffer aus einer Funktion zurückzugeben?? on Thu, 14 Apr 2016 09:26:33 GMT]]></title><description><![CDATA[<p>SBond schrieb:</p>
<blockquote>
<p>sehr gut <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>kann man eigentlich einen std::vector&lt;unsigned char&gt; irgendwie als Parameter verwenden, in dem eigentlich ein unsigned char* erwartet wird?</p>
<p>wenn ich z.B. solche Funktionen habe (z.B. aus Bibliotheken):</p>
<pre><code>int getBuffer(unsigned char *buffer, int maxBufSize);
</code></pre>
</blockquote>
<p>Wenn sie das macht, was man intuitiv erwartet:</p>
<pre><code class="language-cpp">std::vector&lt;unsigned char&gt; v(100);

auto read = getBuffer(&amp;v[0], v.size() );
auto read2 = getBuffer(v.data(), v.size() );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2493148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493148</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 14 Apr 2016 09:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to was ist die beste Möglichkeit einen Datenpuffer aus einer Funktion zurückzugeben?? on Thu, 14 Apr 2016 09:37:10 GMT]]></title><description><![CDATA[<p>danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>theta schrieb:</p>
<blockquote>
<p>Das kommt darauf an, was die Funktion</p>
<pre><code>int getBuffer(unsigned char *buffer, int maxBufSize);
</code></pre>
<p>macht. Was macht sie?</p>
</blockquote>
<p>Hätte ich noch erwähnen sollen. Diese Funktion würde jetzt die Daten in den ersten Parameter schreiben. Der zweite Parameter gibt die Funktion die Information, wie groß dieser Speicher ist (damit nicht mehr Daten geschrieben werden, als Speicher reserviert ist). Rückgabewert wäre z.B. die Anzahl der kopierten Bytes</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2493149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2493149</guid><dc:creator><![CDATA[SBond]]></dc:creator><pubDate>Thu, 14 Apr 2016 09:37:10 GMT</pubDate></item></channel></rss>