<?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[Problem mit Array als Rückgabe]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe eine Funktion, die ein Array über Pointer zurückgeben soll. Das sieht so aus:</p>
<pre><code class="language-cpp">double* calc_R(int* arr) //arr hat 6 Elemente
{
 double Ri[6];
 for (int i=0; i&lt;6; i++)
   Ri[i] = arr[i] / SENSI; //SENSI ist eine Konstante (50)
 return Ri;
}

int main()
{
 int num[6] = {100,150,200,250,300,350};
 double* R = calc_R(num);
 for (int i=0; i&lt;6; i++)
   cout &lt;&lt; R[i] &lt;&lt; endl;

 return 0;
}
</code></pre>
<p>Es wird kompiliert, doch es kommen bis auf den ersten völlig falsche Werte raus. Richt wäre 2,3,4,5,6,7.</p>
<p>Wo liegt mein Denkfehler?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270549/problem-mit-array-als-rückgabe</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 01:15:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270549.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jul 2010 12:00:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:00:58 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich habe eine Funktion, die ein Array über Pointer zurückgeben soll. Das sieht so aus:</p>
<pre><code class="language-cpp">double* calc_R(int* arr) //arr hat 6 Elemente
{
 double Ri[6];
 for (int i=0; i&lt;6; i++)
   Ri[i] = arr[i] / SENSI; //SENSI ist eine Konstante (50)
 return Ri;
}

