<?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[gelöst: Problem bei doppelter Zeigerarithmetik]]></title><description><![CDATA[<p>Hi Leutz</p>
<p>mir ist schon klar, dass dies ein unbeliebtes Thema ist und ich möchte auch gleich vorweg nehmen, dass ich das folgende Programm keinesfalls sinnvoll finde, aber leider muss ich das implementieren (Aufgabe an der UNI).</p>
<p>Zum Problem: in der matrix.cpp (unten) habe ich die Zeilen 47 und 58 auskommentiert. Die machen mir am meisten Probleme (beide male dasselbe). Mein Verdacht: Der Ausdruck ist an der Stelle nicht vom Typ integer.</p>
<p>und wenn wir grad dabei sind: Kann mir jemand sagen ob es richtig von mir war, die Zeile 38 in matrix.cpp aus zu kommentieren? Wenn ich sie drin lasse meldet der Compiler: &quot;doppeltes free&quot;</p>
<p>PS: die Idee hinter der Aufgabe (zum besseren Verständnis)</p>
<blockquote>
<p>&quot;In dieser Aufgabe soll eine Klasse zur Addition und Multiplikation von dynamischen<br />
Matrizen entwickelt werden, wobei der Speicherplatz zur Laufzeit dynamisch reserviert<br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox26563" /><label for="checkbox26563">[ ] wie gewohnt</label></div><br />
auf die Elemente der Matrix zuzugreifen (Beispiel: m[i][j] ist das Element in Zeile i und<br />
Spalte j). Die entsprechende Klasse wird deshalb ein dynamisches Element enthalten, das die<br />
Matrix als eindimensionaler Vektor mit Elementen, die selbst eindimensionale Zeilenvektoren<br />
sind, adressiert.<br />
Im folgenden ist eine Header-Datei matrix.h gegeben, in der die Klasse Matrix mit Hilfe<br />
einer Klasse Zeile deklariert ist. Die Klasse Zeile ist ein eindimensionaler Vektor von<br />
int-Werten; weiterhin hat die Klasse einen überladenen Indexoperator [].Die Klasse<br />
Matrix besitzt ein dynamisches Element mat, das einen Vektor von Zeigern auf Zeile-<br />
Objekte adressieren soll. mat ist also ein Zeiger auf Zeiger.&quot;</p>
</blockquote>
<p><strong>matrix.hpp</strong></p>
<pre><code class="language-cpp">#ifndef _MATRIX_H_
#define _MATRIX_H_
#include &lt;iostream&gt;
#include &lt;cassert&gt;
using namespace std;
class Zeile
{
private:
    int *z;
    int size;
public:
// zu implementieren: Konstruktor und Destruktor
    Zeile( int s);
    ~Zeile();
// Indexoperator [] ist (in zwei Versionen) bereits implementiert für die Klasse Zeile
    int&amp; operator[](int i)
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; size);
        return z[i];
    }
    const int&amp; operator[](int i) const
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; size);
        return z[i];
    }
};
class Matrix
{
private:
    Zeile **mat; // Zeiger auf &quot;Zeilen&quot;-Vektor
    int nrows, ncols; // Zeilen- und Spaltenzahl
    void init(int z, int s);
public:
//zu implementieren: Zwei Konstruktoren, ein Kopierkonstruktor und ein Destruktor
    Matrix( int _nrows , int _ncols);
    Matrix( int z, int s, int wert);
    Matrix( const Matrix&amp; m);
    ~Matrix();
    int getRows()const
    {
        return nrows;
    }
    int getCols()const
    {
        return ncols;
    }
// zu implementieren: Indexoperator [] (in zwei Versionen) für die Klasse Matrix
    Zeile&amp; operator[](int i)
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; nrows);
        return **(mat+i);
    }
    const Zeile&amp; operator[](int i) const
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; nrows);
        return **(mat+i);
    }
// zu implementieren: Transponierte der Matrix
    Matrix transpose();
// zu implementieren: Ausgabe, Addition und Multiplikation
    void print();
    friend Matrix operator+(const Matrix&amp; ma, const Matrix&amp; mb);
    friend Matrix operator*(const Matrix&amp; ma, const Matrix&amp; mb);
};
#endif
</code></pre>
<p><strong>matrix.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;matrix.hpp&quot;

