<?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[Speicherprobleme beim verwenden einer verketteten Liste]]></title><description><![CDATA[<p>Hallo,<br />
bei meinem Versuch tiefer in die Welten der Objektorientierung vorzudringen, bin ich auf das Problem der Datenspeicherung gestossen, und dachte eine verkette Liste von Objekten währe für mich die ideale Lösung.<br />
Leider bekomme ich an einer Stelle immer während der Ausführung (gdb) einen &quot;Segmentation Fault&quot;, und hab leider keine Ahnung warum. Vielleicht könnte jemand aus diesem Forum mir einen Hinweis geben, wo denn der grundlegende Fehler in meiner Implementation liegt ?</p>
<p>Zunächst das Objekt, das an/in die Liste an/eingehängt werden soll:</p>
<pre><code class="language-cpp">class CWare{

        protected:

            int     iWareIndex;                                 //Interner Index für die einzelnen Warentypen
            char    cWareName[WARE_NAME_LENGTH];                //Bezeichnung der Ware z.B &quot;Mammutpelz&quot;
            int     iWarePriceSell;                             //Verkaufspreiss der Ware
            int     iWarePriceBuy;                              //Kaufpreiss der Ware
            int     iWareAmount;                                //Warenmenge
            int     iWareWeight;                                //Gewichtseinheiten, die die Ware einnimmt (hat nur in Waggons Bedeutung)
            int     iWareVolume;                                //Volumenseinheiten, die die Ware einnimmt (hat nur in Waggons Bedeutung)
            int     iWareStorageType;                           //Welche Art der Lagerung erfordert die Ware z.B. Flüssigkeiten =&gt; Tank
            int     iWareStaleFactor;                           //Ist die Ware verderblich, und wenn ja wieviele Zeiteinheiten kann sie gelagert werden

            //CWare   *pFirstWare;
            //CWare   *pNextWare;                                 //Zeiger auf nächste Ware in der jeweiligen Liste
            //CWare   *pPreviousWare;                             //Zeiger auf vorherige Ware in der jeweiligen Liste
            //CWare   *pLastWare;

        public:

            CWare   *pNextWare;                                 //Zeiger auf nächste Ware in der jeweiligen Liste
            CWare   *pPreviousWare;                             //Zeiger auf vorherige Ware in der jeweiligen Liste

            CWare () {pNextWare = NULL; pPreviousWare = NULL;}
            //CWare () {pFirstWare = NULL; pNextWare = NULL; pPreviousWare = NULL; pLastWare = NULL;}
            CWare (int Index,char *Name, int PriceSell, int PriceBuy,int WareAmount, int WareWeight, int WareVolume, int WareStorageType, int WareStaleFactor);

            CWare*  WareAdd(int Index, char *Name);

            void    WareSetIndex(int iNewWareIndex) {iWareIndex = iNewWareIndex;}
            void    WareSetName(char *cNewWareName) {strncpy(cWareName,cNewWareName,WARE_NAME_LENGTH);}
            void    WareSetPriceSell(int iNewWarePriceSell) {iWarePriceSell = iNewWarePriceSell;}
            void    WareSetPriceBuy(int iNewWarePriceBuy) {iWarePriceBuy = iNewWarePriceBuy;}
            void    WareSetAmount(int iNewWareAmount) {iWareAmount = iNewWareAmount;}
            void    WareSetWeight(int iNewWareWeight) {iWareWeight = iNewWareWeight;}
            void    WareSetVolume(int iNewWareVolume) {iWareVolume = iNewWareVolume;}
            void    WareSetStorageType(int iNewWareStorageType) {iWareStorageType = iNewWareStorageType;}
            void    WareSetStaleFactor(int iNewWareStaleFactor) {iWareStaleFactor = iNewWareStaleFactor;}

            int     WareGetIndex(void) {return iWareIndex;}
            void    WareGetName(char *cName) {strncpy(cName,cWareName,WARE_NAME_LENGTH);}
            int     WareGetPriceSell(void) {return iWarePriceSell;}
            int     WareGetPriceBuy(void) {return iWarePriceBuy;}
            int     WareGetAmount(void) {return iWareAmount;}
            int     WareGetWeight(void) {return iWareWeight;}
            int     WareGetVolume(void) {return iWareVolume;}
            int     WareGetStorageType(void) {return iWareStorageType;}
            int     WareGetStaleFactor(void) {return iWareStaleFactor;}

            //void    WareSetNext(CWare *pNewNextWare) {pNextWare = pNewNextWare;}
            //CWare*  WareGetNext(void){ return pNextWare;}

            //int     WareGetSpecificationFromFile(int iWareIndex);

            //int     CreateGoods(char *CityName);

    };
</code></pre>
<p>Die Liste die die einzelnen Objekte Aufnimmt sieht folgendermaßen aus<br />
Header:</p>
<pre><code class="language-cpp">class CWareList{

        protected:

            CWare   Ware;

            CWare   *pFirstWareInList;
            CWare   *pLastWareInList;

        public:

            CWareList () {pFirstWareInList = NULL; pLastWareInList = NULL;}
            void    WareListItemAdd(int Index, char *Name);
            void    WareListItemGet(int Index, char *Name, int *PriceSell, int *PriceBuy,int *WareAmount, int *WareWeight, int *WareVolume, int *WareStorageType, int *WareStaleFactor);
            void    WareListItemRemove(int Index, char *Name);
            void    WareListClear(void);
    };
</code></pre>
<p>Implementation:</p>
<pre><code class="language-cpp">void CWareList::WareListItemAdd(int Index,char *Name){

    if(pFirstWareInList == NULL)
    {
        pFirstWareInList = new CWare(Index,Name,-1,-1,1,1,1,1,1);
        pLastWareInList = pFirstWareInList;
        pLastWareInList-&gt;pNextWare = NULL;
        pLastWareInList-&gt;pPreviousWare = NULL;
    }
    else
    {
        pLastWareInList-&gt;pNextWare = new CWare(Index,Name,-1,-1,1,1,1,1,1);
        pLastWareInList-&gt;pNextWare-&gt;pPreviousWare = pLastWareInList;
        pLastWareInList = pLastWareInList-&gt;pNextWare;
        pLastWareInList-&gt;pNextWare = NULL;
    }

}

void CWareList::WareListItemGet(int Index, char *Name, int *PriceSell, int *PriceBuy,int *WareAmount, int *WareWeight, int *WareVolume, int *WareStorageType, int *WareStaleFactor){

    int     iSearchByChar=0,
            iFound=0,
            i;
    char    cTempName[WARE_NAME_LENGTH];
    CWare*  thisObject = pFirstWareInList;

    if (Index == -1) iSearchByChar = 1;
    else iSearchByChar = 0;

    while(thisObject!=NULL){
        if (iSearchByChar == 0){ //suche nach Index
            i = thisObject-&gt;WareGetIndex();
            if(i == Index){
                iFound = 1;
                break;
            }
        }
        else{// suche nach Warenname
            thisObject-&gt;WareGetName(cTempName);
            if (strcmp(cTempName,Name) == 0){
                iFound = 1;
                break;
            }
        }
        thisObject = thisObject-&gt;pNextWare; //zum nächsten Objekt springen
    }
    if (iFound == 1){
        //*Index = thisObject-&gt;WareGetIndex();
        thisObject-&gt;WareGetName(cTempName);
        strncpy(Name,cTempName,WARE_NAME_LENGTH);
        *PriceSell = thisObject-&gt;WareGetPriceSell();
        *PriceBuy = thisObject-&gt;WareGetPriceBuy(); // !!!!! &lt;--SegFault!!!!!!!!!
        *WareAmount = thisObject-&gt;WareGetAmount();
        *WareWeight = thisObject-&gt;WareGetWeight();
        *WareVolume = thisObject-&gt;WareGetVolume();
        *WareStorageType = thisObject-&gt;WareGetStorageType();
        *WareStaleFactor = thisObject-&gt;WareGetStaleFactor();
    }
}

void CWareList::WareListClear(void){

    CWare* thisObject = pFirstWareInList;
    CWare* deadObject = NULL;

    while(thisObject!=NULL)
    {
        deadObject=thisObject;
        thisObject=thisObject-&gt;pNextWare;
        delete deadObject;
    }

    pFirstWareInList = NULL;
    pLastWareInList = NULL;
}
</code></pre>
<p>Aufgerufen wird das Ganze dann folgendermaßen:</p>
<pre><code class="language-cpp">CWareList wMoskauWareList;

    wMoskauWareList.WareListItemAdd(1,&quot;Brot&quot;);

    wMoskauWareList.WareListItemAdd(2,&quot;Senf&quot;);

    wMoskauWareList.WareListItemGet(1,cName,iPriceSell,iPriceBuy,iAmount,iWeight,iVolume,iStorageType,iStaleFactor);
    wMoskauWareList.WareListClear();
</code></pre>
<p>Es spielt hierbei auch keine Rolle, wieviele Objekte ich an die Liste anhänge (oder es zumindest versuche), oder welches Element ich mir dann gerne näher betrachten möchte</p>
<p>Für jeden kleinen Hinweis währe ich sehr dankbar</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/164625/speicherprobleme-beim-verwenden-einer-verketteten-liste</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 02:10:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/164625.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Nov 2006 14:49:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Fri, 10 Nov 2006 14:49:12 GMT]]></title><description><![CDATA[<p>Hallo,<br />
bei meinem Versuch tiefer in die Welten der Objektorientierung vorzudringen, bin ich auf das Problem der Datenspeicherung gestossen, und dachte eine verkette Liste von Objekten währe für mich die ideale Lösung.<br />
Leider bekomme ich an einer Stelle immer während der Ausführung (gdb) einen &quot;Segmentation Fault&quot;, und hab leider keine Ahnung warum. Vielleicht könnte jemand aus diesem Forum mir einen Hinweis geben, wo denn der grundlegende Fehler in meiner Implementation liegt ?</p>
<p>Zunächst das Objekt, das an/in die Liste an/eingehängt werden soll:</p>
<pre><code class="language-cpp">class CWare{

        protected:

            int     iWareIndex;                                 //Interner Index für die einzelnen Warentypen
            char    cWareName[WARE_NAME_LENGTH];                //Bezeichnung der Ware z.B &quot;Mammutpelz&quot;
            int     iWarePriceSell;                             //Verkaufspreiss der Ware
            int     iWarePriceBuy;                              //Kaufpreiss der Ware
            int     iWareAmount;                                //Warenmenge
            int     iWareWeight;                                //Gewichtseinheiten, die die Ware einnimmt (hat nur in Waggons Bedeutung)
            int     iWareVolume;                                //Volumenseinheiten, die die Ware einnimmt (hat nur in Waggons Bedeutung)
            int     iWareStorageType;                           //Welche Art der Lagerung erfordert die Ware z.B. Flüssigkeiten =&gt; Tank
            int     iWareStaleFactor;                           //Ist die Ware verderblich, und wenn ja wieviele Zeiteinheiten kann sie gelagert werden

            //CWare   *pFirstWare;
            //CWare   *pNextWare;                                 //Zeiger auf nächste Ware in der jeweiligen Liste
            //CWare   *pPreviousWare;                             //Zeiger auf vorherige Ware in der jeweiligen Liste
            //CWare   *pLastWare;

        public:

            CWare   *pNextWare;                                 //Zeiger auf nächste Ware in der jeweiligen Liste
            CWare   *pPreviousWare;                             //Zeiger auf vorherige Ware in der jeweiligen Liste

            CWare () {pNextWare = NULL; pPreviousWare = NULL;}
            //CWare () {pFirstWare = NULL; pNextWare = NULL; pPreviousWare = NULL; pLastWare = NULL;}
            CWare (int Index,char *Name, int PriceSell, int PriceBuy,int WareAmount, int WareWeight, int WareVolume, int WareStorageType, int WareStaleFactor);

            CWare*  WareAdd(int Index, char *Name);

            void    WareSetIndex(int iNewWareIndex) {iWareIndex = iNewWareIndex;}
            void    WareSetName(char *cNewWareName) {strncpy(cWareName,cNewWareName,WARE_NAME_LENGTH);}
            void    WareSetPriceSell(int iNewWarePriceSell) {iWarePriceSell = iNewWarePriceSell;}
            void    WareSetPriceBuy(int iNewWarePriceBuy) {iWarePriceBuy = iNewWarePriceBuy;}
            void    WareSetAmount(int iNewWareAmount) {iWareAmount = iNewWareAmount;}
            void    WareSetWeight(int iNewWareWeight) {iWareWeight = iNewWareWeight;}
            void    WareSetVolume(int iNewWareVolume) {iWareVolume = iNewWareVolume;}
            void    WareSetStorageType(int iNewWareStorageType) {iWareStorageType = iNewWareStorageType;}
            void    WareSetStaleFactor(int iNewWareStaleFactor) {iWareStaleFactor = iNewWareStaleFactor;}

            int     WareGetIndex(void) {return iWareIndex;}
            void    WareGetName(char *cName) {strncpy(cName,cWareName,WARE_NAME_LENGTH);}
            int     WareGetPriceSell(void) {return iWarePriceSell;}
            int     WareGetPriceBuy(void) {return iWarePriceBuy;}
            int     WareGetAmount(void) {return iWareAmount;}
            int     WareGetWeight(void) {return iWareWeight;}
            int     WareGetVolume(void) {return iWareVolume;}
            int     WareGetStorageType(void) {return iWareStorageType;}
            int     WareGetStaleFactor(void) {return iWareStaleFactor;}

            //void    WareSetNext(CWare *pNewNextWare) {pNextWare = pNewNextWare;}
            //CWare*  WareGetNext(void){ return pNextWare;}

            //int     WareGetSpecificationFromFile(int iWareIndex);

            //int     CreateGoods(char *CityName);

    };
</code></pre>
<p>Die Liste die die einzelnen Objekte Aufnimmt sieht folgendermaßen aus<br />
Header:</p>
<pre><code class="language-cpp">class CWareList{

        protected:

            CWare   Ware;

            CWare   *pFirstWareInList;
            CWare   *pLastWareInList;

        public:

            CWareList () {pFirstWareInList = NULL; pLastWareInList = NULL;}
            void    WareListItemAdd(int Index, char *Name);
            void    WareListItemGet(int Index, char *Name, int *PriceSell, int *PriceBuy,int *WareAmount, int *WareWeight, int *WareVolume, int *WareStorageType, int *WareStaleFactor);
            void    WareListItemRemove(int Index, char *Name);
            void    WareListClear(void);
    };
</code></pre>
<p>Implementation:</p>
<pre><code class="language-cpp">void CWareList::WareListItemAdd(int Index,char *Name){

    if(pFirstWareInList == NULL)
    {
        pFirstWareInList = new CWare(Index,Name,-1,-1,1,1,1,1,1);
        pLastWareInList = pFirstWareInList;
        pLastWareInList-&gt;pNextWare = NULL;
        pLastWareInList-&gt;pPreviousWare = NULL;
    }
    else
    {
        pLastWareInList-&gt;pNextWare = new CWare(Index,Name,-1,-1,1,1,1,1,1);
        pLastWareInList-&gt;pNextWare-&gt;pPreviousWare = pLastWareInList;
        pLastWareInList = pLastWareInList-&gt;pNextWare;
        pLastWareInList-&gt;pNextWare = NULL;
    }

}

void CWareList::WareListItemGet(int Index, char *Name, int *PriceSell, int *PriceBuy,int *WareAmount, int *WareWeight, int *WareVolume, int *WareStorageType, int *WareStaleFactor){

    int     iSearchByChar=0,
            iFound=0,
            i;
    char    cTempName[WARE_NAME_LENGTH];
    CWare*  thisObject = pFirstWareInList;

    if (Index == -1) iSearchByChar = 1;
    else iSearchByChar = 0;

    while(thisObject!=NULL){
        if (iSearchByChar == 0){ //suche nach Index
            i = thisObject-&gt;WareGetIndex();
            if(i == Index){
                iFound = 1;
                break;
            }
        }
        else{// suche nach Warenname
            thisObject-&gt;WareGetName(cTempName);
            if (strcmp(cTempName,Name) == 0){
                iFound = 1;
                break;
            }
        }
        thisObject = thisObject-&gt;pNextWare; //zum nächsten Objekt springen
    }
    if (iFound == 1){
        //*Index = thisObject-&gt;WareGetIndex();
        thisObject-&gt;WareGetName(cTempName);
        strncpy(Name,cTempName,WARE_NAME_LENGTH);
        *PriceSell = thisObject-&gt;WareGetPriceSell();
        *PriceBuy = thisObject-&gt;WareGetPriceBuy(); // !!!!! &lt;--SegFault!!!!!!!!!
        *WareAmount = thisObject-&gt;WareGetAmount();
        *WareWeight = thisObject-&gt;WareGetWeight();
        *WareVolume = thisObject-&gt;WareGetVolume();
        *WareStorageType = thisObject-&gt;WareGetStorageType();
        *WareStaleFactor = thisObject-&gt;WareGetStaleFactor();
    }
}

void CWareList::WareListClear(void){

    CWare* thisObject = pFirstWareInList;
    CWare* deadObject = NULL;

    while(thisObject!=NULL)
    {
        deadObject=thisObject;
        thisObject=thisObject-&gt;pNextWare;
        delete deadObject;
    }

    pFirstWareInList = NULL;
    pLastWareInList = NULL;
}
</code></pre>
<p>Aufgerufen wird das Ganze dann folgendermaßen:</p>
<pre><code class="language-cpp">CWareList wMoskauWareList;

    wMoskauWareList.WareListItemAdd(1,&quot;Brot&quot;);

    wMoskauWareList.WareListItemAdd(2,&quot;Senf&quot;);

    wMoskauWareList.WareListItemGet(1,cName,iPriceSell,iPriceBuy,iAmount,iWeight,iVolume,iStorageType,iStaleFactor);
    wMoskauWareList.WareListClear();
</code></pre>
<p>Es spielt hierbei auch keine Rolle, wieviele Objekte ich an die Liste anhänge (oder es zumindest versuche), oder welches Element ich mir dann gerne näher betrachten möchte</p>
<p>Für jeden kleinen Hinweis währe ich sehr dankbar</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1172247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1172247</guid><dc:creator><![CDATA[Gastfrager]]></dc:creator><pubDate>Fri, 10 Nov 2006 14:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Sat, 11 Nov 2006 09:45:56 GMT]]></title><description><![CDATA[<p>Ich habe gerade nicht genug Zeit, mir den ganzen Code durchzulesen <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>
<p>Aber wenn du die Liste nicht unbedingt selber Schreiben willst, würdfe ich dir raten, dir mal die Klasse std::list aus der STL anzusehen.</p>
<p>Kleines Beispiel:</p>
<pre><code class="language-cpp">#include&lt;list&gt;

using namespace std;

int main(void)
{
    list&lt;CWare&gt; eineListe;
    eineListe.pusBack(CWare(...)); //Keine Ahnung welche Argumente der Konstruktor nimmt
    //... noch mehr Sachen einfügen
    for(list&lt;CWare&gt;::iterator it = eineListe.begin(); it != eineListe.end(); ++it)
    {
        //it kann hier verwendet werden, wie ein Zeiger auf CWare
    }
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1172346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1172346</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Sat, 11 Nov 2006 09:45:56 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Sat, 11 Nov 2006 09:55:31 GMT]]></title><description><![CDATA[<p>Hast Du für die Pointer cName, iPriceSell,iPriceBuy u.s.w. auch Speicher reserviert?</p>
<p>DJohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1172356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1172356</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Sat, 11 Nov 2006 09:55:31 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Sat, 11 Nov 2006 22:48:24 GMT]]></title><description><![CDATA[<p>@ Phoemuex:<br />
Hätte wohl dazuschreiben sollen, daß ich keine STL verwenden möchte - zum einen wegen der Portabilität (wobei das ein fragwürdiges Paradigma zu sein scheint, das ich aus der WxWidgets - Doku aufgesogen habe) zum anderen, soll der Lerneffeckt ganz oben stehen (versuche gerade mich in OO - Programmierung einzuarbeiten)<br />
Trotzdem Danke</p>
<p>@ DJohn<br />
Bin etwas verwirrt, meinst du die Pointer, die im Funktionskopf von &quot;WareList::WareListItemGet&quot; definiert werden ? Ich dachte die leben nur zusammen mit der Funktion, und ich wüßte auch nicht so recht wie und warum ich Speicher reservieren soll - ich habe immer Gedacht ich definiere einen Int -&gt; Compiler reserviert Platz für einen Int im Speicher, ich definiere einen Zeiger auf einen Int -&gt; Compiler reserviert Platz für einen Zeiger auf einen Int im Speicher.</p>
<p>Mist, naja, ist vielelicht auch etwas viel verlangt, daß jemand meinen Murkscode auseinanderklamüsert. Hmm hat vielleicht jemand einen fertigen Quelltextschnipsel, um ein Objekt in einer verketteten Liste zu speichern (zum abkucken, und auseinandernehmen) oder vielleicht eine bessere/intelligentere/effizientere Idee, wie ich an ein Objekt dynamisch eine Liste anderer Objekte anhänge ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1172789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1172789</guid><dc:creator><![CDATA[Gastfrager]]></dc:creator><pubDate>Sat, 11 Nov 2006 22:48:24 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Sat, 11 Nov 2006 23:22:53 GMT]]></title><description><![CDATA[<p>Gastfrager schrieb:</p>
<blockquote>
<p>@ Phoemuex:<br />
Hätte wohl dazuschreiben sollen, daß ich keine STL verwenden möchte - zum einen wegen der Portabilität (wobei das ein fragwürdiges Paradigma zu sein scheint, das ich aus der WxWidgets - Doku aufgesogen habe) zum anderen, soll der Lerneffeckt ganz oben stehen (versuche gerade mich in OO - Programmierung einzuarbeiten)<br />
Trotzdem Danke</p>
</blockquote>
<p>Dann bau dir eine eigene Template-List-Klasse, so ist das absoluter CRAP!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1172807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1172807</guid><dc:creator><![CDATA[Thomas ** 0]]></dc:creator><pubDate>Sat, 11 Nov 2006 23:22:53 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Sat, 11 Nov 2006 23:28:28 GMT]]></title><description><![CDATA[<p>@Gastfrager:</p>
<p>&quot;Intrusive lists&quot; vertragen sich nicht gut mit OOP. &quot;Intrusive&quot; heisst dabei dass &quot;die Liste&quot; quasi in das &quot;zu Listende&quot; eindringt, die Klasse deren Objekte du listen willst (das &quot;zu Listende&quot;) muss hier ja &quot;next&quot; und &quot;prev&quot; Pointer haben (was quasi ein Teil &quot;der Liste&quot; ist).</p>
<p>Ansonsten... der Code ist grauenhaft (Benamsung etc.). Fang einfach ganz klein an, mal bloss die Liste und sonst nix, und füg Schritt für Schritt Funktionalität dazu, dann bekommst du am einfachsten raus wo es knallt. Oder nimm ne Entwicklungsumgebung in der man gut debuggen kann, MSVC unter Windows z.B.</p>
<p>Und wenn du schon mit &quot;intrusive lists&quot; arbeiten willst, dann würde ich dir empfehlen eine Basisklasse &quot;ListNode&quot; zu machen, und eine Klasse &quot;List&quot;, die eben &quot;ListNode&quot; Instanzen &quot;listen&quot; kann. Dann leitest du deine Elemente einfach von &quot;ListNode&quot; ab, und gibst der Klasse die diese Elemente listen soll ein Member &quot;List&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1172810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1172810</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 11 Nov 2006 23:28:28 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Sun, 12 Nov 2006 09:48:19 GMT]]></title><description><![CDATA[<p>Gastfrager schrieb:</p>
<blockquote>
<p>@ DJohn<br />
Bin etwas verwirrt, meinst du die Pointer, die im Funktionskopf von &quot;WareList::WareListItemGet&quot; definiert werden ?</p>
</blockquote>
<p>Nein, ich meine die Pointer, die Du verwendest unter:</p>
<p>Gastfrager schrieb:</p>
<blockquote>
<p>Aufgerufen wird das Ganze dann folgendermaßen:</p>
</blockquote>
<p>Dort zeigst Du leider nicht den Teil, wo Du die Variablen definierst.</p>
<p>Gastfrager schrieb:</p>
<blockquote>
<p>und ich wüßte auch nicht so recht wie und warum ich Speicher reservieren soll - ich habe immer Gedacht ich definiere einen Int -&gt; Compiler reserviert Platz für einen Int im Speicher, ich definiere einen Zeiger auf einen Int -&gt; Compiler reserviert Platz für einen Zeiger auf einen Int im Speicher.</p>
</blockquote>
<p>Ja, das ist richtig.<br />
Aber bei einem Zeiger wird eben nur der Platz für den Zeiger selbst automatisch reserviert, nicht aber der Platz auf den der Zeiger zeigt (den Int)!<br />
Und in Deiner WareListItemGet()-Methode (Dort wo der Seg-Fault auftritt), veränderst Du ja nicht den Zeiger selbst, sondern Du dereferenzierst den Zeiger mit *.</p>
<p>Du hast 2 Möglichkeiten, entweder Du definierst Variablen vom Typ int und übergibst die Adresse auf diese Variablen an WareListItemGet():</p>
<pre><code class="language-cpp">char cName[WARE_NAME_LENGTH];
int iPriceSell;
int iPriceBuy;
int iAmount;
int iWeight;
int iVolume;
int StorageType;
int iStaleFactor;

wMoskauWareList.WareListItemGet(1,&amp;cName[0],&amp;iPriceSell,&amp;iPriceBuy,&amp;iAmount,&amp;iWeight,&amp;iVolume,&amp;iStorageType,&amp;iStaleFactor);
</code></pre>
<p>oder Du definierst Pointer und reservierst den Speicher selber.</p>
<pre><code class="language-cpp">char* cName=new char[WARE_NAME_LENGTH];
int* iPriceSell=new int;
int* iPriceBuy=new int;
int* iAmount=new int;
int* iWeight=new int;
int* iVolume=new int;
int* StorageType=new int;
int* iStaleFactor=new int;

wMoskauWareList.WareListItemGet(1,cName,iPriceSell,iPriceBuy,iAmount,iWeight,iVolume,iStorageType,iStaleFactor);

// mit den Werten arbeiten:
...
// und Speicher wieder freigeben
delete[] cName;
delete iPriceSell;
delete iPriceBuy;
delete iAmount;
delete iWeight;
delete iVolume;
delete iStorageType;
delete iStaleFactor;
</code></pre>
<p>Für cName ist das Ganze noch etwas komplizierter, da du hier zwar einen Zeiger auf einen char übergibst, aber eigentlich ein Array von chars erwartest. Besser und einfacher, wäre die Verwendung von std::string.</p>
<p>Ich habe mich Durch Deinen Code gekämpft, und soweit ich es verstanden habe, scheint die Liste selbst zu funktionieren.</p>
<p>DJohn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1172871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1172871</guid><dc:creator><![CDATA[DJohn]]></dc:creator><pubDate>Sun, 12 Nov 2006 09:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Sun, 12 Nov 2006 10:18:50 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>@Gastfrager:<br />
&quot;Intrusive lists&quot; vertragen sich nicht gut mit OOP.</p>
</blockquote>
<p>war es nicht früher mal so, daß intrusive lists (besonders die doppelt verketteten ringe) mit dicken großen members die stl-listen wegen weniger new/delete plattmachen?<br />
erklär mal und widerlege dich.</p>
<blockquote>
<p>Und wenn du schon mit &quot;intrusive lists&quot; arbeiten willst, dann würde ich dir empfehlen eine Basisklasse &quot;ListNode&quot; zu machen, und eine Klasse &quot;List&quot;, die eben &quot;ListNode&quot; Instanzen &quot;listen&quot; kann. Dann leitest du deine Elemente einfach von &quot;ListNode&quot; ab, und gibst der Klasse die diese Elemente listen soll ein Member &quot;List&quot;.</p>
</blockquote>
<p>oder man fragt sich ganz ganz lange, ob man wirklich vererbung meint, und verlangt dann einfach die members prev und pred. und der benutzer kann wieder über den leckersten member-platz verfügen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1172883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1172883</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 12 Nov 2006 10:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherprobleme beim verwenden einer verketteten Liste on Mon, 13 Nov 2006 05:37:23 GMT]]></title><description><![CDATA[<p>@ DJohn</p>
<p>Danke, bin ja auch ganz schön beschränkt, die &quot;Auffangvariablen&quot; als Pointer zu definieren, und dann keinen Speicherplatz zu reservieren. Vielen Dank, jetzt funktioniert das ganze ohne Probleme - zumindest bis 2000 Objekte (mehr als 100 dürften es allerdings nie werden. !!!! NOCHMALS DANKE !!!! Auch mal wieder ein klassisches Beispiel dafür, dass man bei Problemen erstmal die eigenen Schauklappen abnehmen, und sich den ganzen Code anschauen sollte, bevor man anderen Leuten die Zeit stiehlt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .</p>
<p>Auch danke an die anderen, die sich die Zeit genommen haben.</p>
<p>@ Thomas...</p>
<p>Die Template Idee ist an sich ganz gut, allerdings halte ich es für meinen Lernerfolg sinnvoller erstmal den Umgang mit Objekten richtig zu beherrschen,bevor ich weiter mache.</p>
<p>@ Hustbear</p>
<blockquote>
<p>Und wenn du schon mit &quot;intrusive lists&quot; arbeiten willst, dann würde ich dir empfehlen eine Basisklasse &quot;ListNode&quot; zu machen, und eine Klasse &quot;List&quot;, die eben &quot;ListNode&quot; Instanzen &quot;listen&quot; kann. Dann leitest du deine Elemente einfach von &quot;ListNode&quot; ab, und gibst der Klasse die diese Elemente listen soll ein Member &quot;List&quot;.</p>
</blockquote>
<p>Ich dachte ich hab das schon (in Grundzügen) gemacht (Listnode &lt;=&gt; CWare, List &lt;=&gt; CWareList) ?.<br />
Ich würde auch sehr dankbar sein, wenn du mir sagen könntest, was alles grausig ist (und was auch an der &quot;Benamsung&quot; so schlimm ist) - möchte mich schließlich verbessern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1173351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1173351</guid><dc:creator><![CDATA[Gastfrager]]></dc:creator><pubDate>Mon, 13 Nov 2006 05:37:23 GMT</pubDate></item></channel></rss>