<?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[Array by reference]]></title><description><![CDATA[<p>Hallo,</p>
<p>es gibt eine Funktion GetData(int &amp;len, unsigned char &amp;data).<br />
wie muss ich der Funktion mein Array übergeben?</p>
<p>Mein erster Versuch erzeugt einen leeren buffer:<br />
int len=255;<br />
unsigned char buf[256];<br />
memset(buf,0,256);<br />
GetData(len,buf[0]);</p>
<p>Mein zweiter Versuch ebenfalls:<br />
int len=255;<br />
unsigned char buf = new unsigned char[256];<br />
memset(buf,0,256);<br />
GetData(len,*buf);</p>
<p>Was mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231710/array-by-reference</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 17:15:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231710.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jan 2009 11:19:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 11:19:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>es gibt eine Funktion GetData(int &amp;len, unsigned char &amp;data).<br />
wie muss ich der Funktion mein Array übergeben?</p>
<p>Mein erster Versuch erzeugt einen leeren buffer:<br />
int len=255;<br />
unsigned char buf[256];<br />
memset(buf,0,256);<br />
GetData(len,buf[0]);</p>
<p>Mein zweiter Versuch ebenfalls:<br />
int len=255;<br />
unsigned char buf = new unsigned char[256];<br />
memset(buf,0,256);<br />
GetData(len,*buf);</p>
<p>Was mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645203</guid><dc:creator><![CDATA[MastaEda]]></dc:creator><pubDate>Wed, 14 Jan 2009 11:19:35 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 11:28:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">const unsigned int len=256;
unsigned char buf[len];
//füllen
GetData(len,buf);
</code></pre>
<p>Allerdings wird das Array nicht kopiert, sondern es wird nur ein Zeiger übergeben. Wenn du eine Kopier automatisch willst, kannst du einen Standardcontainer nehmen, wie z.B std::vector, welcher auch dynamisch ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645209</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645209</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 14 Jan 2009 11:28:30 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 11:33:40 GMT]]></title><description><![CDATA[<p>so bringt er den Fehler:<br />
Konvertierung des Parameters 2 von 'unsigned char [256]' in 'unsigned char &amp;' nicht moeglich</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645213</guid><dc:creator><![CDATA[MastaEda]]></dc:creator><pubDate>Wed, 14 Jan 2009 11:33:40 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 11:37:08 GMT]]></title><description><![CDATA[<p>Vorsicht, wenn du ein Array mit 256 Elementen deklarierst, ist die Länge 256 und <strong>nicht</strong> 255. 255 ist nur der höchste gültige Index, da bei 0 mit Zählen begonnen wird.</p>
<p>Die Schreibweisen <code>buf[0]</code> und <code>*buf</code> sind übrigens gleichwertig. Was geht denn an dem nicht?</p>
<pre><code class="language-cpp">GetData(len, buf[0])
</code></pre>
<p>Aber es ist merkwürdig, dass der <code>unsigned char</code> als Referenz übergeben wird. Bei Arrays ist es meistens ein Zeiger, oder dann eine Referenz auf das gesamte Array.</p>
<p>Für Array-Container würde ich <code>std::tr1::array</code> empfehlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645217</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 14 Jan 2009 11:37:08 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 11:45:13 GMT]]></title><description><![CDATA[<p>MastaEda schrieb:</p>
<blockquote>
<p>...GetData(int &amp;len, unsigned char &amp;data)...</p>
</blockquote>
<p>Hi,</p>
<p>bist Du sicher, dass diese Funktion für die Array-Übergabe geeignet ist?<br />
Wie Nexus empfinde ich das als hochgradig unüblich...<br />
Außerdem: Vielleicht ist es gar nicht verkehrt, wenn Du 0-en zurückbekommst.</p>
<p>drakon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">const unsigned int len=256;
unsigned char buf[len];
//füllen
GetData(len,buf);
</code></pre>
<p>...</p>
</blockquote>
<p>Für die Schnittstelle kann len allerdings nicht const sein...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645229</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 14 Jan 2009 11:45:13 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 11:49:24 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Für die Schnittstelle kann len allerdings nicht const sein...</p>
</blockquote>
<p>Stimmt, das kommt noch dazu.</p>
<p>Was ist das für eine Funktion, die die Länge möglicherweise verändert? Falls das wirklich für Arrays gedacht ist und die Länge geändert werden soll, geht das sowieso nur mit dynamischen Arrays. Aber selbst dann ist die Signatur komisch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645232</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 14 Jan 2009 11:49:24 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 12:01:43 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Für die Schnittstelle kann len allerdings nicht const sein...</p>
</blockquote>
<p>Stimmt, das kommt noch dazu.</p>
<p>Was ist das für eine Funktion, die die Länge möglicherweise verändert? Falls das wirklich für Arrays gedacht ist und die Länge geändert werden soll, geht das sowieso nur mit dynamischen Arrays. Aber selbst dann ist die Signatur komisch...</p>
</blockquote>
<p>Es geht darum Daten einzulesen und in len steht dann die tatsächlich gelesene Anzahl.<br />
Da das mit buf[0] und *buf nicht funktioniert scheint wohl die Funktion Macken zu haben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645245</guid><dc:creator><![CDATA[MastaEda]]></dc:creator><pubDate>Wed, 14 Jan 2009 12:01:43 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 12:04:49 GMT]]></title><description><![CDATA[<p>Sag doch einfach mal, was nicht funktioniert. Das, was du bis jetzt geliefert hast, ist keine Fehlerbeschreibung.</p>
<p>Fordert die Funktion selber genügend Speicher an oder musst du sicher sein, dass du ein genügend grosses Array hast? Solche Dinge sind eben gefährlich und können zu Pufferüberläufen führen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645248</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 14 Jan 2009 12:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 12:13:47 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Für die Schnittstelle kann len allerdings nicht const sein...</p>
</blockquote>
<p>Jop. War nicht ganz dabei. Bin gerade sowieso ziemlich <a href="http://www.spieleprogrammierer.de/phpBB2/viewtopic.php?p=125151#125151" rel="nofollow">genervt</a>..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645258</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 14 Jan 2009 12:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 12:52:42 GMT]]></title><description><![CDATA[<p>Die Schnittstelle stimmt nicht. Sie muss</p>
<pre><code class="language-cpp">GetData(size_t len, unsigned char *data);
</code></pre>
<p>lauten und nicht</p>
<pre><code class="language-cpp">GetData(size_t len, unsigned char &amp;data);
</code></pre>
<p><code>unsigned int&amp;</code> kann nicht <code>unsigned int*</code> referenzieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645291</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 14 Jan 2009 12:52:42 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 12:55:39 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...Was ist das für eine Funktion, die die Länge möglicherweise verändert? Falls das wirklich für Arrays gedacht ist und die Länge geändert werden soll, geht das sowieso nur mit dynamischen Arrays. Aber selbst dann ist die Signatur komisch...</p>
</blockquote>
<p>Also aus den reinen C-Umfeld ist mir das sattsam bekannt: len ist dabei ein &quot;update-Parameter&quot;:<br />
- Input: Länge des bereitgestellten Buffers<br />
- Output: Länge der tatsächlich genutzen Einträge (natürlich &lt;= Input)<br />
Hat diverse Nachteile (z.B. weiß man bei output=input nicht, ob das nun tatsächlich alle Daten waren), ist aber trotzdem eine durchaus gängige Methode.<br />
Das heißt: Die Länge des Buffers wird gar nicht verändert.</p>
<p>Das kann ich natürlich nicht 100%ig auch für diesen Fall sagen, aber ich halte es für sehr wahrscheinlich.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645294</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645294</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 14 Jan 2009 12:55:39 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 13:00:16 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Die Schnittstelle stimmt nicht. Sie muss</p>
<pre><code class="language-cpp">GetData(size_t len, unsigned char *data);
</code></pre>
<p>lauten ...</p>
</blockquote>
<p>Ich vermute ja auch, dass das eigentlich gemeint ist (allerding mit len als &amp; oder <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="😉"
    /> ... aber andererseits fällt mir gerade kein Argument ein es so zu machen:</p>
<pre><code class="language-cpp">GetData(size_t&amp; len, unsigned char &amp;data) {
   for(size_t i=0; i&lt;len &amp;&amp; i&lt;23 ; ++i) {
      (&amp;data)[i] = 0x12;
   }
   len = i;   
}
</code></pre>
<p>Wäre das verboten/falsch/unmöglich?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645302</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 14 Jan 2009 13:00:16 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 13:01:16 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Für die Schnittstelle kann len allerdings nicht const sein...</p>
</blockquote>
<p>Jop. War nicht ganz dabei. Bin gerade sowieso ziemlich <a href="http://www.spieleprogrammierer.de/phpBB2/viewtopic.php?p=125151#125151" rel="nofollow">genervt</a>..</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Mein herzliches Beileid!<br />
Solche Sachen sind extrem ätzend...</p>
<p>*daumen-drück*</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645304</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 14 Jan 2009 13:01:16 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 13:02:35 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Die Schnittstelle stimmt nicht. Sie muss</p>
<pre><code class="language-cpp">GetData(size_t len, unsigned char *data);
</code></pre>
<p>lauten und nicht</p>
<pre><code class="language-cpp">GetData(size_t len, unsigned char &amp;data);
</code></pre>
<p><code>unsigned int&amp;</code> kann nicht <code>unsigned int*</code> referenzieren...</p>
</blockquote>
<p>Sie kann aber die Adresse des ersten Wertes eines Arrays übergeben.</p>
<p>Da ich die Funktion aus einer Dll aufrufe, dessen Quellcode mir nicht vorliegt, werd ich mal den Entwickler kontaktieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645305</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645305</guid><dc:creator><![CDATA[MastaEda]]></dc:creator><pubDate>Wed, 14 Jan 2009 13:02:35 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 13:05:13 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p><code>unsigned int&amp;</code> kann nicht <code>unsigned int*</code> referenzieren...</p>
</blockquote>
<p>Aber <code>unsigned int</code> und dann indirekt den Zeiger über dessen Adresse. Wie kommst du eigentlich auf <code>size_t</code> ? <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>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Ich vermute ja auch, dass das eigentlich gemeint ist (allerding mit len als &amp; oder <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="😉"
    /> ... aber andererseits fällt mir gerade kein Argument ein es so zu machen:</p>
</blockquote>
<p>Daran habe ich eben auch gedacht, also dass intern die Adresse genommen wird und so die nächsten Elemente des Arrays gelesen werden können.</p>
<p>MastaEda schrieb:</p>
<blockquote>
<p>Da ich die Funktion aus einer Dll aufrufe, dessen Quellcode mir nicht vorliegt, werd ich mal den Entwickler kontaktieren.</p>
</blockquote>
<p>Hast du denn keine Dokumentation dazu? Falls doch, was sagt die zu den erwarteten Parametern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645309</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 14 Jan 2009 13:05:13 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 13:43:04 GMT]]></title><description><![CDATA[<p>Danke für die Antworten.<br />
Es hat sich jetzt herausgestellt dass die Funktion in der DLL anderweitig fehlerhaft ist und das mit dem buf[0] bzw *buf funktionieren würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645352</guid><dc:creator><![CDATA[MastaEda]]></dc:creator><pubDate>Wed, 14 Jan 2009 13:43:04 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 14:04:46 GMT]]></title><description><![CDATA[<p>MastaEda schrieb:</p>
<blockquote>
<p>Es hat sich jetzt herausgestellt dass ... das mit dem buf[0] bzw *buf funktionieren würde.</p>
</blockquote>
<p>Das entspricht ja auch der Signatur der Funktion. Aber so kann man kein Array übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645369</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 14 Jan 2009 14:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 14:11:19 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>MastaEda schrieb:</p>
<blockquote>
<p>Es hat sich jetzt herausgestellt dass ... das mit dem buf[0] bzw *buf funktionieren würde.</p>
</blockquote>
<p>Das entspricht ja auch der Signatur der Funktion. Aber so kann man kein Array übergeben.</p>
</blockquote>
<p>Doch wie schon erwähnt wird die Adresse, des ersten Arrayelements übergeben. Mit Hilfe der Längen-Variablen weiß die Funktion dann wieviel Speicher beschrieben werden darf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645373</guid><dc:creator><![CDATA[MastaEda]]></dc:creator><pubDate>Wed, 14 Jan 2009 14:11:19 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 14:33:36 GMT]]></title><description><![CDATA[<p>Das ist nicht ganz korrekt. Genaugenommen wird eine Referenz auf ein char übergeben. Die Adresse muß die Funktion mittels Adressoperator (zB unsigned char *pt = &amp;data) selbst ermitteln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645406</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Wed, 14 Jan 2009 14:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to Array by reference on Wed, 14 Jan 2009 14:42:17 GMT]]></title><description><![CDATA[<p>Und es wird niemand daran gehindert, nur einen einzelnen <code>unsigned char</code> zu übergeben. Okay, bei einem Zeiger könnte man auch einen einzelnen Wert referenzieren, aber da denkt man schon eher an ein Array.</p>
<p>Naja, normalerweise hat man das Problem eh nicht, da man mit Containern arbeitet. Da kann man sich auch veränderliche Dimensionsparameter sparen...<br />
Bei einer DLL würde ich aber wenigstens eine C-Style-Funktion erwarten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1645413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1645413</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 14 Jan 2009 14:42:17 GMT</pubDate></item></channel></rss>