Zeile::Zeile(int s)
{
    z=new int[s];//entgegen der Aufgabenstellung kann man hier kein double-Feld reservieren wenn z vom Typ int ist
    size=s;
}
Zeile::~Zeile()
{
    delete[] z;
}
void Matrix::init(int z, int s)
{
    nrows=z;
    ncols=s;
    mat=new Zeile* [z];
    for(int i=0; i&lt;z; i++)
        mat[i]=new Zeile(s);
}
Matrix::Matrix(int _nrows, int _ncols)
{
    this-&gt;init(_nrows,_ncols);
}
Matrix::Matrix(int z, int s, int wert)
{
    this-&gt;init(z,s);
    for (int i=0; i&lt;z; i++)
        for(int j=0; j&lt;s; j++) mat[i][j]=wert;
}
Matrix::Matrix(const Matrix&amp; m)
{
    this-&gt;init(m.nrows,m.ncols);
    for(int i=0; i&lt;m.nrows; i++)
        for(int j=0; j&lt;m.ncols; j++) this-&gt;mat[i][j]=m.mat[i][j];
}
Matrix::~Matrix()
{
    //for(int i=0; i&lt;nrows; i++) delete mat[i];
    delete[] mat;
}
Matrix operator+(const Matrix&amp; ma, const Matrix&amp; mb)
{
    assert(ma.nrows==mb.nrows &amp;&amp; ma.ncols==mb.ncols);
    Matrix result(ma.nrows,ma.nrows);
    for(int i=0; i&lt;ma.nrows; i++)
        for(int j=0; j&lt;ma.nrows; j++)
/*    result.mat[i][j]=ma.mat[i][j]+mb.mat[i][j]*/;
}
Matrix operator*(const Matrix&amp; ma, const Matrix&amp; mb)
{
    assert(ma.nrows==mb.ncols &amp;&amp; ma.ncols==mb.nrows);
    Matrix result(ma.nrows,ma.nrows,0);
    for(int x=0; x&lt;ma.nrows; x++)
        for(int i=0; i&lt;ma.nrows; i++)
        {
            int zwischenergebnis=0;
            for(int j=0; j&lt;ma.ncols; j++)
//                zwischenergebnis+=ma.mat[x][j]*mb.mat[j][i];
                result.mat[x][i]=zwischenergebnis;
        }

}
Matrix Matrix::transpose()
{
    Matrix trans_matrix(this-&gt;ncols,this-&gt;nrows);
    for(int i=0; i&lt;this-&gt;nrows; i++)
        for(int j=0; j&lt;this-&gt;ncols; j++)
            trans_matrix.mat[j][i]=this-&gt;mat[i][j];
    return trans_matrix;
}
void Matrix::print()
{
    for(int i=0; i&lt;nrows; i++)
    {
        for(int j=0; j&lt;ncols; j++)
//            cout &lt;&lt; mat[0][0] &lt;&lt; &quot;\t&quot;;
            cout &lt;&lt; endl;
    }
}
</code></pre>
<p><strong>main.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;matrix.cpp&quot;

using namespace std;

int main()
{
    cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; endl;
    Matrix testmatrix(2,2,5);
    testmatrix.print();
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/288066/gelöst-problem-bei-doppelter-zeigerarithmetik</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 03:21:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288066.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Jun 2011 16:46:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 19:38:23 GMT]]></title><description><![CDATA[<p>Hi Leutz</p>
<p>mir ist schon klar, dass dies ein unbeliebtes Thema ist und ich möchte auch gleich vorweg nehmen, dass ich das folgende Programm keinesfalls sinnvoll finde, aber leider muss ich das implementieren (Aufgabe an der UNI).</p>
<p>Zum Problem: in der matrix.cpp (unten) habe ich die Zeilen 47 und 58 auskommentiert. Die machen mir am meisten Probleme (beide male dasselbe). Mein Verdacht: Der Ausdruck ist an der Stelle nicht vom Typ integer.</p>
<p>und wenn wir grad dabei sind: Kann mir jemand sagen ob es richtig von mir war, die Zeile 38 in matrix.cpp aus zu kommentieren? Wenn ich sie drin lasse meldet der Compiler: &quot;doppeltes free&quot;</p>
<p>PS: die Idee hinter der Aufgabe (zum besseren Verständnis)</p>
<blockquote>
<p>&quot;In dieser Aufgabe soll eine Klasse zur Addition und Multiplikation von dynamischen<br />
Matrizen entwickelt werden, wobei der Speicherplatz zur Laufzeit dynamisch reserviert<br />
<div class="plugin-markdown"><input type="checkbox" id="checkbox26563" /><label for="checkbox26563">[ ] wie gewohnt</label></div><br />
auf die Elemente der Matrix zuzugreifen (Beispiel: m[i][j] ist das Element in Zeile i und<br />
Spalte j). Die entsprechende Klasse wird deshalb ein dynamisches Element enthalten, das die<br />
Matrix als eindimensionaler Vektor mit Elementen, die selbst eindimensionale Zeilenvektoren<br />
sind, adressiert.<br />
Im folgenden ist eine Header-Datei matrix.h gegeben, in der die Klasse Matrix mit Hilfe<br />
einer Klasse Zeile deklariert ist. Die Klasse Zeile ist ein eindimensionaler Vektor von<br />
int-Werten; weiterhin hat die Klasse einen überladenen Indexoperator [].Die Klasse<br />
Matrix besitzt ein dynamisches Element mat, das einen Vektor von Zeigern auf Zeile-<br />
Objekte adressieren soll. mat ist also ein Zeiger auf Zeiger.&quot;</p>
</blockquote>
<p><strong>matrix.hpp</strong></p>
<pre><code class="language-cpp">#ifndef _MATRIX_H_
#define _MATRIX_H_
#include &lt;iostream&gt;
#include &lt;cassert&gt;
using namespace std;
class Zeile
{
private:
    int *z;
    int size;
public:
// zu implementieren: Konstruktor und Destruktor
    Zeile( int s);
    ~Zeile();
// Indexoperator [] ist (in zwei Versionen) bereits implementiert für die Klasse Zeile
    int&amp; operator[](int i)
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; size);
        return z[i];
    }
    const int&amp; operator[](int i) const
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; size);
        return z[i];
    }
};
class Matrix
{
private:
    Zeile **mat; // Zeiger auf &quot;Zeilen&quot;-Vektor
    int nrows, ncols; // Zeilen- und Spaltenzahl
    void init(int z, int s);
public:
//zu implementieren: Zwei Konstruktoren, ein Kopierkonstruktor und ein Destruktor
    Matrix( int _nrows , int _ncols);
    Matrix( int z, int s, int wert);
    Matrix( const Matrix&amp; m);
    ~Matrix();
    int getRows()const
    {
        return nrows;
    }
    int getCols()const
    {
        return ncols;
    }
// zu implementieren: Indexoperator [] (in zwei Versionen) für die Klasse Matrix
    Zeile&amp; operator[](int i)
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; nrows);
        return **(mat+i);
    }
    const Zeile&amp; operator[](int i) const
    {
        assert(i &gt;= 0 &amp;&amp; i &lt; nrows);
        return **(mat+i);
    }
