Warum erwartet C einen Konstantenausdruck in arrays definiert in einer struktur?
-
danke, ich werde das gleich mal versuchen^^
-
Ehm es wäre jetzt etwas komplizierter das mit chars zu machen ... deswegen einmal vereinfachen:
struct song { char* name; unsigned short length; public: song() : name(NULL), length(0) {} song(const char* name, unsigned short playtime) : length(playtime) { this->name = new char[std::strlen(name) + 1]; std::strcpy(this->name, name); } ~song() { delete [] name; } } class album { char* m_name; char* m_artist; song* m_songs; std::size_t m_countSong; public: album(const char* name, const char* artist, std::size_t song_count, char** song_names, unsigned short* song_length) : m_countSong(song_count) { m_name = new char[std::strlen(name) + 1]; std::strcpy(m_name, name); m_artist = new char[std::strlen(artist) + 1]; std::strcpy(m_artist, artist); m_songs = new song[song_count]; for (std::size_t i = 0; i < song_count; ++i) { m_songs[i].length = song_length[i]; m_songs[i].name = new char[std::strlen(song_names[i]) + 1]; std::strcpy(m_songs[i].name, song_names[i]); } } ~album() { delete [] m_name; delete [] m_artist; delete [] m_songs; } };
-
auutsch! das zeigt erst wie primitiv meine lösung ist:
(bin momentan dabei mir c++ selbst beizubringen..
)//------------------------------------------------------------- #include<iostream> #include<conio> #include<stdio> #include <vector> //------------------------------------------------------------- using namespace std; //------------------------------------------------------------- int main() { int i=0; int const j=10; int k=0; int l=0; char buffer[100]; string str; struct Album { char name[100]; char kuenstler[100]; vector<string> songname; int song_no; int jahr; }tamy[j]; cout<<"Bitte Name des Albums eingeben: "; cin>>buffer; strcpy(tamy[i].name, buffer); cout<<"Bitte Name des Kuenstlers eingeben: "; cin>>buffer; strcpy(tamy[i].kuenstler, buffer); cout<<"Bitte Anzahl Songs eingeben: "; cin>>k; while(l<k) { cout<<"Bitte Songname"<<(l+1)<<" angeben: "; cin>>str; tamy[i].songname.push_back(str); //strcpy(tamy[i].songname[k][100], buffer); l++; } tamy[i].song_no=k; cout<<"Bitte das Jahr des Albums eingeben"<<endl; cin>>tamy[i].jahr; clrscr(); cout<<"Folgende Infos zusammengestellt"<<endl; cout<<"Name des Albums: "<<tamy[i].name<<endl; cout<<"Kuenstlername: "<<tamy[i].kuenstler<<endl; cout<<"Anzahl Lieder: "<<tamy[i].song_no<<" alle anzeigen? (j/n)"<<endl; //getch(); if(getch()=='j') { l=0; while(l<k) { cout<<"\tSong"<<(l+1)<<": "<<tamy[i].songname[l]<<endl; l++; } } cout<<"Release-Jahr des Albums: "<<tamy[i].jahr<<endl; getch(); } //------------------------------------------------------------- ausgabe: Folgende Infos zusammengestellt Name des Albums: Techno_Club_Vol_23 Kuenstlername: VA Anzahl Lieder: 2 alle anzeigen? (j/n) Song1: techno_club_vol_23_cd1_mixed_by_talla_2xlc Song2: techno_club_vol_23_cd2_mixed_by_alex_morph_b2b_woody_van_eyden Release-Jahr des Albums: 2007@ Devil könntest du mir eine Zeile deines codes erklären:
album(const char* name, const char* artist, std::size_t song_count, char** song_names, unsigned short* song_length) : m_countSong(song_count)
danke schonmal im voraus
-
Das ist ein Konstruktor samt Initialisierungsliste - und dient dazu, ein neues Objekt kontrolliert anzulegen.
-
Jap ... und hab die Member alle private gemacht, damit keiner auf die Idee kommt meimne saubere Initialisierung zu zerstören
Wobei du an song_names einen C-String-Array übergeben sollst (C-String ^= char-Array) und song_length einen unsigned short-Array. Die müssen natürlich jeweils so groß sein, dass sie song_count C-String bzw. unsigned short-Werte aufnehen und enthalten.
-
danke euch für die ausführliche hilfe soweit

Never send a human to do a machines job
-
(D)Evil, warum verwendest du bei deinem Beispiel nicht einfach std::string?
-
Hmm weil er was von C in der Überschrift stehen hat ... ok Klassen und Objekte usw. sind eh nicht C aber nuja ^^
Für Th:
struct song { std::string name; unsigned short length; public: song(std::string const& str = "", unsigned short playtime = 0) : length(playtime), name(str) {} } class album { std::string m_name; std::string m_artist; std::vector<song> m_songs; public: album(std::string const& name, std::string const& artist, std::vector< std::pair<unsigned short, std::string> > const& songs) : m_name(name), m_artist(artist) { for (std::size_t i = 0; i < songs.size(); ++i) m_songs.push_back(song(songs.second, songs.first)); } };
-
Ja, so sieht das doch schon recht sauber aus -)
-
ich wuerd noch zwei klitzekleine Aenderungen machen:
- Semikolon hinter der struct song Definition
- Das pair im vector im album-Ctor umdrehen:
std::vector <std::pair<std::string, unsigned short> >
Ist einfach "natuerlicher", wenn die Kombi "Songname, Laenge" immer in der gleichen Reihenfolge auftaucht ud nicht mal so, mal so
