<?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 als Rückgabewert]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich möchte eine Funktion schreiben die mir das Kreuzprodukt zweir Vektoren ausrechnet. Die Vectoren werden als Arrays übergeben, und ein selbiges möchte ich gern zurück haben.</p>
<p>Nur war meine bisherige Methode Mist, weil ich den Pointer auf eine Lokale Variable zurück gegeben habe. Mit Speicheralozierung kenn ich mich aber nicht so aus. Deshalb wüsste ich gern wie ich diese Funktion umschreiben muss, damit die Funktioniert:</p>
<pre><code class="language-cpp">float* vectorXproduct(float a[3], float b[3])
{
   float result[3] = {0,0,0};

   /* Die eigentliche Rechnung */

   return (float*)result;
}
</code></pre>
<p>Das ganze soll dann mal so aufgerufen werden:</p>
<pre><code class="language-cpp">float zAxe = {0,0,1};
      zAxe = vectorXproduct(zAxe, vec);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/136479/array-als-rückgabewert</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 12:13:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/136479.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Feb 2006 14:15:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:15:07 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich möchte eine Funktion schreiben die mir das Kreuzprodukt zweir Vektoren ausrechnet. Die Vectoren werden als Arrays übergeben, und ein selbiges möchte ich gern zurück haben.</p>