int main()
{
 int num[6] = {100,150,200,250,300,350};
 double* R = calc_R(num);
 for (int i=0; i&lt;6; i++)
   cout &lt;&lt; R[i] &lt;&lt; endl;

 return 0;
}
</code></pre>
<p>Es wird kompiliert, doch es kommen bis auf den ersten völlig falsche Werte raus. Richt wäre 2,3,4,5,6,7.</p>
<p>Wo liegt mein Denkfehler?</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926130</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:08:25 GMT]]></title><description><![CDATA[<p>Du darfst keine Adresse auf ein lokales Objekt zurückgeben.</p>
<pre><code>#include &lt;vector&gt;

std::vector&lt;double&gt; calc_R(int* arr) //arr hat 6 Elemente
{
 std::vector&lt;double&gt; Ri(6);
 for (int i=0; i&lt;6; i++)
   Ri[i] = arr[i] / SENSI; //SENSI ist eine Konstante (50)
 return Ri;
}

int main()
{
 int num[6] = {100,150,200,250,300,350};
 std::vector&lt;double&gt; R = calc_R(num);
 for (int i=0; i&lt;6; i++)
   cout &lt;&lt; R[i] &lt;&lt; endl;

 return 0;
}
</code></pre>
<p>So könnte es gehen (hab's nicht übersetzt)</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926135</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:08:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Tue, 22 Nov 2011 14:04:08 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">return Ri; // [Warning] address of local variable `Ri' returned
</code></pre>
<p>Wenn die Funktion zu Ende ist, wird der Speicherplatz des Arrays wieder freigegeben und ist somit nicht mehr geschützt.<br />
Irgendetwas anderes benutzt halt danach diesen Speicherbereich und du bekommst Murks raus.</p>
<p>Machen kannst du es z.B. so, aber diese Lösung ist mit Sicherheit nicht als gut zu bewerten:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

double* calc_R(int* arr) // arr hat 6 Elemente
{
    /*
        dynamische Speicherverwaltung...
            Speicherplatz wird am Ende der Funktion nicht freigegeben
            und bleibt somit geschützt.
    */
    double* Ri = new double[6];
    for (int i=0; i&lt;6; i++)
        Ri[i] = arr[i] / 50; // SENSI ist eine Konstante (50)

    return Ri;
}

int main()
{
    int num[6] = {100,150,200,250,300,350};
    double* R = calc_R(num);

    for(int i=0; i&lt;6; i++)
        cout &lt;&lt; R[i] &lt;&lt; endl;

    delete[] R;

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1926136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926136</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 22 Nov 2011 14:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:13:24 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ok, vielen Dank! Das ist einleuchtend. Wenn ich nun ohne vector arbeiten möchte und das alles mit Array durchführen will, wie müsste es denn dann gehen? Kann ich das dann überhaupt mit einer FUnktion machen?</p>
<p>VIelen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926137</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:13:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:18:24 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Hallo,<br />
ok, vielen Dank! Das ist einleuchtend. Wenn ich nun ohne vector arbeiten möchte und das alles mit Array durchführen will, wie müsste es denn dann gehen? Kann ich das dann überhaupt mit einer FUnktion machen?</p>
<p>VIelen Dank<br />
lg, freakC++</p>
</blockquote>
<p>Nenne einen guten Grund, warum du es nicht mit std::vector machen möchtest <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>Du müsstest in der Funktion mit new double[6] Speicher auf dem Heap allokieren und später auch wieder frei geben.</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926143</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:18:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:19:29 GMT]]></title><description><![CDATA[<p>Wieso verwendest du double und int ?<br />
Reste bei der Division können in deinem Fall ja jetzt gar nicht entstehen <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/1926146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926146</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:23:50 GMT]]></title><description><![CDATA[<p>Weil mich auch immer die herkömmliche Variante interessiert. Deswegen möchte ich wissen, wie man das ohne std::vector machen kann.</p>
<p>Die Werte sind nur Beispiel. In Wirklichkeit sind das Divisionen, die nicht aufgehen.</p>
<p>Vielen Dank für eure Hilfe<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926149</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:23:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:27:15 GMT]]></title><description><![CDATA[<p>Vorweg: es ist dringend anzuraten, das mit <code>vector</code> oder <code>boost::array</code> oder etwas Vergleichbarem zu machen.</p>
<p>Ansonsten gäbe es 2 Möglichkeiten:</p>
<p>1. Array dynamisch anlegen</p>
<pre><code class="language-cpp">double* foo(...)
{
    double *Ri = new double[6];
    ...
    return Ri;
}

// Nachteil: Aufrufer muss Array freigeben
double *arr = foo(...);
...
delete[] arr; // !
// ---&gt; schlechter Stil, Speicheranforderung und -freigabe sind getrennt
</code></pre>
<p>2. Schon angefordertes Array wird per Parameter übergeben:</p>
<pre><code class="language-cpp">void foo(double* arr, ...)
{
    arr[0] = ...;
    ...
}

// Aufruf
double R[6];
foo(R);
// ---&gt; schon besser, funktioniert aber nicht direkt, wenn Aufrufer Größe des Arrays nicht kennt
</code></pre>
<p>Bei beiden Möglichkeiten machst du es dir aber unnötig schwer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926152</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:27:15 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:30:27 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ja, aber ich muss so langsam wieder in C++ reinkommen und mache mir darüber Gedanken. Ich habe über die Zeit viel vergessen und muss jetzt einiges rekapitulieren.</p>
<p>Deswegen kommen solche Fragen jetzt bestimmt häufiger.</p>
<p>Ihr habt zwar Recht, aber ich finde, man sollte beides könnnen.</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926156</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:30:27 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:33:53 GMT]]></title><description><![CDATA[<p>was ganz unflexibeles (und unsicheres) :p</p>
<pre><code class="language-cpp">void calc_R(int (&amp;RI)[6]) //arr hat 6 Elemente 
{ 
 for (int i=0; i&lt;6; i++) 
   RI[i] /= SENSI; //SENSI ist eine Konstante (50) 

 return;
} 

int main() 
{ 
 static int num[6] = {100,150,200,250,300,350}; 
 calc_R(num); 
 for (int i=0; i&lt;6; i++) 
   cout &lt;&lt; num[i] &lt;&lt; endl; 

 return 0; 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1926157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926157</guid><dc:creator><![CDATA[oneill5000]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:33:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:34:50 GMT]]></title><description><![CDATA[<p>Machen kannst du es z.B. so, wie oben von mir schon gepostet,</p>
<p>oder so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

void calc_R(int* arr, double* Ri)
{
    for (int i=0; i&lt;6; i++)
        Ri[i] = arr[i] / 50.0;
}

int main()
{
    const int SIZE = 6;

    int num[SIZE] = {100,150,200,250,300,350};
    double R[SIZE] = {};

    calc_R(num,R);

    for(int i=0; i&lt;6; i++)
        cout &lt;&lt; R[i] &lt;&lt; endl;

    system(&quot;pause&gt;nul&quot;);
    return 0;
}
</code></pre>
<p>oder so:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

void calc_R(double* num)
{
    for (int i=0; i&lt;6; i++)
        num[i] = num[i] / 50.0;
}

int main()
{
    double num[6] = {100,150,200,250,300,350};

    calc_R(num);

    for(int i=0; i&lt;6; i++)
        cout &lt;&lt; num[i] &lt;&lt; endl;

    system(&quot;pause&gt;nul&quot;);
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1926161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926161</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:34:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:44:08 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>Vorweg: es ist dringend anzuraten, das mit vector oder boost::array oder etwas Vergleichbarem zu machen.</p>
</blockquote>
<p>Aus reiner Neugier: Warum?<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926165</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:51:31 GMT]]></title><description><![CDATA[<p>Das frage ich mich auch.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18525">@oneill5000</a>: Bei dir ist aber das Problem, dass mein num Array dann überschrieben wird, wenn ich mit Referenzen arbeite. Das möchte ich aber nicht.</p>
<p>edit: Das gleiche gilt für das zweite Beispiel von Dweb. Du arbeitest zwar nicht mit Referenzen aber Du überschreibst es dennoch.</p>
<p>edit2: Ich hab es zwar nicht ausprobiert, aber wird das Array im ersten Beispiel von Dweb nur lokal verändert?</p>
<p>VIelen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926167</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:51:31 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:55:13 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>ipsec schrieb:</p>
<blockquote>
<p>Vorweg: es ist dringend anzuraten, das mit vector oder boost::array oder etwas Vergleichbarem zu machen.</p>
</blockquote>
<p>Aus reiner Neugier: Warum?<br />
Simon</p>
</blockquote>
<p>Einige wenige Punkt, die für vector und gegen eine händische Lösung sprechen:</p>
<ul>
<li>(Exception-)Sicherheit</li>
<li>geringerer Aufwand</li>
<li>weniger Fehlerquellen</li>
<li>besseres Design</li>
<li>generell kein manuelles Speichermanagement notwendig (ist fast immer von Vorteil)</li>
<li>besser erweiter- und wartbar</li>
</ul>
<p>In puncto Performance ist eine <code>vector</code> -Rückgabe zwar schlechter bestellt (wenn die NRVO nicht greift), das ändert sich aber in C++0x mit Moving-Konstruktoren. Außerdem ist der Unterschied bei 6 Werten sowieso irrelevant.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926173</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:55:13 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:57:01 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>edit: Das gleiche gilt für das zweite Beispiel von Dweb. Du arbeitest zwar nicht mit Referenzen aber Du überschreibst es dennoch.</p>
</blockquote>
<p>Dann kannst du mein erstes Beispiel verwenden oder ebn dynamische Speicherverwaltung, wie in meinem ersten Post</p>
<p>freakC++ schrieb:</p>
<blockquote>
<p>edit2: Ich hab es zwar nicht ausprobiert, aber wird das Array im ersten Beispiel von Dweb nur lokal verändert?</p>
</blockquote>
<p>Nein, wenn man dir schon eine Lösung anbietet, dann kannst du sie doch auch einfach schnell testen, ob's deinen Erwartungen entspricht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926175</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:57:01 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 12:58:23 GMT]]></title><description><![CDATA[<p>Ich denke auch, dass man std::vector mehr nutzen sollte, doch wie gesagt: Man muss beides können.</p>
<p>edit: Klar, Du hast recht, Dweb. Ich wollte dir nur sagen <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="😉"
    /> <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="😉"
    /> <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>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926176</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 14 Jul 2010 12:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 13:23:34 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe noch eine andere Frage. Diese passt noch gut zu dieser Threadüberschrift. Ich möchte ein zweidimensionales Array an eine Funktion übergeben, die dann zu jedem Element 2 addiert und das Array dann wieder zurückgibt - wieder eine Rückgabe von einem Array. Das müsste eigentlich genauso gehene wie mit 1D Arrays, doch ich meine, dass man Zeiger auf Zeiger braucht. Stimmt das:</p>
<p>ICh dachte an folgendes zur Übergabe:</p>
<pre><code class="language-cpp">double** addtwo (double** arr)
{
 for(int i=0; i&lt;6; i++)
   for(int j=0; j&lt;6;j++)
    arr[i][j]+=2;
//Rückgabe des Arrays

 return arr;
}
//Es kommt ein initialisertes [6][6] Array names foo.

addtwo(foo); //Fehler: Konvertierung nicht möglich
</code></pre>
<p>Wie funktioniert das denn bei zweidimensionalen Arrays. Liege ich mit meinen doppelten Zeigern falsch? WO liegt der Fehler bei der Übergabe?</p>
<p>Bitte nicht meckern, dass ich es mit extra umständlich machen will <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="😃"
    /> <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>Herzlichen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926201</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 14 Jul 2010 13:23:34 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 13:34:26 GMT]]></title><description><![CDATA[<p>Die Lösung zu diesem Problem findet du hier: <a href="http://c-faq.com/aryptr/pass2dary.html" rel="nofollow">http://c-faq.com/aryptr/pass2dary.html</a> . Da du offenbar versuchst Arrays und Pointer zu verstehen, wäre vermutlich das gesamte Kapitel 6 dieser FAQ eine schöne Lektüre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926207</guid><dc:creator><![CDATA[HyperSonic]]></dc:creator><pubDate>Wed, 14 Jul 2010 13:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Wed, 14 Jul 2010 13:43:46 GMT]]></title><description><![CDATA[<p>Sagen wir so: Ich versuche sie <strong>wieder</strong> zu verstehen. Ich muss gründlich wiederholen. Die Logik hinter Zeigern (jedenfalls den einfachen ist mir klar). Ich lese mir das mal durch, wenn ich Zuhause bin. Jetzt fahre ich erstmal 45 min Auto und dann schau ich mal, ob jemand noch einen hilfreichen Post gemacht hat <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="😃"
    /> <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>Ich danke euch!</p>
<p>Bis dann<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926214</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926214</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Wed, 14 Jul 2010 13:43:46 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Thu, 15 Jul 2010 10:59:11 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
die 45 min zu rum <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="🙂"
    /> und ich habe mir die gepostete Seite durchgelesen und geschafft, was ich machen wollte: 2D Array als Parameter einer Funktion. Ich habe dennoch noch zwei Fragen. Mein Code sieht nun so aus:</p>
<pre><code class="language-cpp">void foo(int (*ap)[6])	
{
  for (int i=0; i &lt; SIZE; i++)
    for(int j=0; j &lt; SIZE; j++)
      cout &lt;&lt; ap[i][j];
}
</code></pre>
<p>1.) Warum funktioniert diese Ausgabe? Woher weiß der Compiler, dass es sich um ein zweidimensionales Array handelt und was läuft intern ab?</p>
<p>2.) Die eine Dimension ist beliebig groß, doch die zweite ist mit 6 festgelegt. Wenn diese nun auch beliebig groß sein soll bzw. unbekannt bei der Übergabe, wie muss die Funktion dann modifiziert werden? Ich dachte ursprünglich an folgendes, doch das ist anscheinend völliger Quatsch:</p>
<pre><code class="language-cpp">void foo(int (*ap)*[]);
</code></pre>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926607</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Thu, 15 Jul 2010 10:59:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Thu, 15 Jul 2010 11:36:38 GMT]]></title><description><![CDATA[<p>Die Antwort ist: Es gibt keine 2-Dimensionalen Arrays. Es gibt aber Arrays von Arrays.</p>
<pre><code class="language-cpp">// bar ist ein 6-elementiges Array von 6-elementigen Arrays von int
int bar[6][6];
</code></pre>
<p>Übergibst Du das einer Funktion:</p>
<pre><code class="language-cpp">void foo(int (*ptr)[6]);
...
foo(bar);
</code></pre>
<p>sieht das dann inklusive Zeiger <code>ptr</code> so aus im Speicher:</p>
<pre><code>ptr                    ptr+1         ptr+5

    |                       |             |
    |                       |             |
    V                       V             V

  bar[0]_______________   bar[1]_ ...   bar[5]_______________
 /                     \ /             /                     \
+---+---+---+---+---+---+---+---+ ... +---+---+---+---+---+---+
|   | * |   |   |   |   |   |   |     |   |   |   |   |   | * |
+---+---+---+---+---+---+---+---+ ... +---+---+---+---+---+---+
      |                                                     |
  bar[0][1]                                             bar[5][5]
</code></pre>
<p><code>ptr</code> ist ein Zeiger auf ein 6-elementiges Array von ints. Beachte, dass <code>ptr[2]</code> dasselbe ist wie <code>*(ptr+2)</code> . Und da <code>ptr</code> vom Typ <code>int(*)[6]</code> ist, sollte auch klar sein, was bei der Pointer-Arithmetik passiert. <code>ptr[2]</code> ist also ein Lvalue-Ausdruck für ein 6-elementiges int-Array. Damit kann man zB auch wieder eine Referenz initialisieren:</p>
<pre><code class="language-cpp">int (&amp;arrayref)[6] = ptr[2];
arrayref[3] = 9;
assert(arrayref[3] == ptr[2][3]);
</code></pre>
<p>Jetzt sollte auch klar sein, warum man die Größe der &quot;inneren Arrays&quot; festlegen muss. Alles in der Richtung int <code>(*ptr)[]</code> ist völliger Quatsch. Du kannst eben keine Pointer-Arithmetik durchführen, wenn Du nicht weißt, wie groß ein Objekt des Typs ist, auf das der Zeiger zeigt.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926624</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 15 Jul 2010 11:36:38 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Array als Rückgabe on Thu, 15 Jul 2010 11:38:59 GMT]]></title><description><![CDATA[<p>machen könntest du es auch so:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;iostream&gt;
#include &lt;iterator&gt;

template&lt;typename T&gt;
struct divide
{
	divide(T divisor) : divisor(divisor) {}

	template&lt;typename U&gt;
	T operator() (U dividend) const
	{
		return static_cast&lt;T&gt;(dividend)/divisor;
	}
private:
	T divisor;
};

int main()
{
	int arr_src[] = { 0, 20, 40, 80, 160, 320 };
	const std::size_t size = sizeof arr_src/sizeof *arr_src;
	double arr_dst[size] = {0};

	std::transform(arr_src, arr_src+size, arr_dst, divide&lt;double&gt;(10.));

	std::copy(arr_dst, arr_dst+size, std::ostream_iterator&lt;double&gt;(std::cout, &quot;\r\n&quot;));
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926627</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 15 Jul 2010 11:38:59 GMT</pubDate></item></channel></rss>