Verschachtelte Vectoren auf Elemente zugreifen
-
Hallo Community,
habe mal wieder ein Problem und komme nicht richtig weiter. Vielleicht hat mir jemand einen Tip wo mein Fehler liegt.
Ich habe eine Klasse Messung in der ich verschiedene Berechnungen durchführe und eine Klasse Gesamtmessung in der ich die gesammelten Komponentenklassen in Vektoren ablege.
class CMessung { private: // Irgendwelche Variablen public: CMessung(); // Konstruktor ~CMessung(); // Destruktor // Vector für Werteaufnahme vector <float> Wert; // Werte berechnen void berechneWerte(void); // Maximum Wert aller Messwerte aus Private Bereich auslesen double getMAX(void); };class CGesamtmessung { private: //Irgendwelche Variablen public: CGesamtmessung(); // Konstruktor ~CGesamtmessung(); // Destruktor // Unterklassen für alle Messungen class CMessung Zentralverriegelung[2]; // Datencontainer für alle Messreihen vector <CMessung> Zentralverriegelung_Container0; vector <CMessung> Zentralverriegelung_Container1; };Ich schiebe mir erst in meinen Zentralverriegelung_Container0 zwei mal die Klasse Messung Zentralverriegelung[0].
for(int schalter=0;schalter <=1;schalter++) { // Vector Zentralverriegelung in Container schieben Messung->Zentralverriegelung_Container0.push_back(Messung->Zentralverriegelung[0]); }Und nun möchte ich den Messwert reinschieben, aber irgendwie schiebt er mir den Messwert wohl nicht in die Klasse Messung->Zentralverriegelung[0] sondern in meinen Zentralverriegelung_Container0.
for(int schalter=0; schalter<=1; schalter++) { // Messwertcontainer in Zentralverriegelungcontainer mit Werten füllen Messung->Zentralverriegelung_Container0.at(schalter).Wert.push_back(FSH3.read()); }Ich habe nun auch schon so etwas probiert
Messung->Zentralverriegelung_Container0.at(schalter).operator =(Messung->Zentralverriegelung[0]).Wert.push_back(FSH3.read());Das Ergebnis ist das selbe. Wie kann ich denn den Vector der Klasse Messung im ContainerVector ansprechen?
-
Ich glaube, du hast ein Verständnisproblem bzgl. der Datenstrukturen.
Es ist unsinnig, daß du einmal ein Array und dann wiederum einen std::vector von Messungen anlegst.
Und so wie du deinen Code geschrieben hast, ist es ja auch richtig, daß er nur die Daten in den std::vector hineinschreibt und nicht in das Array.
Du solltest außerdem die Daten von der Klasse Messung (d.h. std::vector<float> Wert) nicht öffentlich machen, sondern auch dafür geeignete Zugriffsfunktionen (lesen und schreiben) definieren.
Und warum hast du zwei Container (0 und 1)?
-
Ich möchte ein Frequenzband scannen, am Beispiel von FM (Radio) ist es leichter zu erklären:
Mein Frequenzband hat ein Spektrum von 88 MHz bis 108 MHz. dieses durchlaufe ich in 0.1 MHz Schritten also 200 verschiedene Frequenzen. Jede dieser Frequenzen möchte ich 15 mal Messen und daraus sollen verschiedene Dinge berechnet werden.Mein Aufbau der Klassen war nun:
CMessung hat einen Vector Wert für eine Frequenz z.B. 88 MHz, die ich dann 15 mal messe. Diese Werte liegen im Vector Wert. Danach schiebe ich die ganze Klasse in die GesamtMessung, damit ich die Werte der einzelnen Frequenzen miteinander vergleichen kann.
Darum habe ich diese Verschachtelung. Ich habe bei Zentralverriegelung zwei verschiedene Frequenzbänder die nicht hintereinander liegen und desshalb habe ich da zwei Container angelegt.
Aber wo mein Fehler liegt, weiß ich immer noch nicht.
-
Hallo,
Ich verstehe weder dein Problem noch deinen Ansatz. Könntest du das evtl. nochmal ausführlicher erläutern.
Nur noch ein Hinweis. push_back kopiert die Elemente.
-
Ok, habe nun einen Fehler entdeckt und das ganze mal umgestrickt.
Ich habe in drei verschiedenen Klassen die Funktionen erledigt, die eigentlich eine Klasse machen sollte. Das kommt von den ständigen Änderungen.
Mein neuer Aufbau der Klasse hat einiges an Arbeit gekostet und ich programmiere noch um.
Wie ist diese Lösung:
Klasse CKomponenten |--Klasse CMessContainer[2] (mit vector <vector <CMessung> > Messung;) verschachteltem Vector |--Klasse CMessung (mit vector <float> Wert)Komponente->RADIO.Container[0].Messung[schalter][0].Wert.push_back(Messgeraet.read());Sieht etwas verworren aus, aber die Anforderungen haben sich, bei jedem Testlauf geändert.
Es soll ein Frequenzband abgescannt werden. Bsp 88 bis 108 MHz. Die Schrittweite ist eingestellt auf 0.1 MHz, macht also (108 MHz - 88 MHz) / 0.1 MHz = 200 Messwerte.
Jeder dieser Messwerte soll mehrfach (10 mal) gemessen werden = 2000 Messwerte in foat Werten.Da aber die Schrittweite und die Messanzahl variabel einstellbar ist, ebenso wie die größe der Bandbreite die gemessen werden soll, versuche ich das ganze mit Vectoren zu lösen.
Nun kam als weiterer Punkt hinzu, dass der ermittelte Pegel einmal bei ausgeschaltetem Frequenzgenerator und einmal mit eingeschaltetem Frequenzgenerator gemessen werden soll.
Damit erhöht sich meine Anzahl an Werten auf 4000 bei der Radio FM Prüfung.
Da aber der eingeschaltete und der ausgeschaltete Zustand anschließend miteinander verglichen werden sollen und das über jeden Messschritt habe ich mir als Lösung überlegt:
Ich Frage über eine Gesamtklasse die Komponente ab. Wähle den MessContainer nach Anzahl der Messchritte. Habe dann den verschachtelten vector um zwischen Gerät ein oder aus zu wählen und kann dann in der Zweiten Dimension des Vectors über den Vector Wert die 10 Messungen abgreifen, bzw. speichern.
Soweit der Aufbau. Nur habe ich nun noch eine Frage zum verschachtelten Vector:
Augenblicklich mache ich sowas um den Vector zu löschen:
for(unsigned int i=0; i<Komponente->RADIO.Container[0].Messung.size(); i++) { // Schleife durch Anzahl Messschritte for(unsigned int j=0; j<Komponente->RADIO.Container[0].Messung[i].size(); j++) { // Messwerte löschen Komponente->RADIO.Container[0].Messung[i][j].Wert.clear(); } // Container Anzahl Messschritte löschen Komponente->RADIO.Container[0].Messung[i].clear(); } // Container RADIO löschen Komponente->RADIO.Container[0].Messung.clear();Muss ich das so umständlich machen oder langt es einfach die erste Dimension des Vectors zu löschen also so:
Komponente->RADIO.Container[0].Messung.clear();Was mir nämich dabei aufgefallen ist, ist, dass ich nun im voraus dem geschachtelten Vector sagen muß, wieviele Ebenen er hat. Also sowas wie die nächste Zeile, damit ich ihm nacher mit push_back die Werte geben kann. Wenn ich das nicht mache bringt er mir als Meldung, dass ich versuche Werte in einen nicht angelegten Bereich zu schieben.
Komponente->RADIO.Container[0].Messung.resize(2);
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.