<?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[Größe eines übergebenen Arrays bestimmen]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie bestimme ich die Größe eines Arrays, welches<br />
ich als Eingabeparameter erhalten habe?</p>
<p>Der Funktionskopf:</p>
<p>Object::Object(float newX, float newY, float newZ, CUSTOMVERTEX vertexArray[], int vCount)</p>
<p>Ich würde gerne die Länge von vertexArray hier selber bestimmen und ungern vorher zählen müssen (also vCount als Parameter mitschleppen)</p>
<p>sizeof(vertexArray) liefert die Größe vom Pointer<br />
sizeof(*vertexArray) liegert die Größe vom ersten Element</p>
<p>Ich brauche aber die Größe vom gesamten Array um daraus die Länge zu errechnen!</p>
<p>Die Form der Übergabe des Array ist frei wählbar.</p>
<p>Mit freundlichem Gruß<br />
Schifty</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/255587/größe-eines-übergebenen-arrays-bestimmen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 22:50:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255587.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Dec 2009 16:23:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 16:23:59 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie bestimme ich die Größe eines Arrays, welches<br />
ich als Eingabeparameter erhalten habe?</p>
<p>Der Funktionskopf:</p>
<p>Object::Object(float newX, float newY, float newZ, CUSTOMVERTEX vertexArray[], int vCount)</p>
<p>Ich würde gerne die Länge von vertexArray hier selber bestimmen und ungern vorher zählen müssen (also vCount als Parameter mitschleppen)</p>
<p>sizeof(vertexArray) liefert die Größe vom Pointer<br />
sizeof(*vertexArray) liegert die Größe vom ersten Element</p>
<p>Ich brauche aber die Größe vom gesamten Array um daraus die Länge zu errechnen!</p>
<p>Die Form der Übergabe des Array ist frei wählbar.</p>
<p>Mit freundlichem Gruß<br />
Schifty</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816574</guid><dc:creator><![CDATA[Schifty]]></dc:creator><pubDate>Wed, 02 Dec 2009 16:23:59 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 16:44:08 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class A
{
public:
    template&lt;typename Iter&gt;
    A(float x, Iter first, Iter last)
        : v_(first, last), x_(x)
    {}

    template&lt;typename Container&gt;
    A(float x, Container in)
        : v_(in.begin(), in.end()), x_(x)
    {}

    std::vector&lt;int&gt; v_;
    float x_;
};

