<?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[[AssignmentOp] PointerArray kopieren]]></title><description><![CDATA[<p>Ich habe ein Array(matrix_) mit Pointers und einige Pointer davon sind NULL.<br />
Ich will nun in einem AssignmenOperator dieses Array, dass member einer Klasse ist kopieren.</p>
<p>Jetzt habe ich folgendes Problem:</p>
<pre><code class="language-cpp">//bm ist das argument des AssignmentOps
if(bm.matrix_[i][j] != NULL)
    *matrix_[i][j]=*bm.matrix_[i][j]; //BOOM!
else
    matrix_[i][j]=NULL;
</code></pre>
<p>In der markierten Zeile knallts, weil natuerlich in einigen Faellen auf der linken Seite der Zuweisung verusucht wird ein NULL-Pointer zu dereferenzieren.<br />
Aber wie koennte ich die Werte aus der anderen Klasse sonst kopieren?<br />
Wie kann ich dieses Problem ohne eine dynamische Allokation loesen?</p>
<p>thx in advance</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/113626/assignmentop-pointerarray-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 21:11:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/113626.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 24 Jun 2005 17:21:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Mon, 27 Jun 2005 17:53:04 GMT]]></title><description><![CDATA[<p>Ich habe ein Array(matrix_) mit Pointers und einige Pointer davon sind NULL.<br />
Ich will nun in einem AssignmenOperator dieses Array, dass member einer Klasse ist kopieren.</p>
<p>Jetzt habe ich folgendes Problem:</p>
<pre><code class="language-cpp">//bm ist das argument des AssignmentOps
if(bm.matrix_[i][j] != NULL)
    *matrix_[i][j]=*bm.matrix_[i][j]; //BOOM!
else
    matrix_[i][j]=NULL;
</code></pre>
<p>In der markierten Zeile knallts, weil natuerlich in einigen Faellen auf der linken Seite der Zuweisung verusucht wird ein NULL-Pointer zu dereferenzieren.<br />
Aber wie koennte ich die Werte aus der anderen Klasse sonst kopieren?<br />
Wie kann ich dieses Problem ohne eine dynamische Allokation loesen?</p>
<p>thx in advance</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816584</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Mon, 27 Jun 2005 17:53:04 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Fri, 24 Jun 2005 17:32:11 GMT]]></title><description><![CDATA[<p>Bin grad zu dem Schluss gekommen, dass ich um ein new statement wohl nicht herumkomme. Falls es doch geht, meldet euch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816589</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Fri, 24 Jun 2005 17:32:11 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 10:39:36 GMT]]></title><description><![CDATA[<p>Ich versuch noch mal von vorne anzufangen. Mich laesst das Problem nicht los.<br />
Hab mich jetzt doch wieder umentschieden.<br />
Folgendes Programmfragment:</p>
<pre><code class="language-cpp">class Foo { };

class Bar
{
    Foo *f[10][10];
    //...
    Bar operator=(const Bar&amp; src);
    //...
};

Bar operator=(const Bar&amp; src)
{
    for(int i=0; i&lt;10; ++i)
        for(int j=0; j&lt;10; ++j)
            if(src.f[i][j] != NULL)
                *f[i][j]=*src.f[i][j];    //BOOM!
            else
                f[i][j]=NULL;
}
</code></pre>
<p>Das Array Bar::f enthaelt auch NULL Pointer.<br />
Wie angedeutet knallts gelegentlich in der markierten Zeile, weil this-&gt;f[i][j]==NULL ist.<br />
Wie kann ich den operator= vernuenftig implementieren, ohne dass versucht wird NULL-Pointer zu dereferenzieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816912</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 25 Jun 2005 10:39:36 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 10:47:29 GMT]]></title><description><![CDATA[<p>Das problem ist einfach das du versuchst daten auf einen Speicherbereich der dir gar nicht gehört zu zuweisen. Deine neue klasse braucht entweder einen neuen speicherbereich, den du wie du bereits erkannt hast mit new erstellen musst, oder du kopierst lediglich die Pointer, was zur Folge hat das das array auf die gleichen elemente zeigt.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816914</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sat, 25 Jun 2005 10:47:29 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 11:13:04 GMT]]></title><description><![CDATA[<p>Das Problem resultiert doch aber nur daraus, dass NULL Pointer unter den zu kopierenden(src), bzw. noch enthaltenen(this) Elementen vorhanden sind, oder?<br />
Weil sonst koennte ich ja einfach die Pointer dereferenzieren und dann wuerden der CopyCtor von Foo das Kopieren uebernehmen koennen.</p>
<pre><code class="language-cpp">*f[i][j]=*src.f[i][j];
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/816925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816925</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 25 Jun 2005 11:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 11:25:47 GMT]]></title><description><![CDATA[<p>Hier resultiert das Problem eher daher das die linke seite auf irgendwas zeigt, aber nicht auf einen Speicherplatz ( den er benutzen darf ). Die Rechte Seite kann wegen deiner Abfrage nicht NULL sein.</p>
<pre><code class="language-cpp">*f[i][j]=*src.f[i][j];
</code></pre>
<p>Btw. Wenn du platz für einen pointer hast, hast du noch lange nicht platz für ein objekt!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816932</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sat, 25 Jun 2005 11:25:47 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 11:38:03 GMT]]></title><description><![CDATA[<p>evilissimo schrieb:</p>
<blockquote>
<p>Hier resultiert das Problem eher daher das die linke seite auf irgendwas zeigt, aber nicht auf einen Speicherplatz ( den er benutzen darf ).</p>
<pre><code class="language-cpp">*f[i][j]=*src.f[i][j];
</code></pre>
</blockquote>
<p>Wir reden hier vom operator= und nicht dem CopyCtor. Warum sollten die Pointer nicht auf einen Speicherplatz zeigen?</p>
<p>Falls du jetzt meinst, dass einige auf NULL zeigen, dann hast du genau das wiederholt, was ich in meinem vorherigen Post geschrieben habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816941</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 25 Jun 2005 11:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 12:11:26 GMT]]></title><description><![CDATA[<p>Ich meine das es gut sein kann das du gar keinen Speicherplatz hast auf den du was zuweisen kannst, davon rede ich. Zeig mir mal wie du das Array im Konstruktor initialisierst und ihm speicher zuweist.</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816968</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sat, 25 Jun 2005 12:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 12:14:22 GMT]]></title><description><![CDATA[<p>Raptor schrieb:</p>
<blockquote>
<p>evilissimo schrieb:</p>
<blockquote>
<p>Hier resultiert das Problem eher daher das die linke seite auf irgendwas zeigt, aber nicht auf einen Speicherplatz ( den er benutzen darf ).</p>
<pre><code class="language-cpp">*f[i][j]=*src.f[i][j];
</code></pre>
</blockquote>
<p>Wir reden hier vom operator= und nicht dem CopyCtor. Warum sollten die Pointer nicht auf einen Speicherplatz zeigen?</p>
<p>Falls du jetzt meinst, dass einige auf NULL zeigen, dann hast du genau das wiederholt, was ich in meinem vorherigen Post geschrieben habe.</p>
</blockquote>
<p>Das Topic ging ja ursprünglich in der Tat um den CopyCtor, und der sah/sieht genau so aus. Dein Code für den op= ist fast wie er sein sollte (lieber *this zurück als Referenz zurückgeben), aber falsch für den CopyCtor.</p>
<p>Also wo kommen die Foo Objekte her? Und setzt du die gesamte Matrix auf 0 in deinen Konstruktoren, oder Default-Foos oder sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816969</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Sat, 25 Jun 2005 12:14:22 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 12:34:25 GMT]]></title><description><![CDATA[<p>Ich setze die gesamte Matrix im Ctor auf NULL.<br />
Mittels eines setters</p>
<pre><code class="language-cpp">setElement(int x,int y, Foo* f)
</code></pre>
<p>setze ich dann die jeweiligen Elemente.<br />
Die Foos, die ich als Parameter benutze, kommen aus main(), wo ich sie statisch auf dem stack definiert habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816974</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816974</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 25 Jun 2005 12:34:25 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 12:39:47 GMT]]></title><description><![CDATA[<p>Raptor schrieb:</p>
<blockquote>
<p>Ich setze die gesamte Matrix im Ctor auf NULL.<br />
Mittels eines setters</p>
<pre><code class="language-cpp">setElement(int x,int y, Foo* f)
</code></pre>
<p>setze ich dann die jeweiligen Elemente.<br />
Die Foos, die ich als Parameter benutze, kommen aus main(), wo ich sie statisch auf dem stack definiert habe.</p>
</blockquote>
<p>Ok.</p>
<p>mal angenommen du hast ein einen Pointer p der zeigt auf 0 ( das ist dein Array in der klasse )<br />
und nun kommt ein pointer o der auf 4 Byte zeigt an der adresse 0x24234FFA ( Das sind deine daten aus Main )</p>
<p>und DU machst dann *p (ups du dereferenzierst NULL ? ) = *o;</p>
<p>Verstanden? Du hast keinen Speicherplatz für deine Daten!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816978</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Sat, 25 Jun 2005 12:39:47 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 12:55:25 GMT]]></title><description><![CDATA[<p>Okay - Es gilt Speicherplatz zu beschaffen.<br />
Was schlagt ihr vor?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816980</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 25 Jun 2005 12:55:25 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 12:57:47 GMT]]></title><description><![CDATA[<p>Raptor schrieb:</p>
<blockquote>
<p>Ich setze die gesamte Matrix im Ctor auf NULL.<br />
Mittels eines setters</p>
<pre><code class="language-cpp">setElement(int x,int y, Foo* f)
</code></pre>
<p>setze ich dann die jeweiligen Elemente.<br />
Die Foos, die ich als Parameter benutze, kommen aus main(), wo ich sie statisch auf dem stack definiert habe.</p>
</blockquote>
<p>Auf dem Stack? Dann könnte die Lösung knifflig werden. Du musst nämlich nicht nur bei <em>src</em>, sondern auch bei *<em>this</em> auf != 0 achten.</p>
<p>Mit jeweils einmaligen Foos auf dem Heap könnte die Lösung ungefähr so aussehen:</p>
<pre><code class="language-cpp">inline bool Bar::hasElement( std::size_t row, std::size_t col ) const
{
  return matrix_[row][col] != 0;
}

void Bar::setElement( std::size_t row, std::size_t col, Foo* f )
{
  if (f != 0) {
    if (hasElement(row, col)) {
      *matrix_[row][col] = *f;
    } else {
      matrix_[row][col] = new Foo(*f);
    }
  } else if (hasElement(row, col)) {
    delete matrix_[row][col];
    matrix_[row][col] = 0;
  }
}

Bar&amp; Bar::operator=( Bar const&amp; src )
{
  for (int row = 0; row &lt; 10; ++row) {
    for (int col = 0; col &lt; 10; ++col) {
      setElement(row, col, src.matrix_[row][col]);
    }
  }
  return *this;
}
</code></pre>
<p>Könnte ungefähr sein was du suchst, aber auch komplett daneben.<br />
Schwer zu sagen ohne zu wissen was Foo &amp; Bar eigentlich sind, wieso unbedingt Pointer und nicht schlicht Objekte wenn du jene ohnehin immer kopierst/zuweist, es offensichtlich nicht wirklich &quot;Referenzen&quot; sind...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816981</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Sat, 25 Jun 2005 12:57:47 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Sat, 25 Jun 2005 13:12:00 GMT]]></title><description><![CDATA[<p>Ok.<br />
Ich sehe schon.<br />
Ich werde wohl auf den Heap ausweichen.<br />
Ist denke ich die bessere Loesung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816986</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Sat, 25 Jun 2005 13:12:00 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Mon, 27 Jun 2005 10:54:52 GMT]]></title><description><![CDATA[<p>Ich hab noch mal ueber den fehlenden Speicher gegruebelt.<br />
Ich kann ja auch folgendes machen, ohne extra Speicher anzufordern:</p>
<pre><code class="language-cpp">int main()
{
    char* arr = &quot;abcdefghijklm&quot;;

    return 0;
}
</code></pre>
<p>Ich glaube euch ja, dass ich keinen Speicher habe, aber warum?<br />
Warum muss ich bei meinem Problem extra welchen anfordern?<br />
Die Array-Groessen sind doch bekannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/817977</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/817977</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Mon, 27 Jun 2005 10:54:52 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Mon, 27 Jun 2005 10:58:45 GMT]]></title><description><![CDATA[<p>Raptor schrieb:</p>
<blockquote>
<p>Ich glaube euch ja, dass ich keinen Speicher habe, aber warum?<br />
Warum muss ich bei meinem Problem extra welchen anfordern?<br />
Die Array-Groessen sind doch bekannt.</p>
</blockquote>
<p>Es sind nicht die Pointer in deiner Matrix denen Speicher fehlt. Es sind die Objekte auf die sie zeigen sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/817982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/817982</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Mon, 27 Jun 2005 10:58:45 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Mon, 27 Jun 2005 17:45:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Es sind nicht die Pointer in deiner Matrix denen Speicher fehlt. Es sind die Objekte auf die sie zeigen sollen.</p>
</blockquote>
<p>huh?</p>
<p>evilissimo schrieb:</p>
<blockquote>
<p>Verstanden? Du hast keinen Speicherplatz für deine Daten!!!</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/818478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/818478</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Mon, 27 Jun 2005 17:45:18 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Mon, 27 Jun 2005 18:17:51 GMT]]></title><description><![CDATA[<p>Raptor schrieb:</p>
<blockquote>
<blockquote>
<p>Es sind nicht die Pointer in deiner Matrix denen Speicher fehlt. Es sind die Objekte auf die sie zeigen sollen.</p>
</blockquote>
<p>huh?</p>
<p>evilissimo schrieb:</p>
<blockquote>
<p>Verstanden? Du hast keinen Speicherplatz für deine Daten!!!</p>
</blockquote>
</blockquote>
<p>Wird das ein ASW-Experiment?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/818493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/818493</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Mon, 27 Jun 2005 18:17:51 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Mon, 27 Jun 2005 18:36:17 GMT]]></title><description><![CDATA[<p><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 />
Also. Ich hatte gedacht, wenn ich mein Array mittels der Schleifen durchlaufe...</p>
<pre><code class="language-cpp">for(int i=0; i&lt;10; ++i)
        for(int j=0; j&lt;10; ++j)
            if(src.f[i][j] != NULL)
                *f[i][j]=*src.f[i][j]; //...dann wird hier doch der inhalt von
                                       // *src.f[i][j] kopiert - damit waeren doch 
                                       // schonmal Objekte vorhanden
</code></pre>
<p>Warum meinst du trotzdem, die Objekte wuerden fehlen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/818505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/818505</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Mon, 27 Jun 2005 18:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Mon, 27 Jun 2005 18:46:03 GMT]]></title><description><![CDATA[<p>Spiel einfach mal folgendes Beispiel durch:</p>
<pre><code>{ { x, x, x },            { { y, y, y },
  { 0, x, x },      =       { y, y, 0 },
  { 0, 0, x } }             { y, 0, 0 } }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/818515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/818515</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Mon, 27 Jun 2005 18:46:03 GMT</pubDate></item><item><title><![CDATA[Reply to [AssignmentOp] PointerArray kopieren on Thu, 04 Aug 2005 11:20:48 GMT]]></title><description><![CDATA[<p>Leider kann ich erst jetzt wieder antworten und muss das hier wieder aufwaermen.<br />
(2Wochen Umbau, daher kein PC, dann 2 Wochen Urlaub wieder kein PC.)<br />
Hab dein Beispiel mal getestet</p>
<pre><code class="language-cpp">int main()
{
    //dass es mit NULL net funktioniert weiss ich ja schon
    /*int arr00[][3] = { { 1, 1, 1 },
                       { NULL, 1, 1 },
                       { NULL, NULL, 1 } };

    int arr11[][3] = { { 2, 2, 2 },
                       { 2, 2, NULL },
                       { 2, NULL, NULL } };*/

    int arr0[][3] = { { 1, 1, 1 },
                      { 42, 1, 1 },
                      { 42, 42, 1} };

    int arr1[][3] = { { 2, 2, 2 },
                      { 2, 2, 42 },
                      { 2, 42, 42 } };

    for(int i=0; i&lt;3; ++i)
        for(int j=0; j&lt;3; ++j)
            arr0[i][j]=arr1[i][j];     

    return 0;
}
</code></pre>
<p>Funktioniert soweit wunderbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/845479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/845479</guid><dc:creator><![CDATA[Raptor]]></dc:creator><pubDate>Thu, 04 Aug 2005 11:20:48 GMT</pubDate></item></channel></rss>