Datenorganisation, structs, arrays....



  • Moin,
    hab da ein Problem und irgendwie, naja, weiss selber net so genau 😉
    Also, hab einen Datensatz bestehend aus mehreren Daten die ich zusammenfassen will, also beispielsweise vereinfacht gesagt:

    char name[21];
    float nr;

    Dies bräuchte ich mehrdimensional (drei Dimensionen) dargestellt (quasi Karteikartensystem), nur weiss ich nicht wie ich das unter c++ am "saubersten" mache....

    Man kann es natürlich in einen struct packen, diesen dann in einen array und das nochmal in einen array um so die gewünschte Dreidimensionalität zu erzeugen, aber geht das auch einfacher oder sauberer?

    irgendwie steh ich mit struct unter c++ eh auf dem Kriegsfuss was das verarbeiten von strings darin angeht... die zuweisung von Zahlwerten scheint direkt zu gehen, die von strings net... *grummel*



  • Hi,

    dein Problem hat gar nichts mit structs zu tun, char[] lässt sich nun einmal nicht via = zuweisen, da es sich hierbei um einen Zeiger auf einen char handelt, wenn du den veränderst, kopierst du nichts.
    strcpy ist für das Kopieren von char* da, in C++ nutzt man aber eigentlich immer std::string (Inkludieren von <string> nötig), wo auch der Operator = überladen ist.

    Dann frage ich dich mal, wozu du die Strukturinstanzen 3D benötigst...

    MfG Eisflamme 🙂



  • Die structs waren in C. in C++ gibt es nur noch objects. Damit lässt sich viel mehr machen und aber auch das gleiche wie mit structs.
    In einem Objekt kannst du auch die Daten name und nr zusammenfassen und dann in der main oder sonstwo mehrere Instanzen von dem Objekt anlegen.

    Eine genauere Fragestellung wäre wünschenswert! 😉



  • hmmm, naja, ist immer etwas schwer zu fragen wenn man selber nicht genau weiss wie man was machen soll 😉

    Also, ich versuchs mal so:
    Ich habe ein Person die ist folgendermassen aufgebaut:

    char vorname[21];
    char nachname[21];
    int punkte;
    int gruppe;

    sooo, diesen würd ich nun in einen struct packen um alle Daten beisammen zu haben... dieser Struct kommt nun in einen array, diesen sortier ich dann nach den Punkten. Somit hab ich dann einen sortierten array meiner Personendaten.
    Wozu nun die dritte Dimension? Nun, bevor ich den array nach Punkten sortiere hätte ich gern den gruppenwert anders aufgebaut, also nicht als einzelne Variabel sondern als array: gruppe[0] ist also gruppe 1 etc.
    dadurch würde sich dann folgender Aufbau ergeben:
    struct Person
    die wiederum steht im array
    platzierung[]
    welcher wiederum im array
    gruppe[]
    steht...
    hoffe ich hab das einigermassen verständlich rübergebracht, bin selber nun ein bissl verwirrt 😉
    aber dadurch kann ich dann schauen wer in welcher Gruppe auf welchem Platz steht wenn ich das richtig durchdacht hab... is nur wieder um ein paar Ecken so wie ich das sehe.....

    das mit object und klassen weiss ich soweit, doch wäre es sinnvoll für jeden einzelnen Teilnehmer ein objekt zu generieren? Ich brauch ja nicht die Funktionalität von Klassen sondern einfach eine Methode um die Daten zusammenzufassen....



  • jede gruppe könnte ein objekt sein.
    in diesem objekt gibt es dann die personen-objekte.
    die personenklasse könnte dann ungefähr so aussehen:

    class Person
    {
        private:
            char name[21];
            int punkte;
            int rang;
        public:
            void SetRang(int r) { rang = r; }
            int  GetPunkte() { return punkte; }
    };
    

    mit den methoden kannst du dann von jeder person den punktestand erfragen und entsprechend ihr einen rang zuweisen.
    wie du die personen ordnest, ist ein anderes problem. dazu müsste in der FAQ genügend stehen.

    in c++ sollte möglichst alles in objekten sein!



  • Die structs waren in C. in C++ gibt es nur noch objects. Damit lässt sich viel mehr machen und aber auch das gleiche wie mit structs.
    In einem Objekt kannst du auch die Daten name und nr zusammenfassen und dann in der main oder sonstwo mehrere Instanzen von dem Objekt anlegen.

    Quark.

    struct ist beinahe synonym zu class zu gebrauchen. Es sind nur alle Elemente standardmäßig öffentlich und es wird auch standardmäßig öffentlich geerbt.
    Meißt wrd struct beim beschreiben von PODs und Funktoren eingesetzt.

    die personenklasse könnte dann ungefähr so aussehen:

    statt char[21] würde ich dann doch zu std::string raten, da der Fragesteller doch mit char-Zeigern und -Feldern Probleme zu haben scheint. Dann fehlt in deinem Beispiel irgendwie ein vernüpftiger C'tor.
    Außerdem solltest du vielleicht auch einen passenden kleiner als Operator definieren, da die Daten ja sortiert werden sollen.

    bool operator < (Person const & lhs, Person const & rhs)
    {
       return lhs.getRang() < rhs.getRang();
    }
    

    Anosnten:

    vector<set<Person> > personenliste;
    

    So hast du eine Liste, in die du deine Gruppen Packen kannst. Jede Gruppe ist als set definert, also in aufsteigender Reihenfolge sortiert.



  • Helium schrieb:

    Die structs waren in C. in C++ gibt es nur noch objects. Damit lässt sich viel mehr machen und aber auch das gleiche wie mit structs.
    In einem Objekt kannst du auch die Daten name und nr zusammenfassen und dann in der main oder sonstwo mehrere Instanzen von dem Objekt anlegen.

    Quark.

    struct ist beinahe synonym zu class zu gebrauchen. Es sind nur alle Elemente standardmäßig öffentlich und es wird auch standardmäßig öffentlich geerbt.
    Meißt wrd struct beim beschreiben von PODs und Funktoren eingesetzt.

    das sagte er doch, in c++ wird nichmehr großartig zwischen strukturen und klassen unterschieden->objekt



  • Er sagt:

    Die structs waren in C. [...] Damit lässt sich viel mehr machen [...] wie mit structs.

    Mal davon abgesehen, was es als und nicht wie heißt ist die Aussage Quatsch.



  • Helium schrieb:

    Mal davon abgesehen, was es als und nicht wie heißt ist die Aussage Quatsch.

    Bei ersterem muss ich dir zustimmen. Kann mal passieren.
    Aber warum kann man mit Strukturen mehr machen als mit Klassen? 😕



  • Aber warum kann man mit Strukturen mehr machen als mit Klassen?

    Kann man nicht. Aber man kann mit Klasse auch nicht mehr machen, als mit Strukturen. Die Möglichkeiten sind exakt die selben.



  • Member-Methoden?
    Vererbung?



  • Praktikant schrieb:

    Member-Methoden?
    Vererbung?

    was soll damit sein? du kannst jeder Klasse das wörtchen class durch struct ersetzen und der Compiler wird sich nicht beschweren



  • schon, aber nur wenn in der class keine Methoden drinstehen.



  • Praktikant schrieb:

    schon, aber nur wenn in der class keine Methoden drinstehen.

    Dann ist folgender Code nicht legal?

    template<typename T>
    struct Foo
    {
    private:
      T t;
    public:
      virtual void foo() const = 0;
    };
    

    😕



  • von templates und virtuellen methoden habe ich leider noch keine ahnung. aber schon erschreckend, was der visual c++ compiler alles zulässt!

    #include <iostream>
    using namespace std;
    
    struct Foo 
    { 
    	private: 
    		int t; 
    	public: 
    		void foo() { t = 0; }
    		int getT() { return t; }
    };
    
    int main()
    {
    	Foo f;
    	f.foo();
    	cout << f.getT() << endl;
    
    	int i;
    	cin >> i;
    	return 0;
    }
    

    ich dachte, das geht nicht mit structs. so kann man sich täuschen.
    bzw: vertraue nie dem, was dir professoren sagen! 😉



  • Structs sind in C++ wie Klassen, nur das ihr Default public ist,
    bei Klassen ist dies private.

    Devil



  • Praktikant schrieb:

    bzw: vertraue nie dem, was dir professoren sagen! 😉

    btw: vertraue dem, was dir Helium sagt! 😉



  • Danke 🙂


Anmelden zum Antworten