Empfehlung für Datenstruktur
-
Hallo Leute!
Ich verfolge die Absicht, meine gut 10 Jahre brach liegenden C++ Kenntnisse aufzuarbeiten, mit der Absicht, diesmal am Ball zu bleiben. Dafür wählte ich mir ein Projekt mit potentiell praktischem Wert: Mein ScaleGenerator soll vorerst nach Benennung eines Grundtones und eines Skalentyps die dazugehörigen Noten ausspucken. Macht er auch

Jetzt wäre der nächste Schritt, die Nutzdaten in einer Textdatei abzulegen bzw. aus einer solchen zu holen. Daten heisst:
unsigned int - für Noten gesamt pro Skala (ich nehme die Oktave mit rein - also meist der Wert

string - bezeichnet den Skalentyp
unsigned int[8] - bildet die Intervallstruktur der Skala ab (in sog. Halbtonschritten)Testweise habe ich sie in einer Datei wie folgt abgelegt:
8,Ionisch,0,2,4,5,7,9,11,12 8,Dorisch,0,2,3,5,7,9,10,12 8,Phrygisch,0,1,3,5,7,8,10,12 8,Lydisch,0,2,4,6,7,9,11,12 8,Mixolydisch,0,2,4,5,7,9,10,12 8,Aeolisch,0,2,3,5,7,8,10,12 8,Lokrisch,0,1,3,5,6,8,10,12Eine Skala ist hierbei ein Objekt. Die Klasse Scale:
class Scale { public: Scale(); Scale (unsigned int notesTotal); //bei zB. Pentatonik wird '5' übergeben void setRoot(std::string root); void setType(std::string type); void setiValStruc(unsigned int arr[]); void setScaleNotes(std::string note); bool checkNotesTotal (unsigned int comp); std::string getType(); std::string getRoot(); void getiValStruc(unsigned int arr[]); void getScaleNotes(std::vector<std::string>& tempVector); unsigned int getNotesTotal(); private: std::string type; // Bezeicher - hier: 'Aeolisch' std::string root; // Grundton - hier: E unsigned int iValStruc[8]; // im Fall von E Aeolisch (Moll) '0,2,3,5,7,8,10,12' unsigned int notesTotal; // hat keinen 'Setter' - nur zur Überprüfung vector<std::string> notes; // hier 'E,F#,G,A,B,C,D,E' };Getter, Setter und Konstruktoren funtzen. Bevor ich mich jetzt allerdings in irgendeinen Lösungsweg betr. des Handlings der Nutzdaten verbeisse, möchte ich Euch Leute aus der Praxis fragen, wie ich sie am besten ablege und welche Trennzeichen und Methoden des - sagt man dazu schon Parsen? - Auswertens damit verbunden sind. Eher Zeilen- oder Zeichenweise, getline oder doch fgets? Ich kann es halt nicht einschätzen.
Ist ein Privat/Freizeitprojekt - soll heissen: nicht ultra dringend. Ich werde solange dass Feld der 'Offsetproblematik' beackern - es läuft momentan nur mit C Dur fehlerfrei

Grüße von
Forest
-
ForestThumb schrieb:
Getter, Setter und Konstruktoren funtzen.
Implementiere nur das, was du wirklich brauchst. Mit Getter/Setter um sich zu werfen ist nicht gut. Nicht jedes Attribut braucht Getter+Setter. Manche brauchen gar nichts. Manche brauchen nur Getter oder nur Setter.
ForestThumb schrieb:
wie ich sie am besten ablege und welche Trennzeichen und Methoden des - sagt man dazu schon Parsen? - Auswertens damit verbunden sind.
Das beste was du machen kannst, ist ein Whitespace (Leerzeichen, Tab, Zeilenumbruch, Kombinationen davon) als Trennzeichen zu nutzen. Wieso? Ganz einfach. Der
extraction operator >>ignoriert (lesen+verwerfen) führende Whitespace. Somit musst du die Trennzeichen nichst selbst aussortieren.ForestThumb schrieb:
Eher Zeilen- oder Zeichenweise, getline oder doch fgets? Ich kann es halt nicht einschätzen.
fgets? Hab ich nocht nie gebraucht. Zeilenweise lesen tu ich fast nie. Meist hast du ja verschiedene Datentypen, wie hier (Ganzzahlen, string, eventuell mal eine Fließkommazahl). Würdest du nun Zeilenweise lesen, müsstest du die Zeile nach dem Lesen zerhacken, um an die einzelnen Werte für die entsprechenden Datentypen zu kommen. Meist führt das zuifstream ==> getline ==> sstream >> Ergebnis. Das ist natürlich Schwachsinn. Es gilt:sstreamnicht missbrauchen, sondern gleich richtig (entsprechend der Datentypen) lesen:ifstream ==> Ergebnis
Die allgemeine Vorgehensweise ist dafür:// 1. Definiere deine Klasse // 2. Überlade den operator>> so, dass du einfach eine Instanz deiner Klasse einlesen kannst. // 3. In der main-Funktion brauchst du dann nur noch eine einfache for-Schleife.
-
Noch ein Tipp: die Getter sollten mit 'const' deklariert werden, z.B.
std::string getType() const;Stichwort: const-correctness
-
out schrieb:
ifstream ==> getline ==> sstream >> ErgebnisDas Teil heißt mittlerweile stringstream.
-
Erstmal danke ich für die Hinweise, deren Wert ich jetzt noch gar nicht einschätzen kann, weil ich in OOP Denke noch einiges nachzuholen habe. Aber ich werde Stichworte recherchieren, lesen und dann inhaltlich antworten und sicherlich fragen

-
Nathan schrieb:
out schrieb:
ifstream ==> getline ==> sstream >> ErgebnisDas Teil heißt mittlerweile stringstream.
Ich meinte damit auch den Header. :p