<?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[2D arrays effizient übergeben und zurückgeben?]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe zwar schon mal ein wenig in C++ programmiert, aber hier habe ich gerade ein totales Anfängerproblem (bin ich auch wieder in C++): Wie gehe ich mit 2D arrays (oder arrays noch höherer Dimension) richtig um?</p>
<p>Ist es richtig, dass ich so ein 2D-array übergeben kann?</p>
<pre><code class="language-cpp">void foo(double matrix[][3], ...) {...
</code></pre>
<p>Hierbei hätte matrix eine feste Größe. Habt ihr einen besseren Vorschlag? Wie gehe ich am besten bei variabler Größe vor? Welche keywords sollte ich ggf. berücksichtigen?</p>
<p>Mich irritiert, dass ich double vor matrix setzen muß und sich sonst der Compiler beschwert:</p>
<pre><code class="language-cpp">void foo(double matrix[3][3], ...) {
    double matrix[3][3] = {{ 1.0, 0.0, 0.0},
                           { 0.0, 1.0, 0.0},
                           { 0.0, 0.0, 1.0}};
</code></pre>
<p>matrix ist dem Compiler doch bekannt, oder? Wieso also 'double matrix[][]?</p>
<p>Und umgekehrt? Wie gibt man am besten ein solches array bzw. die Referenz darauf zurück? Ich würde am liebsten im Code schreiben können 'matrix2 = foo(matrix1)', also so, dass matrix1 nicht verändert wird und matrix2 der Rückgabewert ist. Hier stehe ich völlig auf dem Schlauch.</p>
<p>Wäre nett, wenn ihr mir helfen könntet, gerne auch mit einem guten Link, der diese Fragen abdeckt oder Ideen, was ich ändern sollte.</p>
<p>Danke,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234301/2d-arrays-effizient-übergeben-und-zurückgeben</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 11:41:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234301.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Feb 2009 11:43:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 11:43:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe zwar schon mal ein wenig in C++ programmiert, aber hier habe ich gerade ein totales Anfängerproblem (bin ich auch wieder in C++): Wie gehe ich mit 2D arrays (oder arrays noch höherer Dimension) richtig um?</p>
<p>Ist es richtig, dass ich so ein 2D-array übergeben kann?</p>
<pre><code class="language-cpp">void foo(double matrix[][3], ...) {...
</code></pre>
<p>Hierbei hätte matrix eine feste Größe. Habt ihr einen besseren Vorschlag? Wie gehe ich am besten bei variabler Größe vor? Welche keywords sollte ich ggf. berücksichtigen?</p>
<p>Mich irritiert, dass ich double vor matrix setzen muß und sich sonst der Compiler beschwert:</p>
<pre><code class="language-cpp">void foo(double matrix[3][3], ...) {
    double matrix[3][3] = {{ 1.0, 0.0, 0.0},
                           { 0.0, 1.0, 0.0},
                           { 0.0, 0.0, 1.0}};
</code></pre>
<p>matrix ist dem Compiler doch bekannt, oder? Wieso also 'double matrix[][]?</p>
<p>Und umgekehrt? Wie gibt man am besten ein solches array bzw. die Referenz darauf zurück? Ich würde am liebsten im Code schreiben können 'matrix2 = foo(matrix1)', also so, dass matrix1 nicht verändert wird und matrix2 der Rückgabewert ist. Hier stehe ich völlig auf dem Schlauch.</p>
<p>Wäre nett, wenn ihr mir helfen könntet, gerne auch mit einem guten Link, der diese Fragen abdeckt oder Ideen, was ich ändern sollte.</p>
<p>Danke,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664619</guid><dc:creator><![CDATA[CMB]]></dc:creator><pubDate>Mon, 16 Feb 2009 11:43:15 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 12:11:31 GMT]]></title><description><![CDATA[<p>Generell würde ich matrizen und sowas nicht selbst schreiben, sondern vorhandenes nutzen: <a href="http://eigen.tuxfamily.org" rel="nofollow">http://eigen.tuxfamily.org</a>. Ist 100% XPlatform, da es reines C++ ist und nicht als lib, sondern als Headersammlung daherkommt.<br />
Oder man nimmt boost::math.</p>
<blockquote>
<p>Und umgekehrt? Wie gibt man am besten ein solches array bzw. die Referenz darauf zurück? Ich würde am liebsten im Code schreiben können 'matrix2 = foo(matrix1)', also so, dass matrix1 nicht verändert wird und matrix2 der Rückgabewert ist. Hier stehe ich völlig auf dem Schlauch.</p>
</blockquote>
<p>Und so wie du es möchtest, macht man aus matrix am besten eine Klasse, die den Zugriff auf die eigentlichen Werte kapselt.<br />
Dazu gibts im Netz sehr viele Beispiele.<br />
So mein Ansatz, der natürlich das eigene Problem nicht behebt, aber einen Denkansatz in Richtung Objektorientierung liefert.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664629</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 16 Feb 2009 12:11:31 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 12:48:24 GMT]]></title><description><![CDATA[<p>Vielen Dank. Das ist interessant. eigen kannte ich noch nicht.</p>
<p>Aber darf ich dennoch fragen, wie man das eigentliche Problem lösen könnte? Sonst lerne ich ja nicht. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1664646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664646</guid><dc:creator><![CDATA[CMB]]></dc:creator><pubDate>Mon, 16 Feb 2009 12:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 13:07:35 GMT]]></title><description><![CDATA[<p>Ich würde einen Zeiger auf einen Zeiger übergeben.</p>
<pre><code class="language-cpp">double g_matrix[X][X];
int main()
{
   foobar(g_matrix);
}

void foobar(double **matrix)
{

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1664662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664662</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 16 Feb 2009 13:07:35 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 13:17:46 GMT]]></title><description><![CDATA[<p>Autsch!</p>
<p>Vielen Dank - ich sagte glaube ich schon, dass ich gerade auf dem Schlauch stehe, oder?</p>
<p>Danke,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664668</guid><dc:creator><![CDATA[CMB]]></dc:creator><pubDate>Mon, 16 Feb 2009 13:17:46 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 13:29:39 GMT]]></title><description><![CDATA[<p>CMB schrieb:</p>
<blockquote>
<p>Hierbei hätte matrix eine feste Größe. Habt ihr einen besseren Vorschlag? Wie gehe ich am besten bei variabler Größe vor? Welche keywords sollte ich ggf. berücksichtigen?</p>
</blockquote>
<p>Sofern du nicht auf eine spezielle Matrixbibliothek zurückgreifst wäre vielleicht std::vector etwas für dich (kann man auch verschachteln).</p>
<p>CMB schrieb:</p>
<blockquote>
<p>Mich irritiert, dass ich double vor matrix setzen muß und sich sonst der Compiler beschwert:</p>
<pre><code class="language-cpp">void foo(double matrix[3][3], ...) {
    double matrix[3][3] = {{ 1.0, 0.0, 0.0},
                           { 0.0, 1.0, 0.0},
                           { 0.0, 0.0, 1.0}};
</code></pre>
<p>matrix ist dem Compiler doch bekannt, oder? Wieso also 'double matrix[][]?</p>
</blockquote>
<p>Edit: dank Hinweis von scorcher24.<br />
matrix ist innerhalb der Funktion schon bekannt, nur Initialisieren geht nur bei der Deklaration. Du schreibst hier auch garnicht in den Parameter matrix, sondern in eine neue, lokale Variable die den Parameter verdeckt.</p>
<p>...Auch die Ausmessungen des Arrays sind von Haus aus nicht bekannt (Es sei den, du verabschiedest dich von C-Arrays, und nimmst statt dessen C++ Klassen mit entsprechenden Funktionalitäten), wenn du mit Arrayübergaben arbeitest, musst du entweder sicherstellen das die Größe immer gleich bleibt, oder die Bereiche mit übergeben.</p>
<p>Und bei Klassen: Effiziente Übergabe mittels Referenzen oder konstanten Referenten, nicht per Wert.</p>
<p>cu André<br />
P.S: Und globale Variablen, wie auch von scorcher gezeigt sollte man möglichst meiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664669</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 16 Feb 2009 13:29:39 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 13:26:11 GMT]]></title><description><![CDATA[<blockquote>
<p>matrix ist dem Compiler nicht global bekannt.</p>
</blockquote>
<p>In dem Context war das auch innerhalb der Funktion foo gemeint, geh ich mal von aus. Wollte das auch erst schreiben, aber beim 2ten lesen merkt mans :).</p>
<blockquote>
<p>P.S: Und globale Variablen, wie auch von scorcher gezeigt sollte man möglichst meiden.</p>
</blockquote>
<p>Schnelles Beispiel und so...<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664673</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 16 Feb 2009 13:26:11 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 13:30:48 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Ich würde einen Zeiger auf einen Zeiger übergeben.</p>
<pre><code class="language-cpp">double g_matrix[X][X];
int main()
{
   foobar(g_matrix);
}

void foobar(double **matrix)
{

}
</code></pre>
</blockquote>
<pre><code>error: argument of type &quot;double (*)[5]&quot; is incompatible with
          parameter of type &quot;double **&quot;
</code></pre>
<p>Es gibt grundsätzlich zwei Ansätze</p>
<ol>
<li>
<p>Du machst es auf die harte Tour manuell mit Zeigern (so ähnlich, wie Scorcher vorgeschlagen hat) oder</p>
</li>
<li>
<p>Du benutzt std::vector</p>
</li>
</ol>
<p>Zu beidem mal ein Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;

using namespace std;

void PrintMatrix(double **matrix, size_t height, size_t width)
{
   for(size_t i = 0; i &lt; height; ++i)
   {
       for(size_t j = 0; j &lt; width; ++j)
       {
           cout &lt;&lt; matrix[i][j] &lt;&lt; &quot; &quot;;
       }
       cout &lt;&lt; endl;
   }
}

//Per const-Referenz übergeben - verhindert aufwendiges Kopieren
void PrintMatrix(vector&lt;vector&lt;double&gt; &gt; const &amp;matrix)
{
   //Ja, Iteratoren wären schöner gewesen
   for(size_t i = 0; i &lt; matrix.size(); ++i)
   {
       for(size_t j = 0; j &lt; matrix[i].size(); ++j)
       {
           cout &lt;&lt; matrix[i][j] &lt;&lt; &quot; &quot;;
       }
       cout &lt;&lt; endl;
   }
}

int main()
{
   {
      //1.1) Alternative - Array in ein Array aus Pointern umwandeln :(
      double array[][3] = {{1, 2, 3},
                           {4, 5, 6},
                           {7, 8, 9}};
      double *pointerArray[3] = {array[0], array[1], array[2]};
      PrintMatrix(pointerArray, 3, 3);
   }
   {
      //1.2) Array direkt mit dynamischer Speicherverwaltung als Array von Pointern basten - hat den Vorteil, dass es dynamischer ist
      size_t height, width;
      cin &gt;&gt; height &gt;&gt; width;
      double **array = new double*[height];
      for(size_t i = 0; i &lt; height; ++i)
      {
         array[i] = new double[width];
      }
      //Initialisierung der Werte fehlt...
      PrintMatrix(array, height, width);
      for(size_t i = 0; i &lt; height; ++i)
      {
         delete[] array[i];
      }
      delete[] array;
   }
   {
      //2. Alternative mit std::vector
      double array[][3] = {{1, 2, 3},
                           {4, 5, 6},
                           {7, 8, 9}};
      //Geht auch schöner, aber so wahrscheinlich einfacher und für mich schneller ;)
      vector&lt;vector&lt;double&gt; &gt; mat;
      for(size_t i = 0; i &lt; 3; ++i)
      {
          mat.push_back(vector&lt;double&gt;(array[i] + 0, array[i]+3));
      }
      PrintMatrix(mat);
   }
}
</code></pre>
<p>Hoffe, das hilft</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664676</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Mon, 16 Feb 2009 13:30:48 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 14:42:11 GMT]]></title><description><![CDATA[<p>Vielen vielen Dank.</p>
<p>Erst war ich zögerlich &lt;vector&gt; zu nutzen, weil ich den Overhead klein halten wollte. Absolut lächerlich. Typerischer Fall von voreilieger &amp; sinnloser Optimierung. Jetzt komme ich mit wesentlich weniger Code aus, der natürlich auch viel übersichtlicher und intuitiver zu nutzen ist.</p>
<p>Aber es ist so lange her, dass ich C++ genutzt habe, dass ich mir diese Gehschwierigkeiten verzeihe.</p>
<p>Gruß,<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664714</guid><dc:creator><![CDATA[CMB]]></dc:creator><pubDate>Mon, 16 Feb 2009 14:42:11 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 15:10:43 GMT]]></title><description><![CDATA[<p>CMB schrieb:</p>
<blockquote>
<p>Erst war ich zögerlich &lt;vector&gt; zu nutzen, weil ich den Overhead klein halten wollte.</p>
</blockquote>
<p>Es gibt zwar einen &quot;Overhead&quot; dieser ist jedoch gering. Die Standardbibliothek ist meist recht gut optimiert, zumindest besser, als wenn man es ohne großen Aufwand selbst schreiben würde.</p>
<p>CMB schrieb:</p>
<blockquote>
<p>Jetzt komme ich mit wesentlich weniger Code aus, der natürlich auch viel übersichtlicher und intuitiver zu nutzen ist.</p>
</blockquote>
<p>Leider ist die Standardbibliothek nicht immer so intuitiv (gerade für Neulinge ist das Konzept nicht immer verständlich).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664734</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 16 Feb 2009 15:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 17:57:40 GMT]]></title><description><![CDATA[<p>Scorcher24 schrieb:</p>
<blockquote>
<p>Ich würde einen Zeiger auf einen Zeiger übergeben.</p>
<pre><code class="language-cpp">double g_matrix[X][X];
int main()
{
   foobar(g_matrix);
}

void foobar(double **matrix)
{

}
</code></pre>
</blockquote>
<p>Hast du das überhaupt schon mal probiert? - Das geht nicht. Ich weiss gar nicht, warum sich das so verbreitet hat..<br />
Auch ein 2-Dimensionales Array ist lediglich 1-Dimensional. Wenn du das also per Zeiger machen willst, dann eher so:</p>
<pre><code class="language-cpp">double g_matrix[X][X];
int main()
{
   foobar(&amp;g_matrix[0][0], X,X);
}

void foobar(double* matrix, int dim1, int dim2)
{

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1664856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664856</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 16 Feb 2009 17:57:40 GMT</pubDate></item><item><title><![CDATA[Reply to 2D arrays effizient übergeben und zurückgeben? on Mon, 16 Feb 2009 22:25:36 GMT]]></title><description><![CDATA[<p>Schon wieder so ein Fall, wo einfach mal <code>std::vector</code> empfohlen wird.</p>
<p>Hier wäre meiner Ansicht ein <code>std::tr1::array</code> viel geeigneter. Erstens spart man sich den Overhead, da man direkt auf einem statischen Array arbeitet, und zweitens braucht man die Funktionalität des <code>std::vector</code> s (dynamische Verwaltung) hier gar nicht.</p>
<pre><code class="language-cpp">void PrintMatrix(const std::tr1::array&lt;std::tr1::array&lt;double, 3&gt;, 3&gt;&amp; Matrix);
</code></pre>
<p>Oder ohne Namensraum-Kennzeichner, um ein gleichwertiges Beispiel zu liefern:</p>
<pre><code class="language-cpp">void PrintMatrix(const array&lt;array&lt;double, 3&gt;, 3&gt;&amp; Matrix);
</code></pre>
<p>Geht natürlich nur mit TR1-Unterstützung. Der Header dazu ist</p>
<pre><code class="language-cpp">#include &lt;array&gt;
</code></pre>
<p>Klar, wenn man die Matrixgrösse nicht weiss oder irgendwelche andere Funktionalität des <code>std::vector</code> s braucht, ist der schon okay. Aber ich wollte dem Threadersteller noch eine andere, leider nicht so verbreitete Möglichkeit zeigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1664999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1664999</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 16 Feb 2009 22:25:36 GMT</pubDate></item></channel></rss>