<?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 mit Pointer und Rekursion]]></title><description><![CDATA[<p>Hallo Leute,<br />
ich habe mich grade hier neu im Forum angemeldet weil ich ein Problem habe und einfach nicht weiter komme. Ich bin gerade dabei ein Programm zu schreiben welches Datei mittels Huffmann Algorithmus komprimiert.</p>
<p>Soweit so gut, ich kann die Datei einlesen und den Baum aufbauen, aber beim erstellen der Code Tabelle habe ich Probleme. Ich durchlaufe den Huffmann Baum rekusiv, und immer wenn ich an einem Blatt angekommen bin wird der erzeugte Huffman Code in der Code Tabeklle gespeichert.<br />
Der Huffmann Code wird mit Strings erzeugt, für den linken Teilbaum wird eine<br />
0 angehängt und für den rechten Teilbaum eine 1.<br />
Wenn ich das so mache wirft mir der Computer irgendwas mit den Pointern durcheinander und die manche Zeiger auf Child-Nodes zeigen irgendwohin und es kommen gnaz komische Werte raus.<br />
Wenn ich den Baum durchlaufe und mir nur die Werte der Blätter ausgeben lasse funktioniet aber alles einwandfrei.<br />
Ich bin ziemlicher C++ Neuling und kann mir das nicht recht erklären, wisst ihr Rat ?</p>
<p>Hier der Code der den Baum durchläuft</p>
<pre><code class="language-cpp">void Huffmann::traverseNodes(vector&lt;string&gt;* vec, struct node* aNode, string s)
{
  if (aNode -&gt; leaf == true)
  {
    vec -&gt; at(aNode -&gt; value) = s;
    printf(&quot;Wert %d mit Freq %f hat den H-Code %s \n&quot;, aNode -&gt; value,
        aNode -&gt; frequency, s.c_str());
  }
  else
  {

    string l = &quot;0&quot;;
    string r = &quot;1&quot;;
    l.insert(0, s);
    r.insert(0, s);

    struct node* ln = aNode -&gt; left;
    struct node* rn = aNode -&gt; right;
    if (ln == NULL || rn == NULL)
    {
      printf(&quot;Fehler, ein Kindkonten ist null&quot;);
      exit(0);
    }

    traverseNodes(vec, ln, l);
    traverseNodes(vec, rn, r);
  }
}
</code></pre>
<p>node ist einfach ein struct das ich mir definiert habe</p>
<pre><code class="language-cpp">struct node
{
  struct node* left;
  struct node* right;
  unsigned char value;
  float frequency;
  bool leaf;
  bool selected;
};
</code></pre>
<p>und hier noch der Code der vor dem Aufruf der traverse Funktion ausgeführt wird.<br />
Also zu Anfang füge ich alle Blätter in den Vector &quot;theTree&quot;, und gehe dann nachd em Huffmann Algorithmus vor und suche mir immer die kleinsten Zwei Werte und verbinde diese mit einer Kante. Die Nachfolgerknoten werden dann in left und right gespeichert. (lastIndex1 und lastIndex2 sind die Positionen im Vector der zwei kleinsten Knoten)</p>
<pre><code class="language-cpp">struct node newNode;
    newNode.left = &amp;theTree.at(lastIndex1);
    newNode.right = &amp;theTree.at(lastIndex2);
    newNode.selected = false;
    newNode.leaf = false;
    newNode.value = 1;
    newNode.frequency = node1.frequency + node2.frequency;

    printf(&quot;FÃ¼ge neuen Knoten hinzu, left %d right %d frequency %f \n&quot;,
        node1.value, node2.value, newNode.frequency);
    theTree.push_back(newNode);
  }

  // save code into vector
  std::vector&lt;string&gt; replaceTable(256, &quot;11111111&quot;);
  traverseNodes(&amp;replaceTable, &amp;theTree.at(theTree.size() - 1), &quot;&quot;);
</code></pre>
<p>Kann mein Fehler daher kommen das ich die Adressen der Nodes aus dem Vector beziehe, und wenn ich was mit Strings mache die interne Speicherverwaltung das alle über den Haufen wirft und manchen Nodes im Vector neue Adrssen vergibt ?</p>
<p>Wenn ich die Traverse Funktion rekursiv mit leeren Strings &quot;&quot; sich selbst aufrufen lasse, oder mit einem statischen dann wird der Baum korrekt durchlaufen, als Ergebnis erhält man dann</p>
<blockquote>
<p>Wert 114 mit Freq 0.363636 hat den H-Code a<br />
Wert 122 mit Freq 0.090909 hat den H-Code a<br />
Wert 115 mit Freq 0.090909 hat den H-Code a<br />
Wert 116 mit Freq 0.090909 hat den H-Code b<br />
Wert 118 mit Freq 0.090909 hat den H-Code a<br />
Wert 121 mit Freq 0.090909 hat den H-Code b<br />
Wert 97 mit Freq 0.181818 hat den H-Code b</p>
</blockquote>
<p>Wenn man aber in der Rekusion irgendwelche String Operationen macht kommt<br />
folgendes raus</p>
<blockquote>
<p>Wert 114 mit Freq 0.363636 hat den H-Code 0<br />
Wert 122 mit Freq 0.090909 hat den H-Code 100<br />
Wert 255 mit Freq 0.090821 hat den H-Code 1010<br />
Wert 4 mit Freq 0.000000 hat den H-Code 1011<br />
Wert 3 mit Freq 0.000000 hat den H-Code 1100<br />
Wert 25 mit Freq 0.000000 hat den H-Code 1101<br />
Wert 97 mit Freq 0.181818 hat den H-Code 111</p>
</blockquote>
<p>Da verhauts dann irgendwie 4 Werte ??</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273967/probleme-mit-pointer-und-rekursion</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 21:44:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273967.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Sep 2010 14:27:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit Pointer und Rekursion on Thu, 16 Sep 2010 14:27:40 GMT]]></title><description><![CDATA[<p>Hallo Leute,<br />
ich habe mich grade hier neu im Forum angemeldet weil ich ein Problem habe und einfach nicht weiter komme. Ich bin gerade dabei ein Programm zu schreiben welches Datei mittels Huffmann Algorithmus komprimiert.</p>
<p>Soweit so gut, ich kann die Datei einlesen und den Baum aufbauen, aber beim erstellen der Code Tabelle habe ich Probleme. Ich durchlaufe den Huffmann Baum rekusiv, und immer wenn ich an einem Blatt angekommen bin wird der erzeugte Huffman Code in der Code Tabeklle gespeichert.<br />
Der Huffmann Code wird mit Strings erzeugt, für den linken Teilbaum wird eine<br />
0 angehängt und für den rechten Teilbaum eine 1.<br />
Wenn ich das so mache wirft mir der Computer irgendwas mit den Pointern durcheinander und die manche Zeiger auf Child-Nodes zeigen irgendwohin und es kommen gnaz komische Werte raus.<br />
Wenn ich den Baum durchlaufe und mir nur die Werte der Blätter ausgeben lasse funktioniet aber alles einwandfrei.<br />
Ich bin ziemlicher C++ Neuling und kann mir das nicht recht erklären, wisst ihr Rat ?</p>
<p>Hier der Code der den Baum durchläuft</p>
<pre><code class="language-cpp">void Huffmann::traverseNodes(vector&lt;string&gt;* vec, struct node* aNode, string s)
{
  if (aNode -&gt; leaf == true)
  {
    vec -&gt; at(aNode -&gt; value) = s;
    printf(&quot;Wert %d mit Freq %f hat den H-Code %s \n&quot;, aNode -&gt; value,
        aNode -&gt; frequency, s.c_str());
  }
  else
  {

    string l = &quot;0&quot;;
    string r = &quot;1&quot;;
    l.insert(0, s);
    r.insert(0, s);

    struct node* ln = aNode -&gt; left;
    struct node* rn = aNode -&gt; right;
    if (ln == NULL || rn == NULL)
    {
      printf(&quot;Fehler, ein Kindkonten ist null&quot;);
      exit(0);
    }

    traverseNodes(vec, ln, l);
    traverseNodes(vec, rn, r);
  }
}
</code></pre>
<p>node ist einfach ein struct das ich mir definiert habe</p>
<pre><code class="language-cpp">struct node
{
  struct node* left;
  struct node* right;
  unsigned char value;
  float frequency;
  bool leaf;
  bool selected;
};
</code></pre>
<p>und hier noch der Code der vor dem Aufruf der traverse Funktion ausgeführt wird.<br />
Also zu Anfang füge ich alle Blätter in den Vector &quot;theTree&quot;, und gehe dann nachd em Huffmann Algorithmus vor und suche mir immer die kleinsten Zwei Werte und verbinde diese mit einer Kante. Die Nachfolgerknoten werden dann in left und right gespeichert. (lastIndex1 und lastIndex2 sind die Positionen im Vector der zwei kleinsten Knoten)</p>
<pre><code class="language-cpp">struct node newNode;
    newNode.left = &amp;theTree.at(lastIndex1);
    newNode.right = &amp;theTree.at(lastIndex2);
    newNode.selected = false;
    newNode.leaf = false;
    newNode.value = 1;
    newNode.frequency = node1.frequency + node2.frequency;

    printf(&quot;FÃ¼ge neuen Knoten hinzu, left %d right %d frequency %f \n&quot;,
        node1.value, node2.value, newNode.frequency);
    theTree.push_back(newNode);
  }

  // save code into vector
  std::vector&lt;string&gt; replaceTable(256, &quot;11111111&quot;);
  traverseNodes(&amp;replaceTable, &amp;theTree.at(theTree.size() - 1), &quot;&quot;);
</code></pre>
<p>Kann mein Fehler daher kommen das ich die Adressen der Nodes aus dem Vector beziehe, und wenn ich was mit Strings mache die interne Speicherverwaltung das alle über den Haufen wirft und manchen Nodes im Vector neue Adrssen vergibt ?</p>
<p>Wenn ich die Traverse Funktion rekursiv mit leeren Strings &quot;&quot; sich selbst aufrufen lasse, oder mit einem statischen dann wird der Baum korrekt durchlaufen, als Ergebnis erhält man dann</p>
<blockquote>
<p>Wert 114 mit Freq 0.363636 hat den H-Code a<br />
Wert 122 mit Freq 0.090909 hat den H-Code a<br />
Wert 115 mit Freq 0.090909 hat den H-Code a<br />
Wert 116 mit Freq 0.090909 hat den H-Code b<br />
Wert 118 mit Freq 0.090909 hat den H-Code a<br />
Wert 121 mit Freq 0.090909 hat den H-Code b<br />
Wert 97 mit Freq 0.181818 hat den H-Code b</p>
</blockquote>
<p>Wenn man aber in der Rekusion irgendwelche String Operationen macht kommt<br />
folgendes raus</p>
<blockquote>
<p>Wert 114 mit Freq 0.363636 hat den H-Code 0<br />
Wert 122 mit Freq 0.090909 hat den H-Code 100<br />
Wert 255 mit Freq 0.090821 hat den H-Code 1010<br />
Wert 4 mit Freq 0.000000 hat den H-Code 1011<br />
Wert 3 mit Freq 0.000000 hat den H-Code 1100<br />
Wert 25 mit Freq 0.000000 hat den H-Code 1101<br />
Wert 97 mit Freq 0.181818 hat den H-Code 111</p>
</blockquote>
<p>Da verhauts dann irgendwie 4 Werte ??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953426</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953426</guid><dc:creator><![CDATA[hssjc]]></dc:creator><pubDate>Thu, 16 Sep 2010 14:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointer und Rekursion on Thu, 16 Sep 2010 14:47:18 GMT]]></title><description><![CDATA[<p>Erst einmal Herzlich Willkommen im Forum und allergrößten Respekt für dein erstes Posting! Ordentlich Sätze, sogar mit Satzzeichen, eine genaue Beschreibung des Problems, Bereitstellung des Quelltextes inklusive Verwendung von Code Tags... vorbildlich!</p>
<p>Wie du schon richtig vermutet hast können Adressen von Elementen in einem Vektor ungültig werden, nämlich dann, wenn die Kapazität des Vektors nicht mehr ausreicht und er reallokieren muss. Damit kann es passieren, dass deine Zeiger irgendwo in´s Nirvana zeigen und dein Programm seltsame Ergebnisse produziert.</p>
<p>Edit:<br />
Kannst dir ja mal die Adressen der Vektorelemente und die Adressen, auf die sie zeigen ausgeben lassen. Da solltest du erkennen können, ob die Zeiger noch gültig sind oder nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953439</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 16 Sep 2010 14:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointer und Rekursion on Thu, 16 Sep 2010 14:50:07 GMT]]></title><description><![CDATA[<p>Hi Doc,<br />
Hast du ne Idee wie ich das Problem umgehen könnte ?<br />
Ich meine am Vektor selbst wird ja nichts verändert, sondern<br />
ich führe einfach nur folgende String Operationen in<br />
der Rekursion aus</p>
<pre><code class="language-cpp">string l = &quot;0&quot;;
    string r = &quot;1&quot;;
    l.insert(0, s);
    r.insert(0, s);
</code></pre>
<p>Ich könnte mir einen Tree aus festen Objekten aus dem fertigen Baum erstellen.<br />
Aber kann dann nicht schon während des Aufbaus des Huffmann-Tree die Adressen<br />
der Pointer ungültig werden ?<br />
Gruß<br />
Till</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953442</guid><dc:creator><![CDATA[hssjc]]></dc:creator><pubDate>Thu, 16 Sep 2010 14:50:07 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointer und Rekursion on Thu, 16 Sep 2010 15:11:16 GMT]]></title><description><![CDATA[<p>Du kannst die Knoten dynamisch auf dem Heap erstellen und die Zeiger in den Vektor einfügen. Die Zeiger bleiben auch nach einem vector::resize() gültig, allerdings musst du die hinterher alle manuell wieder abräumen.<br />
Wenn du Zugriff auf die boost Bibliotheken hast kannst du ptr_vector benutzen, der das dann von alleine macht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953448</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 16 Sep 2010 15:11:16 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointer und Rekursion on Thu, 16 Sep 2010 16:15:44 GMT]]></title><description><![CDATA[<p>Wenn du die Anzahl Elemente vorher weisst, kannst du auch mit <code>std::vector::reserve()</code> genügend Speicher anfordern, sodass keine Reallokationen nötig sind. Oder du verwendest einen anderen Container. <code>std::deque</code> sollte bestehende Elemente nicht verschieben, wenn du nur neue einfügst. Und sonst sicher <code>std::list</code> und alle vier assoziativen Container.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953483</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 16 Sep 2010 16:15:44 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit Pointer und Rekursion on Fri, 17 Sep 2010 07:22:39 GMT]]></title><description><![CDATA[<p>Hi Leute,<br />
Danke für eure Tips.<br />
Also mit dem reserve hat es nicht geklappt.<br />
Ich habe in den Nodes nun anstatt einen Zeiger auf die Kindknoten<br />
einfach den Index im Vektor gespeichert. Da sich die Reihenfolge<br />
im Vektor nicht ändert klappt das wunderbar <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 />
Gruß<br />
Till</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953625</guid><dc:creator><![CDATA[hssjc]]></dc:creator><pubDate>Fri, 17 Sep 2010 07:22:39 GMT</pubDate></item></channel></rss>