<p>Nur war meine bisherige Methode Mist, weil ich den Pointer auf eine Lokale Variable zurück gegeben habe. Mit Speicheralozierung kenn ich mich aber nicht so aus. Deshalb wüsste ich gern wie ich diese Funktion umschreiben muss, damit die Funktioniert:</p>
<pre><code class="language-cpp">float* vectorXproduct(float a[3], float b[3])
{
   float result[3] = {0,0,0};

   /* Die eigentliche Rechnung */

   return (float*)result;
}
</code></pre>
<p>Das ganze soll dann mal so aufgerufen werden:</p>
<pre><code class="language-cpp">float zAxe = {0,0,1};
      zAxe = vectorXproduct(zAxe, vec);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/990950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990950</guid><dc:creator><![CDATA[Anfänger06]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:15:07 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:22:03 GMT]]></title><description><![CDATA[<p>Nimm STL-Container oder Objekte statt Arrays, da machst du dir einiges leichter:</p>
<pre><code class="language-cpp">vector&lt;float&gt; Xprodukt(const vector&lt;float&gt;&amp; a, const vector&lt;float&gt;&amp; a)
{
  vector&lt;float&gt; res(3);
  //Rechnung
  return res;
}
</code></pre>
<p>(Alternativ kannst du auch eine eigene Klasse für deine Vektoren definieren)</p>
<p>PS: Wenn du unbedingt Pointer durch die Gegend reichen willst, lies dich am besten in die Funktionsweise von new/delete ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990959</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:22:03 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:27:18 GMT]]></title><description><![CDATA[<p>Ich brauche diese Arrays.<br />
Was muss ich anders machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990963</guid><dc:creator><![CDATA[Anfänger06]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:27:18 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:33:59 GMT]]></title><description><![CDATA[<p>Anfänger06 schrieb:</p>
<blockquote>
<p>Ich brauche diese Arrays.</p>
</blockquote>
<p>Randfrage: Wozu? Pointer-Biegereien sollte man in C++ möglichst vermeiden, wenn man die Chace hat.</p>
<p>Wenn du unbedingt willst: Du kannst das Array per &quot;float* res=new float[3];&quot; anlegen und übergeben - mußt es dann aber im Hauptprogramm per &quot;delete[] zAxe;&quot; wieder freigeben.</p>
<p>(oder du änderst deine Funktion so um, daß sie die Rückgabewerte in einem Parameter rausreicht:</p>
<pre><code class="language-cpp">void XProdukt(const float a[], const float b[], float res[]);
</code></pre>
<p>(die könnte eventuell Probleme mit dem Aliasing haben, also aufpassen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990968</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:36:11 GMT]]></title><description><![CDATA[<p>Wenn ich wie oben beschrieben den Funktionskopf so mache:</p>
<p>float* vectorXproduct(a[3],b[3]);</p>
<p>dann habe ich noch das Problem das ergebnis wieder in ein Array zu casten. Wie mache ich das? Weil</p>
<pre><code class="language-cpp">zAxis[3] = (float[3])vectorXproduct(a,b);
</code></pre>
<p>Ist laut ISO C++ verboten. (sagt mein Compiler)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990974</guid><dc:creator><![CDATA[Anfänger06]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:36:11 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:39:24 GMT]]></title><description><![CDATA[<p>Grüß Dich,</p>
<p>Anfänger06 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">float* vectorXproduct(float a[3], float b[3])
{
   float result[3] = {0,0,0};

   /* Die eigentliche Rechnung */

   return (float*)result;
}
</code></pre>
</blockquote>
<p>Folgendes passiert hier:<br />
Du rufst die Funktion mit den Parametern a und b auf. Auf dem Stack werden zusätzlich 12 Bytes belegt um die Werte für result zu speichern.<br />
Die Werte für Result werden berechnet, in result gespeichert, die Funktion verlassen - damit werden die 12 Byte an den Stack wieder zurückgegeben.<br />
Ob überhaupt und wenn ja wie lange, die Werte noch auf der zurückgegebenen Position &quot;result&quot; liegen, ist undefiniert.<br />
Sobald der Compiler etwas RAM braucht, wird er sich wieder vom Stack bedienen und Dein &quot;result&quot; überschreiben.<br />
Darum ist die Funktion falsch!</p>
<p>Du kannst eine Funktion schreiben, der Du angibst, wo sie das Ergebnis reinschreiben darf:</p>
<pre><code class="language-cpp">float* vectorXproduct(float a[3], float b[3], float * result)
</code></pre>
<p>Aufruf</p>
<pre><code class="language-cpp">float result[3];

zAxe = {0,0,1};
vectorXproduct(zAxe, vec, result);
</code></pre>
<p>oder Du belegst Speicher:</p>
<pre><code class="language-cpp">float* vectorXproduct(float a[3], float b[3])
{
   float * result = new float[3];
   result[0] = result[1] = result[2] = 0;

   /* Die eigentliche Rechnung */

   return result;
}
</code></pre>
<p>Den Speicher musst Du am Ende natürlich wieder freigeben.</p>
<pre><code class="language-cpp">float * result;

zAxe = {0,0,1};

result = vectorXproduct(zAxe, vec);

/* result verwenden */

delete result;
</code></pre>
<p>Du solltest, meiner Meinung nach, die erste Möglichkeit bevorzugt verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990975</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:39:24 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:39:54 GMT]]></title><description><![CDATA[<p>Ok...Das rückcasten kann ich umgehen. Wäre aber trotzdem schön zu wissen wie man einen Pointer rückgabewert, in ein als Array vereinbarten Wert speichert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990977</guid><dc:creator><![CDATA[Anfänger06]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:48:19 GMT]]></title><description><![CDATA[<p>Anfänger06 schrieb:</p>
<blockquote>
<p>Ok...Das rückcasten kann ich umgehen. Wäre aber trotzdem schön zu wissen wie man einen Pointer rückgabewert, in ein als Array vereinbarten Wert speichert.</p>
</blockquote>
<p>Du kannst den Pointer ja wieder zurückgeben. Aber Du solltest die Ergebnisse irgendwo hinschreiben, wo sie verfügbar bleiben und im Idealfall sagst Du der Funktion, wo sie ihr Ergebnis hinschreiben soll, damit sie nicht selber Speicher besorgen muss und die Speicherverwaltung überschaubarer bleibt.</p>
<p>Rückgabe wäre dann der selbe Pointer wie das 3. Argument, nur dass sich die Werte an der Adresse inzwischen geändert haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990978</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:49:36 GMT]]></title><description><![CDATA[<p>Elementweise <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">float* res = func();
float value[3];
for(i=0;i&lt;3;++i) value[i]=res[i];
</code></pre>
<p>aber noch besser ist es trotzdem, die Möglichkeiten von C++ zu nutzen - und das einfachste ist es, dein Array in eine Klasse einzupacken:</p>
<pre><code class="language-cpp">class mathVector
{
public:
  mathVector() {}
  mathVector(float* val)
  {for(int i=0;i&lt;3;++i) data[i]=val[i];}
  mathVector(float x,float y,float z)
  {data[0]=x;data[1]=y;data[2]=z;}

  ...

private:
  float data[3];
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/990980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990980</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:49:36 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 14:55:25 GMT]]></title><description><![CDATA[<p>[quote=&quot;CStoll&quot;]Elementweise <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">for(i=0;i&lt;3;++i) value[i]=res[i];
</code></pre>
<p>Es gibt auch Punkte, da ist eine Schleife übertrieben.<br />
Bei einem Vektor mit 3 Dimensionen ist dieser Punkt imho erreicht. ^^</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>aber noch besser ist es trotzdem, die Möglichkeiten von C++ zu nutzen - und das einfachste ist es, dein Array in eine Klasse einzupacken:</p>
</blockquote>
<p>Grundsätzlich stimme ich zu.<br />
Ich glaube aber, wenn jemand soeben gelernt hat, dass lokale Variablen bei Verlassen der Funktion die Gültigkeit verlieren, dann sind die Möglichkeiten von C++ Dinge, die er auch morgen noch lernen kann. :-&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990983</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990983</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Fri, 10 Feb 2006 14:55:25 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 15:09:26 GMT]]></title><description><![CDATA[<p>Xin schrieb:</p>
<blockquote>
<p>Es gibt auch Punkte, da ist eine Schleife übertrieben.<br />
Bei einem Vektor mit 3 Dimensionen ist dieser Punkt imho erreicht. ^^</p>
</blockquote>
<p>Ansichtssache <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="😉"
    /> Und so viel langsmaer dürfte eine Schleife gegenüber &quot;value[0]=res[0];value[1]=res[1];value[2]=res[2];&quot; nicht sein (auf jeden Fall macht sie weniger Schreibarbeit und ist übersichtlicher).</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>aber noch besser ist es trotzdem, die Möglichkeiten von C++ zu nutzen - und das einfachste ist es, dein Array in eine Klasse einzupacken:</p>
</blockquote>
<p>Grundsätzlich stimme ich zu.<br />
Ich glaube aber, wenn jemand soeben gelernt hat, dass lokale Variablen bei Verlassen der Funktion die Gültigkeit verlieren, dann sind die Möglichkeiten von C++ Dinge, die er auch morgen noch lernen kann. :-&gt;</p>
</blockquote>
<p>OK, dann warten wir noch etwas damit - trotzdem setzen wir als nächste Lektion an: Arrays lassen sich NICHT per =Operator kopieren, Objekte schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990989</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 10 Feb 2006 15:09:26 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 15:10:14 GMT]]></title><description><![CDATA[<p>Anfänger06 schrieb:</p>
<blockquote>
<p>Deshalb wüsste ich gern wie ich diese Funktion umschreiben muss, damit die Funktioniert:</p>
<pre><code class="language-cpp">float* vectorXproduct(float a[3], float b[3])
{
   float result[3] = {0,0,0};

   /* Die eigentliche Rechnung */

   return (float*)result;
}
</code></pre>
<p>Das ganze soll dann mal so aufgerufen werden:</p>
<pre><code class="language-cpp">float zAxe = {0,0,1};
      zAxe = vectorXproduct(zAxe, vec);
</code></pre>
</blockquote>
<p>probier dies:</p>
<pre><code class="language-cpp">typedef struct myvector
{
  float f[3];
} MYVECTOR;

MYVECTOR vectorXproduct (MYVECTOR a, MYVECTOR b)
{
   MYVECTOR result = {0.0, 0.0, 0.0};

   /* Die eigentliche Rechnung */

   return result;
}
</code></pre>
<p>geht in c etwa so, in c++ bestimmt ähnlich/auch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/990990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/990990</guid><dc:creator><![CDATA[net 0]]></dc:creator><pubDate>Fri, 10 Feb 2006 15:10:14 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 15:20:44 GMT]]></title><description><![CDATA[<p>[quote=&quot;net&quot;][quote=&quot;Anfänger06&quot;]</p>
<pre><code class="language-cpp">typedef struct myvector
{
  float f[3];
} MYVECTOR;
</code></pre>
<p>Jow...<br />
der Nick hieß &quot;Anfänger06&quot;... und das Problem war, dass er nicht wußte, dass lokale Variablen im Nirvana verschwinden.</p>
<p>&lt;zyn&gt;Vielleicht sollte noch jemand Templates vorstellen... die Lösung wäre für einen Anfänger noch komplizierter und damit komplett undurchführbar, aber noch viel besser.&lt;/zyn&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/991000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991000</guid><dc:creator><![CDATA[Xin]]></dc:creator><pubDate>Fri, 10 Feb 2006 15:20:44 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Rückgabewert on Fri, 10 Feb 2006 18:55:15 GMT]]></title><description><![CDATA[<p>Xin schrieb:</p>
<blockquote>
<p>&lt;zyn&gt;Vielleicht sollte noch jemand Templates vorstellen... die Lösung wäre für einen Anfänger noch komplizierter und damit komplett undurchführbar, aber noch viel besser.&lt;/zyn&gt;</p>
</blockquote>
<p>Also ich finde std::vector ist nicht sehr schwer auch nicht für einen Anfänger. Ist, finde ich eigentlich, die beste lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/991129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/991129</guid><dc:creator><![CDATA[linux_ubuntu]]></dc:creator><pubDate>Fri, 10 Feb 2006 18:55:15 GMT</pubDate></item></channel></rss>