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: +íBwas 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!