// zu implementieren: Transponierte der Matrix
    Matrix transpose();
// zu implementieren: Ausgabe, Addition und Multiplikation
    void print();
    friend Matrix operator+(const Matrix&amp; ma, const Matrix&amp; mb);
    friend Matrix operator*(const Matrix&amp; ma, const Matrix&amp; mb);
};
#endif
</code></pre>
<p><strong>matrix.cpp</strong></p>
<pre><code class="language-cpp">#include &quot;matrix.hpp&quot;

Zeile::Zeile(int s)
{
    z=new int[s];//entgegen der Aufgabenstellung kann man hier kein double-Feld reservieren wenn z vom Typ int ist
    size=s;
}
Zeile::~Zeile()
{
    delete[] z;
}
void Matrix::init(int z, int s)
{
    nrows=z;
    ncols=s;
    mat=new Zeile* [z];
    for(int i=0; i&lt;z; i++)
        mat[i]=new Zeile(s);
}
Matrix::Matrix(int _nrows, int _ncols)
{
    this-&gt;init(_nrows,_ncols);
}
Matrix::Matrix(int z, int s, int wert)
{
    this-&gt;init(z,s);
    for (int i=0; i&lt;z; i++)
        for(int j=0; j&lt;s; j++) mat[i][j]=wert;
}
Matrix::Matrix(const Matrix&amp; m)
{
    this-&gt;init(m.nrows,m.ncols);
    for(int i=0; i&lt;m.nrows; i++)
        for(int j=0; j&lt;m.ncols; j++) this-&gt;mat[i][j]=m.mat[i][j];
}
Matrix::~Matrix()
{
    //for(int i=0; i&lt;nrows; i++) delete mat[i];
    delete[] mat;
}
Matrix operator+(const Matrix&amp; ma, const Matrix&amp; mb)
{
    assert(ma.nrows==mb.nrows &amp;&amp; ma.ncols==mb.ncols);
    Matrix result(ma.nrows,ma.nrows);
    for(int i=0; i&lt;ma.nrows; i++)
        for(int j=0; j&lt;ma.nrows; j++)
/*    result.mat[i][j]=ma.mat[i][j]+mb.mat[i][j]*/;
}
Matrix operator*(const Matrix&amp; ma, const Matrix&amp; mb)
{
    assert(ma.nrows==mb.ncols &amp;&amp; ma.ncols==mb.nrows);
    Matrix result(ma.nrows,ma.nrows,0);
    for(int x=0; x&lt;ma.nrows; x++)
        for(int i=0; i&lt;ma.nrows; i++)
        {
            int zwischenergebnis=0;
            for(int j=0; j&lt;ma.ncols; j++)
//                zwischenergebnis+=ma.mat[x][j]*mb.mat[j][i];
                result.mat[x][i]=zwischenergebnis;
        }

}
Matrix Matrix::transpose()
{
    Matrix trans_matrix(this-&gt;ncols,this-&gt;nrows);
    for(int i=0; i&lt;this-&gt;nrows; i++)
        for(int j=0; j&lt;this-&gt;ncols; j++)
            trans_matrix.mat[j][i]=this-&gt;mat[i][j];
    return trans_matrix;
}
void Matrix::print()
{
    for(int i=0; i&lt;nrows; i++)
    {
        for(int j=0; j&lt;ncols; j++)
//            cout &lt;&lt; mat[0][0] &lt;&lt; &quot;\t&quot;;
            cout &lt;&lt; endl;
    }
}
</code></pre>
<p><strong>main.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;matrix.cpp&quot;

