Wo liegt mein Fehler?



  • Hi,

    ich habe einen Fehler, aber ich weis nicht, wo er liegt.
    Hier der Code:

    printf("Genre (zur Anzeige der Genre-Liste 0 eingeben): ***");
        for (i = 0; i<3; i++)
            printf("\b"); // 3 Zeichen zurückgehen
        scanf("%d", &i_genre);// Return abfangen
    
        if(i_genre != 0) // Falls bei Genrewahl nicht 0 gewählt wurde
            mp3.sz_genre[0] = (char)i_genre;
        else
        {
            for (i =1; i<=115; i++)
            {
                if (i%2!=0) // falls i Gerade
                {
                    i_zeichenzahl = 0;
                    while(genre_liste(i)[i_zeichenzahl]!= '\0')
                        i_zeichenzahl++; // Zeichenzahl des Genres ermitellnn
                    printf("\n%d: %s", i, genre_liste(i)); //ausgabe des Genres
                }
                else
                { // Dient zur formatierten Ausgabe der Genre-Liste
                    if (i_zeichenzahl <=4 && i <= 10)
                        printf("\t\t\t\t%d: %s", i, genre_liste(i));
                    else if (i_zeichenzahl <=3 && i > 10)
                        printf("\t\t\t\t%d: %s", i, genre_liste(i));
                    else if (i_zeichenzahl >= 13)
                        printf("\t\t%d: %s", i, genre_liste(i));
                    else
                        printf("\t\t\t%d: %s", i, genre_liste(i));
                }
            }
                printf("\n\nGenre: ***");
                for (i = 0; i<3; i++)
                    printf("\b"); // 3 Zeichen zurückgehen
                scanf("%d", &i_genre);// nun das Genre nochmal als Zahlenwert abfragen...
                mp3.sz_genre[0] = (char)i_genre;//... und als ASCII-Wert in die Struktur eintragen
        }
    

    und die Funktion char *genre_liste

    char *genre_liste(int i_genrenr)
    {
        char liste[115][40]={ // 2 Dim Array mit 115 Elementen zu je 40 Zeichen
    "Blues",
    "Classic Rock",
    "Country",
    "Dance",
    "Disco",
    "Funk",
    "Grunge",
    "Hip-Hop",
    "Jazz",
    "Metal",
    "New Age",
    "Oldies",
    "Other",
    "Pop",
    "R&B",
    "Rap",
    "Reggae",
    "Rock",
    "Techno",
    "Industrial",
    "Alternative",
    "Ska",
    "Dath Metal",
    "Pranks",
    "Soundtrack",
    "Euro-Techno",
    "Ambient",
    "Trip-Hop",
    "Vocal",
    "Jazz+Funk",
    "Fusion",
    "Trance",
    "Classical",
    "Instrumental",
    "Acid",
    "House",
    "Game",
    "Sound Clip",
    "Gospel",
    "Noise",
    "Alternative Rock",
    "Bass",
    "Punk",
    "Space",
    "Meditative",
    "Instrumental Pop",
    "Instrumental Rock",
    "Ethnic",
    "Gothic",
    "Darkwave",
    "Techno-Industrial",
    "Electronic",
    "Pop-Folk",
    "Eurodance",
    "Dream",
    "Southern Rock",
    "Comedy",
    "Cult",
    "Gangsta",
    "Top 40",
    "Christian Rap",
    "Pop/Funk",
    "Jungle",
    "Native US",
    "Cabaret",
    "New Wave",
    "Psychadelic",
    "Rave",
    "Showtunes",
    "Trailer",
    "Lo-Fi",
    "Tribal",
    "Acid Punk",
    "Acid Jazz",
    "Polka",
    "Retro",
    "Musical",
    "Rock & Roll",
    "Hard Rock",
    "Folk",
    "Folk-Rock",
    "National Folk",
    "Swing",
    "Fast Fusion",
    "Bebob",
    "Latin",
    "Revival",
    "Celtic",
    "Bluegrass",
    "Avantgarde",
    "Gothic Rock",
    "Progressive Rock",
    "Psychedelic Rock",
    "Symphonic Rock",
    "Slow Rock",
    "Big Band",
    "Chorus",
    "Easy Listening",
    "Acoustic 100 - Humour",
    "Speech",
    "Chanson",
    "Opera",
    "Chamber Music",
    "Sonata",
    "Symphony",
    "Booty Bass",
    "Primus",
    "Porn Groove",
    "Satire",
    "Slow Jam",
    "Club",
    "Tango",
    "Samba",
    "Folklor"
    "----------"
    };
    if (i_genrenr <= 115) //Falls der Übergebene wert kleiner gleich als 115
        return liste[i_genrenr-1]; // Wert aus liste rückgeben, i_genrenr-1, weil Zählbeginn bei 0
    
    else
        return 0;
    }
    

    wenn ich nun mit 0 die Liste ausgebe, geht es nur bis zu 95: Slow Rock gut, danach sieht das ganze so aus:

    95: Slow Rock 96: Big
    97:÷↕ 98: Easy Lis
    99: 100: Speech
    101: Chanson 102: Opera
    103: Chamber Music 104: Sonata
    105: Symphony 106: Booty Bass
    107: Primus 108: Porn Groove
    109: Satire 110: Slow Jam
    111: Club 112: Tango
    113: Samba 114:
    115: +íB

    was ist falsch?

    mfg

    Bernd



  • Falsch ist, dass Du einen Zeiger auf eine lokale Variable zurückgibst. Das Array liste wird nach Beendigung der Funktion genre_liste freigegeben, damit ist der Zeiger, den die Funktion zurückgibt, ungültig. Was danach mit dem Speicher passiert, siehst Du ja.

    Zeiger oder Referenzen von lokalen Variablen zurückzugeben ist böse 😉



  • du solltest deinen code da etwas umbauen, notfalls musst du speicher vorm funktionsaufruf reservieren und einen zeiger mitübergeben, damit die funktion weiß, wo sie hinschrieben darf.
    momentan machst dus so: reservierst speicher in der funktion - gibst einen zeiger auf einen speicherbereich innerhalb des reservierten bereichs zurück - gibts speicher wieder frei - liest vom freigegebenen speicher -> crash!


Anmelden zum Antworten