<?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[Arrayinformation über Funktion beibehalten]]></title><description><![CDATA[<p>Okay, folgendes:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; inline size_t sizeof_a(T arr[])
{
	return sizeof(arr) / sizeof(arr[0]);
}

#define SIZEOF_A(x) (sizeof(x) / sizeof((x)[0]))

int abc[100];
cout &lt;&lt; sizeof_a(abc) &lt;&lt; endl; // 1
cout &lt;&lt; SIZEOF_A(abc) &lt;&lt; endl; // 100
</code></pre>
<p>1. funktioniert nicht wie erwartet.<br />
2. schon.</p>
<p>Also, ich möchte die Array Größe ermitteln lassen. Dass das zweite funktioniert ist klar, liefert auch 100 als Ergebnis. Aber das erste liefert nur 1. Warum?<br />
sizeof(arr) liefert 4, da arr in diesem Fall als Pointer interpretiert wird. sizeof(arr[0]) ist ebenfalls 4 (zumindest, wenn sizeof(int) == 4) und daraus resultiert 1.</p>
<p>Frage: Gibt es eine Möglichkeit, die Arrayeigentschaft beizubehalten, sodass sizeof(arr) in der Funktion 400 ergibt und damit 100 als Ergebnis liefert?</p>
<p>Dankö!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/164369/arrayinformation-über-funktion-beibehalten</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 23:18:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/164369.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 07 Nov 2006 16:53:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Tue, 07 Nov 2006 16:53:48 GMT]]></title><description><![CDATA[<p>Okay, folgendes:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; inline size_t sizeof_a(T arr[])
{
	return sizeof(arr) / sizeof(arr[0]);
}

#define SIZEOF_A(x) (sizeof(x) / sizeof((x)[0]))

int abc[100];
cout &lt;&lt; sizeof_a(abc) &lt;&lt; endl; // 1
cout &lt;&lt; SIZEOF_A(abc) &lt;&lt; endl; // 100
</code></pre>
<p>1. funktioniert nicht wie erwartet.<br />
2. schon.</p>
<p>Also, ich möchte die Array Größe ermitteln lassen. Dass das zweite funktioniert ist klar, liefert auch 100 als Ergebnis. Aber das erste liefert nur 1. Warum?<br />
sizeof(arr) liefert 4, da arr in diesem Fall als Pointer interpretiert wird. sizeof(arr[0]) ist ebenfalls 4 (zumindest, wenn sizeof(int) == 4) und daraus resultiert 1.</p>
<p>Frage: Gibt es eine Möglichkeit, die Arrayeigentschaft beizubehalten, sodass sizeof(arr) in der Funktion 400 ergibt und damit 100 als Ergebnis liefert?</p>
<p>Dankö!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170600</guid><dc:creator><![CDATA[array]]></dc:creator><pubDate>Tue, 07 Nov 2006 16:53:48 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Tue, 07 Nov 2006 16:59:17 GMT]]></title><description><![CDATA[<p>Nein, gibt es nicht. Darum nimmt man stattdessen normalerweise std::vector und std::vector::size().</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170604</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170604</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Tue, 07 Nov 2006 16:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Tue, 07 Nov 2006 17:07:22 GMT]]></title><description><![CDATA[<p>array schrieb:</p>
<blockquote>
<p>Frage: Gibt es eine Möglichkeit, die Arrayeigentschaft beizubehalten, sodass sizeof(arr) in der Funktion 400 ergibt und damit 100 als Ergebnis liefert?</p>
<p>Dankö!</p>
</blockquote>
<p>Wenn du dein Array zum einziges Mitglied einer struct machst gehts (sizeof struct/sizeof T).<br />
<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/1170615</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170615</guid><dc:creator><![CDATA[freak11]]></dc:creator><pubDate>Tue, 07 Nov 2006 17:07:22 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Tue, 07 Nov 2006 17:08:53 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Das Template sollte so aussehen</p>
<pre><code class="language-cpp">template&lt;class T, std::size_t N&gt;
std::size_t countem(T (&amp;)[N])
{
  return N;                  
}
</code></pre>
<p>Aber wie schon gesagt, ist das nicht wirklich gut. Spätestens wenn es um Pointer/Referenzen auf Arrays geht, versagt das.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170618</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 07 Nov 2006 17:08:53 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Tue, 07 Nov 2006 17:19:18 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template&lt;class T, std::size_t N&gt;
std::size_t countem(T (&amp;)[N])
{
  return N;                  
}
</code></pre>
</blockquote>
<p>Genau das habe ich irgendwo schonmal gesehen (irgenwie in Zusammenhang mit boost). Aber ich habe das nicht wirklich verstanden.</p>
<p>Kann man das irgendwie genauer erklären, weil das ja doch ein wenig kryptisch ausschaut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170626</guid><dc:creator><![CDATA[array]]></dc:creator><pubDate>Tue, 07 Nov 2006 17:19:18 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Tue, 07 Nov 2006 19:27:49 GMT]]></title><description><![CDATA[<p>Das ist eine Template-Funktion deren Template-Parameter der Typ und die Größe des Arrays sind.</p>
<pre><code class="language-cpp">T (&amp;)[N]
</code></pre>
<p>ist eine Referenz auf ein Array der Größe N von Elementen des Typs T. Ohne die Klammern wäre es ein Array von Referenzen (was bekanntlich nicht geht). Diese Funktion gibt die Größe N zurück. Durch die Deduktion der Template-Parameter (will heissen bei Angabe der Funktionsargumente ist der Compiler selbst in der Lage die Vorlagenargumente zu ermitteln) expandiert das ganze z.B. so:</p>
<pre><code class="language-cpp">Typ array[100];
size_t length = countem(array);
// expandiert zu
size_t length = countem&lt;Typ, 100&gt;(array);
</code></pre>
<p>Im besten Fall (inline) expandiert das ganze dann zu &quot;100&quot;. Ein großer Vorteil dieser Methode ist (bitte korrigieren falls das durch den Standard nicht gedeckt sein sollte, meine Compiler handeln das alle so), dass das (im Gegensatz zum Makro) nicht compiliert, wenn der Arraytyp unvollständig ist oder ein Zeigertyp übergeben wird.</p>
<p>Und was schöner aussieht darf jeder selbst entscheiden <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>
<pre><code class="language-cpp">std::copy( array, array + countem( array ), ziel );
std::copy( array, array + sizeof( array ) / sizeof( array[ 0 ] ), ziel );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1170706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170706</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 07 Nov 2006 19:27:49 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Tue, 07 Nov 2006 20:57:19 GMT]]></title><description><![CDATA[<p>Ich würde für Arrays zwar auch eher einen passenden Container empfehlen. Wenn man es aber unbedingt braucht, würde ich eher zu einem Makro greifen.</p>
<pre><code class="language-cpp">#define lengthof(x) (sizeof(x) / sizeof(*x))
</code></pre>
<p>Das kommt sizeof am nächsten, da das Ergebnis ein konstanter Ausdruck ist. Dies ist bei der Funktionsversion nicht der Fall, und für mich damit für eine generelle Verwendung unbrauchbar. Zwar fehlt dem Makro die Sicherheit bei Zeigerargumenten und UDTs, vielleicht kann man aber auch das noch irgendwie hinbekommen. Wäre alles kein Problem, wenn es ein Schlüsselwort <em>typeof</em> geben würde, was ja leider (noch) nicht der Fall ist. <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170783</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Tue, 07 Nov 2006 20:57:19 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Wed, 08 Nov 2006 08:05:12 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Ich würde für Arrays zwar auch eher einen passenden Container empfehlen. Wenn man es aber unbedingt braucht, würde ich eher zu einem Makro greifen.</p>
<pre><code class="language-cpp">#define lengthof(x) (sizeof(x) / sizeof(*x))
</code></pre>
<p>Das kommt sizeof am nächsten, da das Ergebnis ein konstanter Ausdruck ist.</p>
</blockquote>
<p>Das kommt der sizeof()-Lösung nicht nur nahe, das <strong>ist</strong> die sizeof-Lösung (mit all ihren Problemen und Einschränkungen). Und hier geht es gerade darum, diese Probleme zu umgehen.</p>
<p>PS: Es gibt übrigens ein typeof - das nennt sich &quot;typeid&quot; (und ist an der Stelle leider nicht besonders hilfreich)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170902</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170902</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 08 Nov 2006 08:05:12 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Wed, 08 Nov 2006 08:05:23 GMT]]></title><description><![CDATA[<p>array schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">template&lt;typename T&gt; inline size_t sizeof_a(T arr[])
{
	return sizeof(arr) / sizeof(arr[0]);
}
</code></pre>
<p>...</p>
</blockquote>
<p>Hi,</p>
<p>ich meine, mich daran zu erinnern, dass ein Arrayparameter beim Funktionsaufruf immer zu einem Zeiger degeneriert, so dass &quot;sizeof(arr)&quot; nur &quot;die Länge einer Zeigervariable&quot; gibt.<br />
Bei einem #define (was ja eine reine Textersetzung ist) passiert das nicht; deswegen funktioniert der obige Mechanismus nur mit #define und nicht mit Funktionen (selbst wenn sie aus einem template intantiiert wurden).</p>
<p>Bei akaris Version &quot;zieht&quot; auch nicht direkt die &quot;Parameterbehandlung bei Funktionen&quot;, sondern die &quot;automatische Spezialisierungsregel bei Templates&quot;, weswegen das klappt.<br />
-- So jedenfalls meine Vermutung --</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1170903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1170903</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 08 Nov 2006 08:05:23 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Wed, 08 Nov 2006 21:56:50 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Es gibt übrigens ein typeof - das nennt sich &quot;typeid&quot;</p>
</blockquote>
<p>Naja, das sind aber schon noch zwei ziemlich unterschiedliche Sachen. Zumindest nach dem, was ich unter typeof verstehe. Und wie du schon sagtest, typeid nützt einem hier nichts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1171493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1171493</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Wed, 08 Nov 2006 21:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to Arrayinformation über Funktion beibehalten on Thu, 09 Nov 2006 09:27:28 GMT]]></title><description><![CDATA[<p>in der aktuellen version vom gcc gibt's typeof und das funtkioniert auch. Ziemlich praktisch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1171591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1171591</guid><dc:creator><![CDATA[gcc]]></dc:creator><pubDate>Thu, 09 Nov 2006 09:27:28 GMT</pubDate></item></channel></rss>