Listenausgabe - Letztes Element macht Probleme



  • hallo, mein Programm speichert alle gefundenen Mp3-Dateien eines Ordners in einer Liste.
    Bei Ausgabe dieser erscheint nach dem letzten Listeneintrag noch ein Element "-".

    Sieht ungefähr so aus:

    index 1 : abc.mp3
    index 2 : bca.mp3
    index 3 : -
    

    habe praktisch konform zum Galileo-Book gearbeitet.

    Lasst euch nicht von meiner C++-Ausgabe irritieren, es geht ja um die Liste und die ist in reinem C.

    hier alle Listenrelevanten Codefragmente:

    --> mmmh seltsamerweise klappt das mit diesem Cpp-Code-Script bei mir nicht richtig, egal was ich mache, dieser Mittelteil wird nicht als Code erkannt??

    Wär sehr löblich, wenn dieses Problem mal jemand fixen könnte. <--

    if (strcmp(&File_Location[/*pDir->d_namlen*/NLength-4],".mp3")==0||
                        strcmp(&File_Location[/*pDir->d_namlen*/NLength-4],".wma")==0){
    
                        strcpy(pMp3_List->Pfad,File_Location);
                        cntA++;
                        cout << pMp3_List->Pfad <<"\n";
    
                        if ( (pMp3_List->Next = (struct Mp3_List *) malloc(sizeof(struct Mp3_List))) == NULL ) {
    
                            fprintf(stderr, "Kein Speicherplatz für weitere MP3-Datei vorhanden!\n");
                            EXIT_FAILURE;
                        }
                        pMp3_List = pMp3_List->Next;
                        z++;
                    }
                }
            }
        }
        pMp3_List = NULL;
        cout <<pMp3_List<<"\n\n";
        cout <<z;
    
        return (struct list*)Anfang;
    }
    
    void Output_Copy(struct Mp3_List){
    
        cout <<"\n";
        cout.fill('#');cout.width(50); cout<<"\n";
        cout <<"\n\tGefundene Audio-Dateien\n\n";
        cout.fill('#');cout.width(50); cout<<"\n";
        cout <<"\n";
    
        int k=0;
    
        pMp3_List = Anfang;
        while (pMp3_List!=NULL){
    
            cout <<"   Index"<<"  "<<k<<"  "<<pMp3_List->Pfad <<endl;
            pMp3_List = pMp3_List->Next;
            k++;
        }
    }
    

    Die Schleife arbeitet auch richtig, es werden 4 Listenelemente erstellt(4 Dateien in diesem Verzeichnis).
    Ganz zum schluss der Funktion wird das zusätzliche 5. Element auf NULL gesetzt.
    Doch aus irgendeinem mir verborgenen Grund wird eben noch dieser '-' mit ausgegeben.

    Merkwürdig ist auch, dass das Programm beim ganz normalen Aufrufen funktioniert.
    Doch wenn ich es stattdessen im Debuger durchlaufen lasse, kommt nach dem letzten Element eine kryptische Zeichenkette und es wird mir ein Segmentation Fault gemeldet.

    Schon mal im Voraus vielen Dank!



  • eins rauf

    Könnte mir bitte jemand weiterhelfen? Erstens mit meinem Problem und 2. warum das mit der Code-Box nicht klappt.

    Danke



  • Hi, das mit der codebox ist eigenartig funkt bei mir mit deinem Quelltext auch nicht 🙄 ....
    versuch doch mal nopaste.de.

    zu deinem andren Problem kann ich leider nicht viel schreiben, davon habe ich noch kein Plan :p
    vlg



  • Cool vielen Dank für den Tipp.

    Also hier die leserliche Variante

    http://nopaste.com/p/ay4qOz1wu



  • Und zwar: Wie schon geschrieben, funktioniert die Ausgabe nicht, aber ich weiß nicht, ob es schon mit dem Einlesen der Dateien in die Liste zu tun hat.
    Habe in meinem Testordner 5 Dateien, 4 mp3 und 1 Bitmap.
    Die Schleife mit der Listenerstellung gleich hier zu Beginn des Codes klappt wunderbar.
    Aber bei der Ausgabe kommt im Debugmodus nach dem letzten Element("Index 3 c:\abc\usw.") eine kurze Folge von kryptischen Zeichen und danach in der nächsten Zeile wieder "Index 5 "
    Und dann kommt eine "Segmentation Fault"-Fehlermeldung.

    Die Ausgabeschleife läuft also noch 2 Mal durch, obwohl die Abbruchbedingung seit dem 3. Element längst erfüllt ist.(Nach der Listenerstellung habe ich das nächstfolgende Element auf NULL gesetzt.)

    Alles sehr misteriös, was kann das sein?

    Vielen Dank

    if ( (pMp3_List->Next = (struct Mp3_List *) malloc(sizeof(struct Mp3_List))) == NULL ) {
    
                            fprintf(stderr, "Kein Speicherplatz für weitere MP3-Datei vorhanden!\n");
                            EXIT_FAILURE;
                        }
                        pMp3_List = pMp3_List->Next;
                        z++;
                    }
                }
            }
        }
        pMp3_List = NULL;
        cout <<pMp3_List<<"\n\n";
        cout <<z;
    
        return (struct list*)Anfang;
    }
    
    void Output_Copy(struct Mp3_List){
    
        cout <<"\n";
        cout.fill('#');cout.width(50); cout<<"\n";
        cout <<"\n\tGefundene Audio-Dateien\n\n";
        cout.fill('#');cout.width(50); cout<<"\n";
        cout <<"\n";
    
        int k=0;
    
        pMp3_List = Anfang;
        while (pMp3_List!=NULL){
    
            cout <<"   Index"<<"  "<<k<<"  "<<pMp3_List->Pfad <<endl;
            pMp3_List = pMp3_List->Next;
            k++;
        }
    }
    


  • kann mir denn keiner helfen?



  • Moin!

    Ich kann in der Ausgabe keinen Fehler finden. Du solltest vielleicht auch in der Eingabe suchen. Ich vermute mal du erstellst da ein Element zu viel.



  • ok, habs hinbekommen, die WhileSchleife muss überprüfen ob pMP3List->Next gleich NULL ist.



  • Dann fragst du also ab, ob ein nächstes Element existiert, um das derzeitige auszugeben? Das letzte Element in der Liste sollte doch den NULL-Zeiger in *next stehen haben, erzeugt aber ein FALSE bei der Abfrage nach *next!=NULL und wird daher nicht ausgegeben.

    Es funktioniert so, aber nur, weil du ein Element zu viel erstellst, was der eigentliche Fehler sein sollte.



  • In meinem Programm läuft das ja folgendermaßen: Ich schreibe ein Element in die Liste pro Zyklus, danach wird gleich wieder Speicherplatz für das nächste Element reserviert.
    So und wenn aber alle Elemente aufgenommen wurden, bekommt der überschüssige Speicher einfach NULL zugewiesen.

    Wie könnt ich das denn sonst anders machen, damit das hinhaut, wie du es beschrieben hast?



  • PlattitüdenAbonennt schrieb:

    In meinem Programm läuft das ja folgendermaßen: Ich schreibe ein Element in die Liste pro Zyklus, danach wird gleich wieder Speicherplatz für das nächste Element reserviert.
    So und wenn aber alle Elemente aufgenommen wurden, bekommt der überschüssige Speicher einfach NULL zugewiesen.

    Wie könnt ich das denn sonst anders machen, damit das hinhaut, wie du es beschrieben hast?

    Du könntest zB genau dann Speicherplatz reservieren, wenn ein auch etwas vorhanden ist, was du in deine Liste eintragen kannst.
    Aber es haut so schon hin, was du da machst. Zumindest rein funktionell.


Anmelden zum Antworten