int main()
{
    using namespace std;

    int arr[3] = {9, 8, 7};
    tr1::array&lt;int, 5&gt; a = {1,2,3,4,5};
    set&lt;int&gt; s;

    A aa(1.23, a.begin(), a.end());
    A bb(1.54, a);
    A cc(1.54, s);
    A dd(2.54, arr, arr + sizeof(arr) / sizeof(arr[0]) );

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1816590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816590</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 02 Dec 2009 16:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 17:21:36 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9203">@brotbernd</a><br />
Sieht irgendwie doppelt gemoppelt aus</p>
<pre><code class="language-cpp">Object::Object(float newX, float newY, float newZ, std::vector&lt;CUSTOMVERTEX&gt; &amp;vertexArray) 
{ std::for_each(vertexArray.begin(), vertexArray.end(), boost::bind(CopyCoordsToVec(_1, x, y, z))); } // Was auch immer du vor hast!?
</code></pre>
<p>EDIT:<br />
std::vector::size() returnt einen std::size_type mit der Größe des Vektors.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816613</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Wed, 02 Dec 2009 17:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 17:28:22 GMT]]></title><description><![CDATA[<p>Schifty schrieb:</p>
<blockquote>
<p>Ich brauche aber die Größe vom gesamten Array</p>
</blockquote>
<p>Dann merk sie Dir irgendwo oder benutz etwas anderes als Zeiger!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816616</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 02 Dec 2009 17:28:22 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 17:44:21 GMT]]></title><description><![CDATA[<p>Gerade diese Vertex Geschichte ist sehr wichtig für die Performance - ich würde ungern das Vertex-Array in vector überführen, nur um die Größe zu bestimmen und dann anschließend wieder mit dem Array arbeiten ... denn dieses brauche ich um über Memcopy einen VertexBuffer zu bauen.</p>
<p>EDIT:</p>
<p>Dort wo ich das Array erstelle, kann ich ja ohne Probleme auf die Gesamtgröße zugreifen - worin besteht denn der genaue Unterschied zwischen der Variable am Anfang und der im Funktionskopf - sind ja beides nur Pointer aufs erste Element, aber das eine liefert mir die Gesamtgröße, das andere nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816624</guid><dc:creator><![CDATA[Schifty]]></dc:creator><pubDate>Wed, 02 Dec 2009 17:44:21 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 17:43:31 GMT]]></title><description><![CDATA[<p>Du weißt hoffentlich das der Unterschied bei Bruchteilen von Millisekunden liegt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816630</guid><dc:creator><![CDATA[Kóyaánasqatsi]]></dc:creator><pubDate>Wed, 02 Dec 2009 17:43:31 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 17:46:49 GMT]]></title><description><![CDATA[<p>Bei 10.000 Objekten mit ca. 200k CUSTOMVERTEX Punkten ist das schon deutlich spürbar. Insbesondere wenn ich 60 Frames die Sekunde rendern möchte....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816634</guid><dc:creator><![CDATA[Schifty]]></dc:creator><pubDate>Wed, 02 Dec 2009 17:46:49 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 18:01:16 GMT]]></title><description><![CDATA[<p>wieso nimmst du überhaupt native arrays?<br />
was spricht dagegen, direkt vector zu nehmen?<br />
(bevor du dich mit angeblichen performance-problemen rausredest: es gibt keinen einzigen grund, wieso vector langsamer als nen c-array sein sollte...)</p>
<p>wenn du native arrays brauchst, ist das mit vector auch kein problem:</p>
<pre><code class="language-cpp">std::vector&lt;KOMISCHER_TYP&gt; vec;
//füllen oder resize oder was auch immer
c_api_fkt(&amp;vec[0], vec.size());
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816641</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 02 Dec 2009 18:01:16 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 18:31:57 GMT]]></title><description><![CDATA[<p>Wieso ich native Arrays verwenden möchte?</p>
<p>Weil ich keine Ahnung ob und wie memcpy mit vector funktioniert.<br />
Vertices ist im folgenden mein CUSTOMVERTEX Array.<br />
pVoidist mit einem meiner VertexBuffer verknüpft</p>
<p>memcpy(pVoid, currentObject-&gt;vertices, vertexCount*sizeof((*currentObject-&gt;vertices)));</p>
<p>Wenn der Befehl gehen würde, wäre vector eine sinnvolle Alternative.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816657</guid><dc:creator><![CDATA[Schifty]]></dc:creator><pubDate>Wed, 02 Dec 2009 18:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 18:43:16 GMT]]></title><description><![CDATA[<p>Schifty schrieb:</p>
<blockquote>
<p>Gerade diese Vertex Geschichte ist sehr wichtig für die Performance - ich würde ungern das Vertex-Array in vector überführen, nur um die Größe zu bestimmen und dann anschließend wieder mit dem Array arbeiten ... denn dieses brauche ich um über Memcopy einen VertexBuffer zu bauen.</p>
</blockquote>
<p>Klingt so, als würdest Du nicht die Garantie kennen, die std::vector macht. Die Elemente stehen alle hintereinander im Speicher. Du kannst Dir also ein Zeiger-Paar so geben lassen und auch benutzen:</p>
<pre><code class="language-cpp">void foo(double const* beg, double const* end);

void bar(std::vector&lt;double&gt; const&amp; vec)
{
  double const* beg = vec.empty() ? 0 : &amp;vec.front();
  double const* end = beg + vec.size();
  foo(beg,end);
}
</code></pre>
<p>Schifty schrieb:</p>
<blockquote>
<p>EDIT:</p>
<p>Dort wo ich das Array erstelle, kann ich ja ohne Probleme auf die Gesamtgröße zugreifen - worin besteht denn der genaue Unterschied zwischen der Variable am Anfang und der im Funktionskopf - sind ja beides nur Pointer aufs erste Element, aber das eine liefert mir die Gesamtgröße, das andere nicht?</p>
</blockquote>
<p>Wie bitte? Formuliere das mal um, dass ich das auch verstehe, was Du meinst. Was meinst Du mit &quot;Variable am Anfang&quot; und &quot;Variable im Funktionskopf&quot;? Was für einen Unterschied soll es da geben?</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816665</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Wed, 02 Dec 2009 18:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 20:20:17 GMT]]></title><description><![CDATA[<p>Jopp, memcpy geht - std::copy wäre aber eine sinnvolle alternative <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
dann entfällt dieses hässliche sizeof(...) auch und langsamer sollte es auch wieder nicht sein...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816711</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 02 Dec 2009 20:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 20:38:24 GMT]]></title><description><![CDATA[<p>Tut mir Leid für die unsaubere Formulierung, war auf dem Sprung beim Edit.</p>
<p>Wenn ich das Array in der Main erstelle</p>
<p>CUSTOMVERTEX cube[] = {...};</p>
<p>und direkt dahinter sizeof(cube) schreibe<br />
erhalte ich die Größe des gesamten Arrays.</p>
<p>Übergebe ich an eine Funktion:<br />
new Object(cube);</p>
<p>Object::Object(CUSTOMVERTEX vertexArray[]) {...}</p>
<p>Und schreibe hier sizeof(vertexArray) erhalte ich die<br />
größe des Pointers, bzw mit * die Größe des ersten Elements.</p>
<p>Ich dachte es handelt sich in beiden Fällen um Pointer auf das erste Element?<br />
Wo liegt der unterschied, und gibt es eine Möglichkeit im letzteren Fall, ersteres sizeof-Ergebnis zu erlangen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816727</guid><dc:creator><![CDATA[Schifty]]></dc:creator><pubDate>Wed, 02 Dec 2009 20:38:24 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Wed, 02 Dec 2009 21:28:30 GMT]]></title><description><![CDATA[<p>Schifty schrieb:</p>
<blockquote>
<p>gibt es eine Möglichkeit im letzteren Fall, ersteres sizeof-Ergebnis zu erlangen?</p>
</blockquote>
<p>nein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1816754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1816754</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 02 Dec 2009 21:28:30 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Thu, 03 Dec 2009 18:22:33 GMT]]></title><description><![CDATA[<p>Wenn du eine Funktion aufrufst (das gilt auch für die main) wird für sie ein Stackframe eingerichtet um für alle lokalen Variablen usw. Speicher einzurichten.<br />
Und wenn du in einem solchen Stackframe nun lokal ein array erzeugst, sind die Größeninformationen halt noch vorhanden weil halt alle Elemente aufeinanderfolgend in diesem Tackframe liegen(Um missverständnissen vorzubeugen, die Informationen sind nicht vorhanden weil der Speicher aufeinander folgend reserviert ist, sondern weil dies im Stackframe geschieht). Wenn du dieses array nun einer Funktion übergibst wird für sie ebenfalls ein Stackframe eingerichtet, welche jedoch nur Speicher für diesen Zeiger reserviert, wodurch dieser nunmal nichts mehr über die größe des Arrays weiß.</p>
<p>Aber in beiden Fällen handelt es sich wie du schon sagtest intern um einen Zeiger. Doch erkennt der Compiler natürlich wann du so ein Ding auch wirklich als array deklariert hast.<br />
Aber wie gesagt, dass funktioniert nur weil die Informationen aus dem Stackframe ermittelt werden können so ein Array fürht keinerleich Verwaltungsinformationen mit sich, am Ende hast du mit so einem array halt &quot;nur&quot; aufeinander folgenden Speicher für Mehrere Objekte eines Typs und nicht mehr.</p>
<p>--------------------------</p>
<p>Und wenn du wirklich ein eigenes Array anlegen möchtest ohne auf die Größeninformationen zu verzichten, könntest du dir im ersten Element oder je nachdem wie du das handhabst vor dem Ersten Element die Anzahl der Elemente als int speichern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817276</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817276</guid><dc:creator><![CDATA[Kahino]]></dc:creator><pubDate>Thu, 03 Dec 2009 18:22:33 GMT</pubDate></item><item><title><![CDATA[Reply to Größe eines übergebenen Arrays bestimmen on Thu, 03 Dec 2009 19:01:41 GMT]]></title><description><![CDATA[<p>Schifty schrieb:</p>
<blockquote>
<p>Wenn ich das Array in der Main erstelle</p>
<p>CUSTOMVERTEX cube[] = {...};</p>
<p>und direkt dahinter sizeof(cube) schreibe erhalte ich die Größe des gesamten Arrays.</p>
</blockquote>
<p>Korrekt. Größe in Bytes.</p>
<p>Schifty schrieb:</p>
<blockquote>
<p>Übergebe ich an eine Funktion:<br />
new Object(cube);</p>
<p>Object::Object(CUSTOMVERTEX vertexArray[]) {...}</p>
<p>Und schreibe hier sizeof(vertexArray) erhalte ich die<br />
größe des Pointers, bzw mit * die Größe des ersten Elements.</p>
</blockquote>
<p>Korrekt.</p>
<p>Schifty schrieb:</p>
<blockquote>
<p>Ich dachte es handelt sich in beiden Fällen um Pointer auf das erste Element? Wo liegt der unterschied,</p>
</blockquote>
<p>Nein. Das erste ist ein Array vom Typ CUSTOMVERTEX[N] (nicht CUSTOMVERTEX[] !) mit N=Anzahl der Elemente. Das zweite ist ein Zeiger. Großer Unterschied!</p>
<p>C++ erlaubt Dir einfach bei der Definition von <code>cube</code> das N wegzulassen. Der Compiler ist so schlau, dass er das selbst einsetzen kann, nachdem er die Elemente gezählt hat.</p>
<p>Der Typ CUSTOMVERTEX[] hingegen wird <em><em>in der Parameterliste einer Funktion zu CUSTOMVERTEX</em> übersetzt</em>*. Auch eine Größe, falls angegeben, wird ignoriert. Diese Ersetzung des Typs findet statt, weil es in C auch so ist, weil man dachte es wäre praktisch, und weil Arrays keine Kopier-Semantik haben. Diese Ersetzung gibt es nur, falls das [] sich auf der &quot;obersten Ebene&quot; befindet. Ein Zeiger ( <code>int(*)[3]</code> ) oder eine Referenz ( <code>int(&amp;)[3]</code> ) auf ein Array gibt es also als möglichen Parameter.</p>
<p>CUSTOMVERTEX[] ist aber auch als &quot;unvollständiger Typ&quot; in einer <em>Deklaration</em> auf globaler bzw Namensraum Ebene und innerhalb von Klassen für statische Elemente zulässig (Array mit Größe, die nicht verraten wird). Da es sich in dieser Situation um einen unvollständigen Typ handelt, ist die Anwendung von <code>sizeof</code> gar nicht zulässig.</p>
<p>Schifty schrieb:</p>
<blockquote>
<p>und gibt es eine Möglichkeit im letzteren Fall, ersteres sizeof-Ergebnis zu erlangen?</p>
</blockquote>
<p>Nur, wenn Du den Konstruktor von <code>Object</code> änderst. Hier mal eine Inspiration:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class referenz_auf_bloedes_array
{
  T* base_;
  std::size_t size_;
public:
  referenz_auf_bloedes_array(T* base, std::size_t N)
  : base_(base), size_(N) {}

  template&lt;std::size_t N&gt;
  referenz_auf_bloedes_array(T (&amp;ref)[N])
  : base_(ref), size_(N) {}

  std::size_t size() const {size_;}

  T&amp; operator[](std::ptrdiff_t idx) const {return base_[idx];}
};

void foo(referenz_auf_bloedes_array&lt;int&gt; r) {
  if (3u &lt;= r.size()) {
    r[0] = 1;
    r[1] = 2;
    r[2] = 3;
  }
}

int main() {
  int xx[] = {9,9,9,9,9};
  foo(xx);
}
</code></pre>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1817303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1817303</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 03 Dec 2009 19:01:41 GMT</pubDate></item></channel></rss>