<?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[Probleme bei Return by Reference oder was anderem]]></title><description><![CDATA[<p>Hi !!!</p>
<p>Ich habe folgenden Code:<br />
Datei Matrix.h</p>
<pre><code class="language-cpp">#define index(i,j) (i*n+j)
class Matrix
{
public:
  Matrix(int M = 0, int N = 0, int Z = 0);
  Matrix(const Matrix&amp; m) : n(0) { *this=m; }
  ~Matrix(); 

  double       *operator[] (int i)       { return a+i*n; }
  const double *operator[] (int i) const { return a+i*n; }
  double&amp; operator() (int i, int j)       { return a[index(i,j)]; }
  double  operator() (int i, int j) const { return a[index(i,j)]; }
  const Matrix&amp; operator= (const Matrix&amp; m);
  Matrix&amp; transpose(const Matrix&amp; A);

private:
  int m, n, z; //Dimension und Anzahlt der Elemente ungleich 0
  double *a;		
};
</code></pre>
<p>Datei Matrix.cpp</p>
<pre><code class="language-cpp">Matrix::Matrix(int M, int N, int Z): m(M), n(N), z(Z)
{ 
  if ((n != 0) &amp;&amp; m!= 0 )
    a=new double[m*n];

  for(int i = 0; i &lt; m; i++)
    for( int j = 0; j &lt; n; j++)
      a[index(i,j)] = 0;
}

Matrix::~Matrix()
{ 
  if (n || m) 
    delete[] a; 
} 

const Matrix&amp; Matrix::operator= (const Matrix&amp; A)
{
  if (m || n) delete[] a; 

  m = A.m; 
  n = A.n;
  a=new double[m*n]; 
  copy(A.begin(),A.end(),a);

  return *this;
}

Matrix&amp; Matrix::transpose()
{
  Matrix result(*this);

  for( int i = 0; i &lt; m; i++ )
    for( int j = 0; j &lt; n; j++ )
       result(i,j)=a[index(j,i)];

  return result;
}
</code></pre>
<p>Datei main:</p>
<pre><code class="language-cpp">#include &quot;matrih.h&quot;
int main(int argc, char *argv[])
{
  Matrix A(3,3);
  A[2][0] = -4;
  Matrix B(3,3);

  B = A.transpose();  
}
</code></pre>
<p>Das Programm wird problemlos kompiliert, doch während der Ausführung bekomme ich einen Semgentation Fault.<br />
Liegt es daran, dass mein transpose eine Referenz zurück gibt und die Matrix result dann nicht mehr existiert bei der Zuweisung = ?<br />
Was müsste ich denn ändern, damit das trotzdem klappt, wenn die Referenz zurück gegeben wird?<br />
Es sollte schon eine Referenz zurück gegeben werden, da die Matrizen mit denen ich arbeite sehr sehr gross sind, so im Bereich 10000x10000. Ah ja, die Matrix A sollte nicht verändert werden.<br />
Da ich leider noch keine allzu grosse Erfahrung im Programmieren habe, und das vor kurzem gelernte im Programm anwenden möchte, fehlen mir die Ideen, wie ich das umsetzen kann.<br />
Ich dachte schon an Zeiger und new Operator, doch wäre das die Lösung, und wie geht dann di eAnwendung von new in einer selbst erstellten Klasse? Weil die Deklaration in transpose<br />
result = new Matrix(3,3);<br />
leider nicht funktioniert (error: result undeclared)</p>
<p>Ich wäre für Hilfe sehr dankbar, da ich momentan nicht weiter weiss.</p>
<p>EDIT: Den Code soweit erweitert, dass er den Copykonstruktor enthält.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/143062/probleme-bei-return-by-reference-oder-was-anderem</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 03:07:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/143062.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Apr 2006 10:58:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 11:08:27 GMT]]></title><description><![CDATA[<p>Hi !!!</p>
<p>Ich habe folgenden Code:<br />
Datei Matrix.h</p>
<pre><code class="language-cpp">#define index(i,j) (i*n+j)
class Matrix
{
public:
  Matrix(int M = 0, int N = 0, int Z = 0);
  Matrix(const Matrix&amp; m) : n(0) { *this=m; }
  ~Matrix(); 

  double       *operator[] (int i)       { return a+i*n; }
  const double *operator[] (int i) const { return a+i*n; }
  double&amp; operator() (int i, int j)       { return a[index(i,j)]; }
  double  operator() (int i, int j) const { return a[index(i,j)]; }
  const Matrix&amp; operator= (const Matrix&amp; m);
  Matrix&amp; transpose(const Matrix&amp; A);

private:
  int m, n, z; //Dimension und Anzahlt der Elemente ungleich 0
  double *a;		
};
</code></pre>
<p>Datei Matrix.cpp</p>
<pre><code class="language-cpp">Matrix::Matrix(int M, int N, int Z): m(M), n(N), z(Z)
{ 
  if ((n != 0) &amp;&amp; m!= 0 )
    a=new double[m*n];

  for(int i = 0; i &lt; m; i++)
    for( int j = 0; j &lt; n; j++)
      a[index(i,j)] = 0;
}

Matrix::~Matrix()
{ 
  if (n || m) 
    delete[] a; 
} 

const Matrix&amp; Matrix::operator= (const Matrix&amp; A)
{
  if (m || n) delete[] a; 

  m = A.m; 
  n = A.n;
  a=new double[m*n]; 
  copy(A.begin(),A.end(),a);

  return *this;
}

Matrix&amp; Matrix::transpose()
{
  Matrix result(*this);

  for( int i = 0; i &lt; m; i++ )
    for( int j = 0; j &lt; n; j++ )
       result(i,j)=a[index(j,i)];

  return result;
}
</code></pre>
<p>Datei main:</p>
<pre><code class="language-cpp">#include &quot;matrih.h&quot;
int main(int argc, char *argv[])
{
  Matrix A(3,3);
  A[2][0] = -4;
  Matrix B(3,3);

  B = A.transpose();  
}
</code></pre>
<p>Das Programm wird problemlos kompiliert, doch während der Ausführung bekomme ich einen Semgentation Fault.<br />
Liegt es daran, dass mein transpose eine Referenz zurück gibt und die Matrix result dann nicht mehr existiert bei der Zuweisung = ?<br />
Was müsste ich denn ändern, damit das trotzdem klappt, wenn die Referenz zurück gegeben wird?<br />
Es sollte schon eine Referenz zurück gegeben werden, da die Matrizen mit denen ich arbeite sehr sehr gross sind, so im Bereich 10000x10000. Ah ja, die Matrix A sollte nicht verändert werden.<br />
Da ich leider noch keine allzu grosse Erfahrung im Programmieren habe, und das vor kurzem gelernte im Programm anwenden möchte, fehlen mir die Ideen, wie ich das umsetzen kann.<br />
Ich dachte schon an Zeiger und new Operator, doch wäre das die Lösung, und wie geht dann di eAnwendung von new in einer selbst erstellten Klasse? Weil die Deklaration in transpose<br />
result = new Matrix(3,3);<br />
leider nicht funktioniert (error: result undeclared)</p>
<p>Ich wäre für Hilfe sehr dankbar, da ich momentan nicht weiter weiss.</p>
<p>EDIT: Den Code soweit erweitert, dass er den Copykonstruktor enthält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030907</guid><dc:creator><![CDATA[bucada]]></dc:creator><pubDate>Wed, 05 Apr 2006 11:08:27 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 11:01:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Du gibst bei transpose eine Referenz auf ein lokales Objekt zurück. Das funktioniert natürlich nicht. Du mußt hier eine Kopie machen. Damit das geht brauchst du hier lediglich einen Copyconstructor für Matrix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030912</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 05 Apr 2006 11:01:58 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 11:10:15 GMT]]></title><description><![CDATA[<p>Ok, ich habe es soweit verändert.<br />
Doch es funktiert immer noch nicht.<br />
Nun gibt es schwirigkeiten mit den Pointern <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="😞"
    /><br />
*** glibc detected *** free(): invalid pointer: 0xb7ed2ff4 ***</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030921</guid><dc:creator><![CDATA[bucada]]></dc:creator><pubDate>Wed, 05 Apr 2006 11:10:15 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 11:14:22 GMT]]></title><description><![CDATA[<p>Zeig doch mal deine Änderungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030924</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 05 Apr 2006 11:14:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 11:22:27 GMT]]></title><description><![CDATA[<p>Der Zuweisungsoperator müsste auf jeden Fall noch gegen Selbstzuweisung geschützt werden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030930</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 05 Apr 2006 11:22:27 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 11:25:16 GMT]]></title><description><![CDATA[<p>oder anders designen (swap). Dafür brauchts dann natürlich einen (funktionierenden) CopyCtor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030938</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 05 Apr 2006 11:25:16 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 11:26:38 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Matrix(const Matrix&amp; m) : n(0) { *this=m; }
</code></pre>
<p>Hier erhält m und a einen zufälligen Wert. Damit wird der Zuweisungsoperator aufgerufen.</p>
<pre><code class="language-cpp">const Matrix&amp; Matrix::operator= (const Matrix&amp; A)
{
  if (m || n) delete[] a;
</code></pre>
<p>Wenn m einen zufälligen Wert ungleich 0 hat, wird delete[] auf diesen zufälligen Pointer a aufgerufen, was mit ziemlicher Sicherheit fehlschlägt. Wahrscheinlich hast Du die Abrfage &quot;m &amp;&amp; n&quot; gemeint.</p>
<p>Du solltest den Pointer a immer mit 0 initialisieren. Dann ist eine delete[] darauf erlaubt und Du kannst diese Abfragen &quot;if (m || n)&quot; weg lassen.</p>
<p>Tommi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030941</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 05 Apr 2006 11:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 12:08:04 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Der Zuweisungsoperator müsste auf jeden Fall noch gegen Selbstzuweisung geschützt werden</p>
</blockquote>
<p>Braunstein schrieb:</p>
<blockquote>
<p>oder anders designen (swap). Dafür brauchts dann natürlich einen (funktionierenden) CopyCtor.</p>
</blockquote>
<p>oder einfach nur alles in der richtigen reihenfolge tun:<br />
1. neuen speicher anfordern<br />
2. kopieren<br />
3. alten speicher löschen<br />
ein copy-zuweisungsoperator, der gegen selbstzuweisung geschützt werden muss (nichts gegen eine optimierung, wenn sie hilft), ist im grunde immer ein defekt. denn auch mit dem test gegen selbstzuweisung ist der operator sonst nicht exception-safe. ein copyconstruktor, der das objekt nur halbfertig konstruiert und dann den zuweisungsoperator aufruft ist auch unheilbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030977</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Apr 2006 12:08:04 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 12:13:49 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Zeig doch mal deine Änderungen.</p>
</blockquote>
<p>Ich habe den Copykonstruktor hinzugefügt und in der Funktion transpose:<br />
Matrix result( int M, int N, int Z );<br />
durch<br />
Matrix result(*this);<br />
ersetzt.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Der Zuweisungsoperator müsste auf jeden Fall noch gegen Selbstzuweisung geschützt werden</p>
</blockquote>
<p>Wie kann ich das machen?</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>oder anders designen (swap). Dafür brauchts dann natürlich einen (funktionierenden) CopyCtor.</p>
</blockquote>
<p>Hmm, ist mein Copy Konstruktor falsch? Wie müsste ich ihn richtig machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1030990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1030990</guid><dc:creator><![CDATA[bucada]]></dc:creator><pubDate>Wed, 05 Apr 2006 12:13:49 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 12:25:22 GMT]]></title><description><![CDATA[<p>Du solltest die transpose()-Methode auf jeden Fall so ändern, daß sie einen Wert zurückgibt.</p>
<p>Und zur Selbstzuweisung: Das Problem ist, daß du bei einer Zuweisung &quot;A=A;&quot; (die sich durchaus irgendwo verstecken könnte) den Matrix-Inhalt zerstörst, den du später kopieren willst. Als Lösung mußt du entweder abfragen, ob du dich selber kopieren willst oder erst kopieren und dann die alten Daten löschen (@camper: den Ansatz sehe ich auch als eine Variante des Zuweisungsschutzes ;)):</p>
<pre><code class="language-cpp">//Variante 1:
Matrix&amp; operator=(const Matrix&amp; other)
{
  if(this!=*other)
  {
    //kopieren
  }
  return *this;
}

//Variante 2:
Matrix&amp; operator=(const Matrix&amp; other)
{
  double* tmp = new double[other.m*other.n];
  m=other.m;
  n=other.n;
  for(int i=0;i&lt;m*n;++i) a[i]=other.a[i];
  delete[]a;a=tmp;
  return *this;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1031005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031005</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 05 Apr 2006 12:25:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 12:38:02 GMT]]></title><description><![CDATA[<p>bucada schrieb:</p>
<blockquote>
<p>Braunstein schrieb:</p>
<blockquote>
<p>Zeig doch mal deine Änderungen.</p>
</blockquote>
<p>Ich habe den Copykonstruktor hinzugefügt und in der Funktion transpose:<br />
Matrix result( int M, int N, int Z );<br />
durch<br />
Matrix result(*this);<br />
ersetzt.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>Der Zuweisungsoperator müsste auf jeden Fall noch gegen Selbstzuweisung geschützt werden</p>
</blockquote>
<p>Wie kann ich das machen?</p>
<p>Braunstein schrieb:</p>
<blockquote>
<p>oder anders designen (swap). Dafür brauchts dann natürlich einen (funktionierenden) CopyCtor.</p>
</blockquote>
<p>Hmm, ist mein Copy Konstruktor falsch? Wie müsste ich ihn richtig machen?</p>
</blockquote>
<p>hier noch mal die drei möglichkeiten:<br />
1. mit schutz gegen selbstzuweisung (nicht exception-sicher)</p>
<pre><code class="language-cpp">Matrix::Matrix(const Matrix&amp; rhs)
    : m( rhs.m ), n( rhs.n ), z( rhs.z ), a( new double[ rhs.m * rhs.n ] )
{
    std::copy( rhs.a, rhs.a + rhs.m * rhs.n, a );
}
Matrix&amp; Matrix::operator=(const Matrix&amp; rhs)
{
    if ( this != &amp;rhs )
    {
        delete [] a;
        m = rhs.m;
        n = rhs.n;
        z = rhs.z;
        a = new double[ rhs.m * rhs.n ];
        std::copy( rhs.a, rhs.a + rhs.m * rhs.n, a );
    }
    return *this;
}
</code></pre>
<p>oder mit richtiger reihenfolge (ohne test und exceptionsicher, copyctor bleibt wie oben):</p>
<pre><code class="language-cpp">Matrix&amp; Matric::operator=(const Matrix&amp; rhs)
{
    double* tmp = new double[ rhs.m * rhs.n ];
    std::copy( rhs.a, rhs.a + rhs.m * rhs.n, tmp );
    delete [] a;
    m = rhs.m;
    n = rhs.n;
    z = rhs.z;
    a = tmp;
    return *this;
}
</code></pre>
<p>oder mit copy&amp;swap (ebenfalls ohne test und exceptionsicher):</p>
<pre><code class="language-cpp">Matrix&amp; Matric::operator=(const Matrix&amp; rhs)
{
    Matrix( rhs ).swap( *this );
    return *this;
}
void Matrix::swap(Matrix&amp; lhs, Matrix&amp; rhs)
{
    std::swap( lhs.m, rhs.m );
    std::swap( lhs.n, rhs.n );
    std::swap( lhs.z, rhs.z );
    std::swap( lhs.a, rhs.a );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1031020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031020</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Apr 2006 12:38:02 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 12:43:13 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: den Ansatz sehe ich auch als eine Variante des Zuweisungsschutzes <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>
</blockquote>
<p>das problem ist eigentlich nicht selbstzuweisung sondern exceptionsicherheit. tatsache ist, dass ein (stark, weniger ist für copy-operationen kaum vertretbar) exceptionsicherer operator automatisch auch sicher für selbstzuweisung ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031028</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Apr 2006 12:43:13 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 13:20:27 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Du solltest die transpose()-Methode auf jeden Fall so ändern, daß sie einen Wert zurückgibt.</p>
<p>Und zur Selbstzuweisung: Das Problem ist, daß du bei einer Zuweisung &quot;A=A;&quot; (die sich durchaus irgendwo verstecken könnte) den Matrix-Inhalt zerstörst, den du später kopieren willst.</p>
</blockquote>
<p>Oh ja, daran habe ich gar nicht gedacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Das mit dem Wert zurückgeben ist aber ein Problem, weil wie gesagt die Matrizen mit denen ich rumrechne riesig sind.<br />
Nach der Änderung des Zuweisungsoperators habe ich folgendes Problem.<br />
Die Transponierung findet statt.<br />
Eine Ausgabe vor dem return gibt mir die richtige Matrix.<br />
Der operator= funktioniert auch.<br />
Es wird nur was falsches zurückgegeben.<br />
Die Matrix die rauskommt ist eine 134537360 x 134533128 Matrix, wo die ersten Elemente diejenigen sind, die rauskommen sollen.<br />
Sie wird nicht ganz ausgegeben, weil dann ein Segmentation Fault kommt <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/1031080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031080</guid><dc:creator><![CDATA[bucada]]></dc:creator><pubDate>Wed, 05 Apr 2006 13:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 13:47:57 GMT]]></title><description><![CDATA[<p>beim transponieren erhälst du aus einer m*n matrix eine n*m matrix. die kann auf keinen fall direkt durch kopieren entstehen, offensichtlich wenn n!=m ist. und auch für m==n müsstest du ein swap einsetzen der aus der originalmatrix kopieren, sonst geht dir die hälfte verloren. etwa so:</p>
<pre><code class="language-cpp">Matrix Matrix::transpose()
{
    Matrix result( n, m, z );
    for( int i = 0; i &lt; m; i++ )
        for( int j = 0; j &lt; n; j++ )
           result(j,i)=(*this)(i,j);
    return result;
}
</code></pre>
<p>falls das erstellen von kopien zu teuer ist, z.b. weil die matrizen riesig sind, könnte man über lazy evaluation nachdenken. etwa durch expression templates oder dessen runtime equivalent (dekorator).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031114</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031114</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Apr 2006 13:47:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 14:17:26 GMT]]></title><description><![CDATA[<p>Ok, es funktioniert mitlerweile. <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="🙂"
    /><br />
Ich habe es mit Hilfe von Zeigern gemacht.</p>
<pre><code class="language-cpp">Matrix* Matrix::transpose()
{
  Matrix* result;
  result = new Matrix((*this));

  for( int i = 0; i &lt; result-&gt;m; i++ )
    for( int j = 0; j &lt; result-&gt;n; j++ )
       (*result)(i,j) = a[index(j,i)];

  return result;
}
</code></pre>
<p>Ich musste dann zwar meine main Datei entsprechend anpassen, aber es funktioniert jetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031142</guid><dc:creator><![CDATA[bucada]]></dc:creator><pubDate>Wed, 05 Apr 2006 14:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 14:41:57 GMT]]></title><description><![CDATA[<p>bucada schrieb:</p>
<blockquote>
<p>Ok, es funktioniert mitlerweile. <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="🙂"
    /><br />
Ich habe es mit Hilfe von Zeigern gemacht.</p>
<pre><code class="language-cpp">Matrix* Matrix::transpose()
{
  Matrix* result;
  result = new Matrix((*this));
  
  for( int i = 0; i &lt; result-&gt;m; i++ )
    for( int j = 0; j &lt; result-&gt;n; j++ )
       (*result)(i,j) = a[index(j,i)];
  
  return result;
}
</code></pre>
<p>Ich musste dann zwar meine main Datei entsprechend anpassen, aber es funktioniert jetzt.</p>
</blockquote>
<p>das funktioniert nicht und die verwendung von zeigern bringt hier keinen vorteil:<br />
einfaches besipiel, transponiere eine 1*2 matrix:<br />
die zuweisungen sind:<br />
result(0,0)=m(0,0)<br />
result(0,1)=m(1,0)<br />
da allerdings n in beiden objekten gleich (nähmlich 2) ist, ergibt das<br />
result.a[0*2+0]=m.a[0*2+0]<br />
result.a[0*2+1]=m.a[1*2+0] und wir greifen auf ein element von m zu, das dieses gar nicht hat. nächster halt: segmentation fault.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1031157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031157</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 05 Apr 2006 14:41:57 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme bei Return by Reference oder was anderem on Wed, 05 Apr 2006 16:33:00 GMT]]></title><description><![CDATA[<p>Natürlich. Du hast recht.<br />
Es muss heissen:</p>
<pre><code class="language-cpp">result = new Explicit(n, m, 0);
</code></pre>
<p>bei der Initialisierung der Matrix result.<br />
Danke für den Hinweis. Bei mir funktionierte es, weil ich es mit quadratischen Matrizen ausprobiert habe.<br />
Ich sollte meine Beispiele demnächst besser wählen <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/1031271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1031271</guid><dc:creator><![CDATA[bucada]]></dc:creator><pubDate>Wed, 05 Apr 2006 16:33:00 GMT</pubDate></item></channel></rss>