Linkedlist gcc-4



  • Habe mir deinen Code nicht komplett angeschaut (bitte Code Tags verwenden!), aber wie stellst du denn sicher, dass ptr ungleich NULL ist bei ptr->next?



  • groovemaster schrieb:

    Habe mir deinen Code nicht komplett angeschaut (bitte Code Tags verwenden!), aber wie stellst du denn sicher, dass ptr ungleich NULL ist bei ptr->next?

    while(ptr->next)...



  • Damit prüfst du nur, ob ptr->next ungleich NULL ist. Aber wie ich bereits schrieb, was ist mit ptr?



  • if (!ibag->head) { 
    ibag->head = new; 
    return; 
    } 
    
    ptr = ibag->head; 
    while (ptr->next)
    

    ptr muss != NULL sein, sonst würde der schon bei if (!ibag->head) rausspringen. Ka, wo der Fehler ist, wobei ich ohne Codetags eh keinen Code angucke ... Nimm gdb und debugge.



  • Nein, ich meinte vielmehr _in_ der Schleife. Schau mal

    while (ptr->next)
        ptr = ptr->next;
    

    Du kannst ja nicht ausschliessen, eher musst du damit rechnen, dass ptr _in_ der Schleife irgendwann NULL zugewiesen bekommt. Beim nächsten Durchlauf wird im Kopf ptr->next geprüft...und BOOM!



  • Oh, du hast natürlich vollkommen recht. Darauf habe ich garnicht geachtet. Normal macht man ja auch "while(ptr) ptr = ptr->next;"



  • Hmmm...hab's mir noch mal angeschaut, an der Schleife kann's doch nicht liegen. ptr kann nicht NULL werden, da dies ja die Bedingung für die Schleife ist. Etwas verwirrend die Vorgehensweise. Bedingung ist also nur, dass ptr zu Beginn ungleich NULL ist, was der Fall ist. Insofern scheint der Code korrekt zu sein und ein Debugger könnte wohl etwas mehr Licht ins Dunkel bringen.



  • @ mason: Bitte bearbeite deinen Originalbeitrag und benutze die [cpp]-Tags (und natürlich sauber formatierten Code). Das hilft den anderen dir zu helfen.



  • groovemaster schrieb:

    Hmmm...hab's mir noch mal angeschaut, an der Schleife kann's doch nicht liegen. ptr kann nicht NULL werden, da dies ja die Bedingung für die Schleife ist. Etwas verwirrend die Vorgehensweise. Bedingung ist also nur, dass ptr zu Beginn ungleich NULL ist, was der Fall ist. Insofern scheint der Code korrekt zu sein und ein Debugger könnte wohl etwas mehr Licht ins Dunkel bringen.

    Und wiedermal hast du recht. Vielleicht sollte ich mir den Code doch länger als 30 Sekunden angucken, bevor ich poste. Also ich habe keine Ahnung, warum es crasht. Probier mal while(ptr) ptr = ptr->next; wobei es an der Schleife nicht liegen dürfte. Wenns dann immer noch crasht, gdb oder valgrind benutzen.

    Vielleicht liegt das Problem auch ganz woanders und irgendwo gibts nen Bug und der Segfault in der Schleife ist ein Folgefehler.



  • danke für die zahlreichen antworten.

    wie gesagt gdb hab ich schon benutzt und es crasht eindeutig bei

    while(ptr->next).

    mfg



  • Dann probier mal valgrind aus oder poste deinen kompletten Quelltext, aber soweit reduziert, dass das Problem noch auftaucht. Vielleicht ist da irgendwo ein Fehler.

    while(ptr->next)
    ptr = ptr->next;

    ist auf jeden Fall richtig.



  • mason schrieb:

    wie gesagt gdb hab ich schon benutzt und es crasht eindeutig bei

    while(ptr->next).

    Welchen Wert hat denn ptr? Ist das ein gültiger Adresswert? Crashen kann es eigentlich nur, wenn ptr gleich NULL ist (was aber, wie gesagt, eigentlich nicht sein kann), oder wenn es eine Adresse ist, die irgendwo ins Nirvana zeigt. Kannst ja auch mal das Assembler Listing der betreffenden Stelle hier posten. War afair Compilerflag -S.



  • groovemaster schrieb:

    Crashen kann es eigentlich nur, wenn ptr gleich NULL ist...

    es kann auch crashen, wenn 'ptr' irgendeinen verrückten wert hat. eine adresse z.b. die nicht existiert (für die der memory manager dem prozess keinen speicher zugeordnet hat)...



  • net schrieb:

    groovemaster schrieb:

    Crashen kann es eigentlich nur, wenn ptr gleich NULL ist...

    es kann auch crashen, wenn 'ptr' irgendeinen verrückten wert hat. eine adresse z.b. die nicht existiert (für die der memory manager dem prozess keinen speicher zugeordnet hat)...

    groovemaster schrieb:

    ... oder wenn es eine Adresse ist, die irgendwo ins Nirvana zeigt.

    😉



  • TactX schrieb:

    net schrieb:

    groovemaster schrieb:

    Crashen kann es eigentlich nur, wenn ptr gleich NULL ist...

    es kann auch crashen, wenn 'ptr' irgendeinen verrückten wert hat. eine adresse z.b. die nicht existiert (für die der memory manager dem prozess keinen speicher zugeordnet hat)...

    groovemaster schrieb:

    ... oder wenn es eine Adresse ist, die irgendwo ins Nirvana zeigt.

    😉

    naja, hab mal wieder nur die ersten paar wörter gelesen 😞



  • Hallo!

    Falls es noch jemanden interssiert. Ich habe das prog jetzt komplett umstrukturiert. Die Task Struktur als reine Datenstruktur und die Liste in einer extra Struktur, die als einziges Datenelement eine Task Instanz hält.

    Als Liste verwende ich die list Implementirung vom Linux project. Die gilt ja als gut getestet.

    gcc-4 bringt mir jetzt bei list_add_tail sein Segfault.
    Scheint meiner Meinung nacht also am Compiler zu liegen. Verwende den CRUX gcc-4.0.3 Port.
    Vielleicht kann mir jemand sagen woran, dass liegen könnte!

    mfg



  • mason schrieb:

    Vielleicht kann mir jemand sagen woran, dass liegen könnte!

    ich glaub es ist besser wenn du mit 'nem debugger im einzelschritt da durchgehst, variablen und pointer anguckst (also wo die hinzeigen usw.). bestimmt haste irgendwas entscheidendes vergessen...


Anmelden zum Antworten