using namespace std;

int main()
{
    cout &lt;&lt; &quot;Hello world!&quot; &lt;&lt; endl;
    Matrix testmatrix(2,2,5);
    testmatrix.print();
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2075876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075876</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Thu, 09 Jun 2011 19:38:23 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 16:55:03 GMT]]></title><description><![CDATA[<p>Der Fehler liegt vermutlich in Zeile 30 der matrix.hpp - du hast dort einen Zeiger auf (ein Array von) Zeiger auf Spalten definiert, also mußt du den später auch zweifach dereferenzieren, um auf die einzelnen Zeilen zugreifen zu können - also <code>(*m.mat[i])[j]</code> .</p>
<p>PS: Wer fängt denn C++ mit sowas an? Ein vernünftiger C++ Entwickler würde sowas mit STL-Containern oder std::valarray zusammenbauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075881</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075881</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Jun 2011 16:55:03 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 16:57:17 GMT]]></title><description><![CDATA[<p>Kiigass schrieb:</p>
<blockquote>
<p>Zum Problem: in der matrix.cpp (unten) habe ich die Zeilen 47 und 58 auskommentiert. Die machen mir am meisten Probleme (beide male dasselbe). Mein Verdacht: Der Ausdruck ist an der Stelle nicht vom Typ integer.</p>
</blockquote>
<p>Und welche Probleme? Die Zeilen sind nur Kommentar.</p>
<blockquote>
<p>und wenn wir grad dabei sind: Kann mir jemand sagen ob es richtig von mir war, die Zeile 38 in matrix.cpp aus zu kommentieren? Wenn ich sie drin lasse meldet der Compiler: &quot;doppeltes free&quot;</p>
</blockquote>
<p>Ja, das ist richtig, das auszukommentieren. Dein delete auf das mat ruft den Zeilendestruktor auf, welcher dann wieder ein delete für die einzelnen Werte aufruft.</p>
<p>Und das doppelte free sagt dir nicht dein Compiler, sondern deine Laufzeitumgebung. Das ist ein ganz großer Unterschied.</p>
<p>CStoll schrieb:</p>
<blockquote>
<p>PS: Wer fängt denn C++ mit sowas an? Ein vernünftiger C++ Entwickler würde sowas mit STL-Containern oder std::valarray zusammenbauen.</p>
</blockquote>
<p>Ich finde die Aufgabe so in Ordnung, wenn es darum geht, c++ zu lernen. Es geht hier ja anscheinend nicht darum, Zeigergefrickel zu lernen, sondern es werden lauter schöne Prinzipien benutzt die später wichtig sind. Da darf man auch mal einen Teil der Standardbibliothek für Nachprogrammieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075882</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Jun 2011 16:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:28:28 GMT]]></title><description><![CDATA[<p>So ein Quatsch! Wirf die Klasse &quot; <code>Zeile</code> &quot; weg und gestalte <code>Matrix</code> um:</p>
<ul>
<li>Nutze intern einen <code>std::vector</code> .</li>
<li>Nutze für Indexangaben bitte <code>std::size_t</code> .</li>
<li>Spare an <code>assert</code> , nutze Exceptions.</li>
<li>In der Hauptdatei solltest du den Header inkludieren.</li>
<li>Mach keine Funktion <code>print</code> dafür einen Left-Shift-Operator mit <code>ostream</code> .</li>
<li><strong>Ich würde</strong> den Rückgabewert von Operatoren die keine Referenz auf sich selbst zurückgeben, <code>const</code> machen.</li>
<li><code>Matrix::transpose</code> sollte doch sich selbst transponieren und nicht eine Kopie zurrückgeben.</li>
<li>Mache alle Funktionen, welche <code>*this</code> nicht verändern <code>const</code> .</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2075883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075883</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:28:28 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:01:55 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>[*]Spare an <code>assert</code> , nutze Exceptions.</p>
</blockquote>
<p><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="😮"
    /> Hier sind asserts ja wohl mehr als angebracht.</p>
<blockquote>
<p>[*] <code>Matrix::transpose</code> sollte doch sich selbst transponieren und nicht eine Kopie zurrückgeben.</p>
</blockquote>
<p>Das klingt eher unpraktisch für eine Matrixklasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075885</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:02:54 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das klingt eher unpraktisch für eine Matrixklasse.</p>
</blockquote>
<p>Wieso sollte die Funktion nicht das Objekt selbst verändern? Wenn man eine Kopie will soll er die Funktion frei implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075887</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:09:34 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p><strong>Ich würde</strong> den Rückgabewert von Operatoren die keine Referenz auf sich selbst zurückgeben, <code>const</code> machen.</p>
</blockquote>
<p>Ich nicht. Hat nämlich keine wirklichen Vorteile <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>EOutOfResources schrieb:</p>
<blockquote>
<p>Wenn man eine Kopie will soll er die Funktion frei implementieren.</p>
</blockquote>
<p>Kopie/In-Place und Member/freie Funktion müssen nicht voneinander abhängen.</p>
<p>Fakt ist, dass <code>transpose()</code> in beiden Fällen über das öffentliche Interface der Klasse implementiert werden kann, was eher für freie Funktion spricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075889</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075889</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:09:34 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:14:11 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Das klingt eher unpraktisch für eine Matrixklasse.</p>
</blockquote>
<p>Wieso sollte die Funktion nicht das Objekt selbst verändern? Wenn man eine Kopie will soll er die Funktion frei implementieren.</p>
</blockquote>
<p>Man muss nicht immer nur die Technik angucken, sondern auch die Semantik. Bei einer Matrix will man meistens Zugriff auf beides gleichzeitig haben, die Transponierte und die Nicht-Transponierte. Da ist es sehr unpraktisch, wenn diese Aktion die Matrix selbst jedes mal ändert. Und eine Kopie möchte man in der Regel auch nicht, denn die Transposition ist trivial, die Kopie in der Regel teuer. Insofern ist die jetzige Lösung auch nicht gerade günstig.<br />
Ich würde ein Proxyobjekt zurückgeben, welches erst einmal nur die Zugriffe umlenkt. Und erst wenn man mit diesem Objekt eine neue Matrix erstellt, wird kopiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075890</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:14:11 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:15:45 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>[*]Nutzen für Indexangaben bitte <code>std::size_t</code> .</p>
</blockquote>
<p>Wieso? Wieso sollte man kein int verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075891</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:15:45 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:18:56 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ich würde ein Proxyobjekt zurückgeben, welches erst einmal nur die Zugriffe umlenkt. Und erst wenn man mit diesem Objekt eine neue Matrix erstellt, wird kopiert.</p>
</blockquote>
<p>Copy-On-Write ist problematisch, solange man <code>operator[]</code> mit Schreib- und Lesezugriff hat. Dann werden nämlich auch Nicht-Änderungen als Änderungen angesehen. Eine Möglichkeit wäre separate Getter und Setter, was dann die Syntax aber weniger schön macht.</p>
<p>Andererseits kann man auch</p>
<pre><code class="language-cpp">void   transpose(Matrix&amp; matrix);
Matrix transpose_copy(const Matrix&amp; matrix);
</code></pre>
<p>anbieten, wobei die zweite Funktion auf die erste zugreift. Diese kann dann immer noch Indizes tauschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075892</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:18:56 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:24:16 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>[*]Nutzen für Indexangaben bitte <code>std::size_t</code> .</p>
</blockquote>
<p>Wieso? Wieso sollte man kein int verwenden?</p>
</blockquote>
<p>Prinzipiell ist das &quot;richtiger&quot;. Die Größenangaben bei den Containern sind alle in size_t, welcher in der Regel einen größeren Wertebereich als int haben wird, man reizt seine Container als nicht aus. Oder eventuell ist es auch umgekehrt. Außerdem bekommt man nicht dauernd Warnungen von wegen Vergleich von unsigned und signed. Und es ist portabel, falls size_t mal etwas exotisches sein sollte.<br />
Der Nachteil ist, dass man Programmierfehler schwieriger diagnostizieren kann, weil ein negativer Index die gleiche Auswirkung hat wie ein zu großer Index.</p>
<p>Das alles sind aber ziemliche Feinheiten ohne große Relevanz. Daher kann man aber auch gleich den dafür vorgesehenen Typ nehmen, dann ist wenigstens sichergestellt, dass man keine bösen Überraschungen auf exotischen Systemen erlebt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075897</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:24:16 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:34:20 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Der Fehler liegt vermutlich in Zeile 30 der matrix.hpp - du hast dort einen Zeiger auf (ein Array von) Zeiger auf Spalten definiert, also mußt du den später auch zweifach dereferenzieren, um auf die einzelnen Zeilen zugreifen zu können - also <code>(*m.mat[i])[j]</code> .</p>
<p>PS: Wer fängt denn C++ mit sowas an? Ein vernünftiger C++ Entwickler würde sowas mit STL-Containern oder std::valarray zusammenbauen.</p>
</blockquote>
<p>danke für die Antwort. Ich bin noch nicht dazu gekommen die Lösung von dir auszuprobieren, aber leider wäre sie laut Aufgabenstellung auch nicht zulässig. Ganz nebenbei stimme ich dir was die Sinnhaftigkeit angeht natürlich zu.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19375">@SeppJ</a>: Mein Problem lässt sich am leichtesten verdeutlichen, wenn man die Zeilen reaktiviert und versucht es zu kompilieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075905</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:34:20 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:41:29 GMT]]></title><description><![CDATA[<p>Kiigass schrieb:</p>
<blockquote>
<p>danke für die Antwort. Ich bin noch nicht dazu gekommen die Lösung von dir auszuprobieren, aber leider wäre sie laut Aufgabenstellung auch nicht zulässig.</p>
</blockquote>
<p>Was wäre nicht zulässig? vernünftige Container verwenden? Oder die zusätzliche Deferenzierung?</p>
<p>Um letztere wirst du nicht herumkommen, wenn du den jetzigen Aufbau beibehalten willst/mußt:</p>
<p>m.mat ist ein Zeile** - ein Zeiger auf ein Zeile*-Array<br />
m.mat[i] ist ein Element dieses Arrays, also ein Zeiger auf ein Zeile<br />
*m.mat[i] ist das Objekt hinter diesem Zeiger<br />
(*m.mat[i])[j] ruft die op[]-Methode der Zeile auf</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075912</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:48:24 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Kiigass schrieb:</p>
<blockquote>
<p>danke für die Antwort. Ich bin noch nicht dazu gekommen die Lösung von dir auszuprobieren, aber leider wäre sie laut Aufgabenstellung auch nicht zulässig.</p>
</blockquote>
<p>Was wäre nicht zulässig? vernünftige Container verwenden? Oder die zusätzliche Deferenzierung?</p>
<p>Um letztere wirst du nicht herumkommen, wenn du den jetzigen Aufbau beibehalten willst/mußt:</p>
<p>m.mat ist ein Zeile** - ein Zeiger auf ein Zeile*-Array<br />
m.mat[i] ist ein Element dieses Arrays, also ein Zeiger auf ein Zeile<br />
*m.mat[i] ist das Objekt hinter diesem Zeiger<br />
(*m.mat[i])[j] ruft die op[]-Methode der Zeile auf</p>
</blockquote>
<p>Ja die zusätzlich Dereferenzierung bzw. genauer: Die Syntaxänderung zum Aufruf der Daten ist unzulässig. Laut Aufgabenstellung muss die Syntax sein: &quot;m[i][j]&quot;.<br />
Allerdings gibt es dafür ja auch den überladenen operator[] der eigentlich das Objekt zurück geben sollte (also bei der Klasse Matrix soll er ein Objekt vom Typ Zeile zurück geben und bei der Klasse Zeile einen Integer). Vllt steckt auch da das Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075915</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 17:55:04 GMT]]></title><description><![CDATA[<p>Kiigass schrieb:</p>
<blockquote>
<p>Ja die zusätzlich Dereferenzierung bzw. genauer: Die Syntaxänderung zum Aufruf der Daten ist unzulässig. Laut Aufgabenstellung muss die Syntax sein: &quot;m[i][j]&quot;.<br />
Allerdings gibt es dafür ja auch den überladenen operator[] der eigentlich das Objekt zurück geben sollte (also bei der Klasse Matrix soll er ein Objekt vom Typ Zeile zurück geben und bei der Klasse Zeile einen Integer). Vllt steckt auch da das Problem.</p>
</blockquote>
<p>Warum verwendest du den dann nicht in deinen Funktionen? Das Teil sollte nicht die Aufrufe von außen ersetzen, sondern deine missglückten Aufrufe ma.mat[i][j] in den Operatoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075919</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Jun 2011 17:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 18:02:06 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Ich würde ein Proxyobjekt zurückgeben, welches erst einmal nur die Zugriffe umlenkt. Und erst wenn man mit diesem Objekt eine neue Matrix erstellt, wird kopiert.</p>
</blockquote>
<p>Copy-On-Write ist problematisch, solange man <code>operator[]</code> mit Schreib- und Lesezugriff hat. Dann werden nämlich auch Nicht-Änderungen als Änderungen angesehen. Eine Möglichkeit wäre separate Getter und Setter, was dann die Syntax aber weniger schön macht.</p>
</blockquote>
<p>Ich hatte an so etwas gedacht (entschuldigt den schnellen Hack, ich wollte gerade keine ganze Matrixklasse schreiben, sondern nur zeigen, wie ich transponieren würde):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;cassert&gt;

template &lt;class T&gt; class Matrix;

template &lt;class T&gt; class TransposedMatrix
{
private:
  const Matrix&lt;T&gt; &amp; matrix;
  TransposedMatrix(Matrix&lt;T&gt; const &amp;matrix);
public:
  const T&amp; operator()(size_t x, size_t y) const;
  friend class Matrix&lt;T&gt;;
};

template &lt;class T&gt; class Matrix
{
private:
  typedef typename std::vector&lt;T&gt;::size_type size_t;
  std::vector&lt;T&gt; data;
  size_t nrows, ncols;
public:
  Matrix( size_t nrows , size_t ncols): data(nrows*ncols), nrows(nrows), ncols(ncols)  {}
  Matrix( TransposedMatrix&lt;T&gt; const &amp; other): nrows(other.matrix.ncols), ncols(other.matrix.nrows) 
  {
    data.reserve(ncols*nrows);
    for (size_t i = 0; i &lt; nrows; ++i)
      for(size_t j = 0; j &lt; ncols; ++j)
        data.push_back(other(i,j));
  }

  T&amp; operator()(size_t x, size_t y)
  {
    assert(x &lt; nrows and y &lt; ncols);
    return data[x*ncols + y];
  }
  const T&amp; operator()(size_t x, size_t y) const
  {
    assert(x &lt; nrows and y &lt; ncols);
    return data[x*ncols + y];
  }

  const TransposedMatrix&lt;T&gt; transpose() const
  {
    return *this;
  }
  friend class TransposedMatrix&lt;T&gt;;
};

template &lt;class T&gt; TransposedMatrix&lt;T&gt;::TransposedMatrix(Matrix&lt;T&gt; const &amp;matrix): matrix(matrix) {}

template &lt;class T&gt; const T&amp; TransposedMatrix&lt;T&gt;::operator()(size_t x, size_t y) const
{
  assert(y &lt; matrix.nrows and x &lt; matrix.ncols);
  return matrix.data[y*matrix.ncols + x];
}

using namespace std;

int main()
{
  Matrix&lt;int&gt; foo(5,3);
  for(int i = 0; i &lt; 5; ++i)
    for (int j = 0; j &lt; 3; ++ j)
      foo(i,j) = i*10 + j;

  for(int i = 0; i &lt; 5; ++i)
    {
      for (int j = 0; j &lt; 3; ++ j)
        cout &lt;&lt; foo(i,j) &lt;&lt; &quot;\t&quot;;
      cout &lt;&lt; endl;
    }
  cout &lt;&lt; endl;

  for(int i = 0; i &lt; 3; ++i)
    {
      for (int j = 0; j &lt; 5; ++ j)
        cout &lt;&lt; foo.transpose()(i,j) &lt;&lt; &quot;\t&quot;;
      cout &lt;&lt; endl;
    }
  cout &lt;&lt; endl;

  Matrix&lt;int&gt; transposed = foo.transpose();
  for(int i = 0; i &lt; 3; ++i)
    {
      for (int j = 0; j &lt; 5; ++ j)
        cout &lt;&lt; transposed(i,j) &lt;&lt; &quot;\t&quot;;
      cout &lt;&lt; endl;
    }
}
</code></pre>
<p>P.S.: So im Nachhinein gesehen ist das unnötig kompliziert, einfache Überladung von transpose hätte es auch getan. Naja, hat immerhin Spaß gemacht das zu programmieren. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075923</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Jun 2011 18:02:06 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 18:29:02 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Kiigass schrieb:</p>
<blockquote>
<p>Ja die zusätzlich Dereferenzierung bzw. genauer: Die Syntaxänderung zum Aufruf der Daten ist unzulässig. Laut Aufgabenstellung muss die Syntax sein: &quot;m[i][j]&quot;.<br />
Allerdings gibt es dafür ja auch den überladenen operator[] der eigentlich das Objekt zurück geben sollte (also bei der Klasse Matrix soll er ein Objekt vom Typ Zeile zurück geben und bei der Klasse Zeile einen Integer). Vllt steckt auch da das Problem.</p>
</blockquote>
<p>Warum verwendest du den dann nicht in deinen Funktionen? Das Teil sollte nicht die Aufrufe von außen ersetzen, sondern deine missglückten Aufrufe ma.mat[i][j] in den Operatoren.</p>
</blockquote>
<p>hmm entweder verstehst du mich nicht oder ich dich nicht, reden wir an einander vorbei?<br />
Das Problem tritt ja beim Überladen von operator+ bzw operator* auf. Ich hatte oben aber auf den operator[] angespielt. Also sicherlich könnte ich in meiner Funktion das so schreiben wie du es mir vorgescchlagen hast, aber dann würde das Problem außerhalb doch immer noch bestehen. Oder bin ich grad zu blöd?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075940</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Thu, 09 Jun 2011 18:29:02 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 18:36:13 GMT]]></title><description><![CDATA[<p>Nochmal langsam von vorne: Dein operator[] ist in Ordnung und macht das, was er soll - das heißt, es ist kein Problem für die Anwender der Klasse, per <code>m[i][j]</code> auf die Matrix-Elemente zuzugreifen. Aber in den arithmetischen Operatoren verwendest du nicht diesen Operator, sondern greifst direkt auf deine internen Daten zu - dort mußt du die Zeiger dann oft genug dereferenzieren, um an die richtige Stelle zu kommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075944</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Jun 2011 18:36:13 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 19:09:56 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Nochmal langsam von vorne: Dein operator[] ist in Ordnung und macht das, was er soll - das heißt, es ist kein Problem für die Anwender der Klasse, per <code>m[i][j]</code> auf die Matrix-Elemente zuzugreifen. Aber in den arithmetischen Operatoren verwendest du nicht diesen Operator, sondern greifst direkt auf deine internen Daten zu - dort mußt du die Zeiger dann oft genug dereferenzieren, um an die richtige Stelle zu kommen.</p>
</blockquote>
<p>okay ich glaube ich habe das verstanden, aber dann stellt sich mir die Frage warum er in den &quot;arithmetischen Operatoren&quot; nicht den überladenen operator[] benutzt. Ist das immer so? und wenn ja warum?</p>
<p>ps: danke für deine Geduld! <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="🙂"
    /></p>
<p>pps: in der print()-Funktion kommt es auch zu einem Fehler, aber wenn der Zugriff wie du sagst, über <code>m[i][j]</code> möglich ist, müsste dann dort nicht einfach ein Integer stehen? Also warum kommt es zu einem Fehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075979</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075979</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Thu, 09 Jun 2011 19:09:56 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 19:29:15 GMT]]></title><description><![CDATA[<p>Kiigass schrieb:</p>
<blockquote>
<p>CStoll schrieb:</p>
<blockquote>
<p>Nochmal langsam von vorne: Dein operator[] ist in Ordnung und macht das, was er soll - das heißt, es ist kein Problem für die Anwender der Klasse, per <code>m[i][j]</code> auf die Matrix-Elemente zuzugreifen. Aber in den arithmetischen Operatoren verwendest du nicht diesen Operator, sondern greifst direkt auf deine internen Daten zu - dort mußt du die Zeiger dann oft genug dereferenzieren, um an die richtige Stelle zu kommen.</p>
</blockquote>
<p>okay ich glaube ich habe das verstanden, aber dann stellt sich mir die Frage warum er in den &quot;arithmetischen Operatoren&quot; nicht den überladenen operator[] benutzt. Ist das immer so? und wenn ja warum?</p>
</blockquote>
<p>Dein Index-Operator wird nur angewendet, wenn der linke Operand eine Matrix ist - wie in <code>m[i][i]</code> . Bei deinen Aufrufen <code>m.mat[i][j]</code> steht dort aber ein Zeiger - und der hat seinen eigenen (eingebauten) Index-Operator.</p>
<blockquote>
<p>pps: in der print()-Funktion kommt es auch zu einem Fehler, aber wenn der Zugriff wie du sagst, über <code>m[i][j]</code> möglich ist, müsste dann dort nicht einfach ein Integer stehen? Also warum kommt es zu einem Fehler?</p>
</blockquote>
<p>In der print-Funktion kannst du *this als Matrix-Objekt verwenden, mit dem du den Index-Operator nutzen kanns, das sieht dann so aus <code>cout&lt;&lt;(*this)[i][/j]&lt;&lt;endl;</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075995</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 09 Jun 2011 19:29:15 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Thu, 09 Jun 2011 19:37:39 GMT]]></title><description><![CDATA[<p>vielen dank für die kleine Nachhilfestunde, ich sah den Wald vor lauter Bäumen schon nicht mehr. Damit sind meine Probleme gelöst! Dank dir! <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2075998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2075998</guid><dc:creator><![CDATA[Kiigass]]></dc:creator><pubDate>Thu, 09 Jun 2011 19:37:39 GMT</pubDate></item><item><title><![CDATA[Reply to gelöst: Problem bei doppelter Zeigerarithmetik on Fri, 10 Jun 2011 05:40:08 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Kiigass schrieb:</p>
<blockquote>
<p>und wenn wir grad dabei sind: Kann mir jemand sagen ob es richtig von mir war, die Zeile 38 in matrix.cpp aus zu kommentieren? Wenn ich sie drin lasse meldet der Compiler: &quot;doppeltes free&quot;</p>
</blockquote>
<p>Ja, das ist richtig, das auszukommentieren. Dein delete auf das mat ruft den Zeilendestruktor auf, welcher dann wieder ein delete für die einzelnen Werte aufruft.</p>
<p>Und das doppelte free sagt dir nicht dein Compiler, sondern deine Laufzeitumgebung. Das ist ein ganz großer Unterschied.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Nicht wirklich. mat ist vom Typ Zeile** und nicht Zeile*. Da wird kein Destruktor aufgerufen. Das auskommentieren ist also falsch und führt zum Speicherleck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2076136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2076136</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Fri, 10 Jun 2011 05:40:08 GMT</pubDate></item></channel></rss>