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:

    1. Semikolon hinter der struct song Definition
    2. 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 😉


Anmelden zum Antworten