<?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[Zeiger Problem]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem mit der unten gelisteten Klasse.<br />
Es handelt sich um eine Liste die einfach verkettet ist, mein Problem besteht darin, dads ich zwei Insert-Funktionen habe, einmal insert_top und insert_down, mit insert top funtioniert alles und jedes zuletzt hinzugefügte Element, ist das erste in der Liste. Bei Insert_down, passt was nicht, wenn ich diese Funktion aufrufe und noch keine Element(e) in der Liste sind, kommt es zum Sigfault, irgendwie checkt er es nicht, dass die Liste leer ist und somit nicht die kleine If-Anweisung ausführt. Sind Elemente in der Liste vorhanden funktioniert es und es wird korrekt als letztes eingefügt. Warum führt er nicht die If-Anweisung aus obwohl die Liste (table_start=NULL) sein müsste.</p>
<p>Vielen Dank im Voraus<br />
Marc</p>
<pre><code class="language-cpp">class lha_table {
private:
    class element {
    private:
        int userdata;
        element *next;

    public:
        element(int data = 0){
            userdata = data;
            next = NULL;
        }

       virtual ~element(){
            delete next;
        }

        void insert_el(int value){
            element *helper = next;
            next=new element(value);
            next-&gt;setNext(helper);
        }

        void setData(int data){
            userdata=data;
        }
        int getData(){
            return userdata;
        }

        void setNext(element *helper_new){
            next = helper_new;
        }

        element *getNext(){
            return next;
        } 

    };

element *table_start;

public:

   lha_table(){
        table_start = NULL;
    }

    virtual ~lha_table(){
        delete table_start;
    }

   void insert_top( int value )
  {
    element  *second = table_start;

    table_start = new element( value );

    table_start-&gt;setNext( second );
  }

    void insert_down(int value){
        if (table_start==NULL){
            table_start = new element(value);
        }
        else {
            element *last = table_start;
            while(last-&gt;getNext()!=NULL){
                last = last-&gt;getNext();
            }
            last-&gt;insert_el(value);
        }
    }

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/216962/zeiger-problem</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 00:41:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/216962.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Jul 2008 11:16:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger Problem on Tue, 01 Jul 2008 11:16:09 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Problem mit der unten gelisteten Klasse.<br />
Es handelt sich um eine Liste die einfach verkettet ist, mein Problem besteht darin, dads ich zwei Insert-Funktionen habe, einmal insert_top und insert_down, mit insert top funtioniert alles und jedes zuletzt hinzugefügte Element, ist das erste in der Liste. Bei Insert_down, passt was nicht, wenn ich diese Funktion aufrufe und noch keine Element(e) in der Liste sind, kommt es zum Sigfault, irgendwie checkt er es nicht, dass die Liste leer ist und somit nicht die kleine If-Anweisung ausführt. Sind Elemente in der Liste vorhanden funktioniert es und es wird korrekt als letztes eingefügt. Warum führt er nicht die If-Anweisung aus obwohl die Liste (table_start=NULL) sein müsste.</p>
<p>Vielen Dank im Voraus<br />
Marc</p>
<pre><code class="language-cpp">class lha_table {
private:
    class element {
    private:
        int userdata;
        element *next;

    public:
        element(int data = 0){
            userdata = data;
            next = NULL;
        }

       virtual ~element(){
            delete next;
        }

        void insert_el(int value){
            element *helper = next;
            next=new element(value);
            next-&gt;setNext(helper);
        }

        void setData(int data){
            userdata=data;
        }
        int getData(){
            return userdata;
        }

        void setNext(element *helper_new){
            next = helper_new;
        }

        element *getNext(){
            return next;
        } 

    };

element *table_start;

public:

   lha_table(){
        table_start = NULL;
    }

    virtual ~lha_table(){
        delete table_start;
    }

   void insert_top( int value )
  {
    element  *second = table_start;

    table_start = new element( value );

    table_start-&gt;setNext( second );
  }

    void insert_down(int value){
        if (table_start==NULL){
            table_start = new element(value);
        }
        else {
            element *last = table_start;
            while(last-&gt;getNext()!=NULL){
                last = last-&gt;getNext();
            }
            last-&gt;insert_el(value);
        }
    }

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1539054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539054</guid><dc:creator><![CDATA[marc82]]></dc:creator><pubDate>Tue, 01 Jul 2008 11:16:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Problem on Tue, 01 Jul 2008 11:32:57 GMT]]></title><description><![CDATA[<p>marc82 schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Ich habe mehrere Anmerkungen (Fehler auf Anhieb nicht gefunden):<br />
a) Halte deine Einrückung konsistent, macht das Lesen leichter.<br />
b) Wenn du mit Zeigern arbeitest gehört immer ein Konstruktor, Zuweisungsoperator und Kopierkonstruktor dazu, oder explizit verboten!<br />
c) Initialisierungen sollte man nicht im Konstruktorrumpf (das ist eine Zuweisung, keine initialisierung) sondern in der Initialisierungsliste des Konstruktors machen.</p>
<p>Gerade b) führt häufig zu schwer zu findenen Fehlern (Im Zweifel zuerst einmal den Zuweisungsoperator und Kopierkonstruktor als reine Deklaration in den private-Teil der Klasse schreiben).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539061</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 01 Jul 2008 11:32:57 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Problem on Tue, 01 Jul 2008 11:48:29 GMT]]></title><description><![CDATA[<p>Das ist merkwürdig... Ich hab eine Ausgabe hinzugefügt, und es wird immer &quot;table_start ist NULL.&quot; ausgegeben, der If-Block wird also ausgeführt. Ich bekomme auch keine Laufzeitfehler beim Ausführen.</p>
<pre><code class="language-cpp">void insert_down(int value){ 
        if (table_start==NULL){ 
			std::cout&lt;&lt;&quot;table_start ist NULL.&quot;&lt;&lt;std::endl;
            table_start = new element(value); 
        } 
    // ...
    }
</code></pre>
<pre><code class="language-cpp">int main()
{
	lha_table A;
    A.insert_down(3);
    std::cin.get();
}
</code></pre>
<p>Zusätzlich zu asc's Hinweisen noch einige weitere Ratschläge:</p>
<ul>
<li>Die beiden Klassen <code>element</code> und <code>lha_table</code> würde ich separat definieren, das steigert die Übersicht.</li>
<li>Memberfunktionen würde ich nicht inline schreiben. Du kannst deren Deklaration in der Klasse und die Definition ausserhalb mittels ::-Operator implementieren.</li>
<li>Gerade bei eigenen Containerklassen sind Kommentare sehr nützlich, ich würd mir das angewöhnen. Dann erkennst du auch in zwei Monaten auf den ersten Blick, was da genau gemacht wird.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1539070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539070</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 01 Jul 2008 11:48:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Problem on Tue, 01 Jul 2008 12:20:33 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das ist merkwürdig... Ich hab eine Ausgabe hinzugefügt, und es wird immer &quot;table_start ist NULL.&quot; ausgegeben, der If-Block wird also ausgeführt. Ich bekomme auch keine Laufzeitfehler beim Ausführen.</p>
</blockquote>
<p>Einen winzigen Verdacht... Zumindestens unter MSVC hatte ich es schon mal das er auf einen alten Stand zugreift trotz Rebuild all. Vielleicht ist dies hier auch der Fall (ggf. das Release/Debugverzeichnis löschen)...</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1539084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539084</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 01 Jul 2008 12:20:33 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger Problem on Tue, 01 Jul 2008 12:57:27 GMT]]></title><description><![CDATA[<p>habe den code getestet -&gt; er funktionert fehlerlos</p>
<p>allerdings solltest du den destruktor nicht rekursiv implementieren, lieber iterativ</p>
<p>bei</p>
<pre><code class="language-cpp">lha_table A;
for (int i = 0; i &lt; 10000; ++i)
    A.insert_down(1);
</code></pre>
<p>gibts einen stackoverflow !</p>
<p>besser :</p>
<pre><code class="language-cpp">virtual ~lha_table()
{
    while (table_start)
    {
        element *temp = table_start;
        table_start = table_start-&gt;getNext();
        delete temp;
    }
}
</code></pre>
<p>und den element-dtor leer lassen <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/1539108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1539108</guid><dc:creator><![CDATA[helferlein]]></dc:creator><pubDate>Tue, 01 Jul 2008 12:57:27 GMT</pubDate></item></channel></rss>