Messwerte in Klasse aufnehmen und als Vektor speichern
-
rudpower schrieb:
warum ein struct und kleine Klasse?
Was für einen Unterschied würde das denn deiner Meinung nach machen?
Struct und Class sind fast das gleiche, der einzige Unterschied ist die Defaultsichtbarkeit der Elemente (public bei struct, private bei class).
-
ok, hab mal die Daten in eine header geschrieben:
#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #ifndef MessdatenH #define MessdatenH //--------------------------------------------------------------------------- struct Messwerte { double temperatur; double pHWert; double fuellstand; double drehzahl; double ch4Gehalt; double co2Gehalt; double o2Gehalt; double h2sGehalt; double redox; double leitwert; double durchfluss; }; #endifwie initialisier ich alle daten am schlausten mit 0.0?
nun zum programm. dort sollen die Daten in einen vektor geschrieben werden.also vector<Messwerte> batch1;korrekt?
-
rudpower schrieb:
wie initialisier ich alle daten am schlausten mit 0.0?
nun zum programm. dort sollen die Daten in einen vektor geschrieben werden.also vector<Messwerte> batch1;korrekt?
Für die Initialisierung benutzt du am besten den Konstrutkor, genauer gesagt die Initialisierungsliste.
Für das speichern der Daten kannst du so einen vector nehemen ja.
-
Wenn immer 100%ig sicher ist, dass deine Struktur nur PODs enthält, kannst du sie mit dem Makro ZeroMemory mit 0 füllen. Die sauberere Lösung ist allerdings einen Konstruktor zu implementieren, der per initializer-list alle member mit 0 besetzt.
-
was sind PODs? Zero Memory kenn ich leider nicht.
Ein Konstruktor bei struct, kenn ich sonst nur bei Klassen. Wie wendet man den an?
-
Genauso wie bei Klassen. Keinerlei Unterschied in der Hinsicht. Bei einer Klasse ist nur alles private und einem struct alles public (außer man ändert es).
-
also
Messwerte(temperatur = 0.0d, pHWert = 0.0d, tsGehalt = 0.0d /*usw...*/);?
-
grad gelesen, dass eine konstruktorliste besser ist.
Hier meine Headerdatei:#ifndef MessdatenH #define MessdatenH //--------------------------------------------------------------------------- struct Messdaten { double temperatur; double pHWert; double tsGehalt; double fuellstand; double drehzahl; double ch4Gehalt; double co2Gehalt; double o2Gehalt; double h2sGehalt; double redox; double leitwert; double durchfluss; Messdaten() : temperatur(0.0), pHWert(0.0), tsGehalt(0.0), fuellstand(0.0), drehzahl(0.0), ch4Gehalt(0.0), co2Gehalt(0.0), o2Gehalt(0.0), h2sGehalt(0.0), redox(0.0), leitwert(0.0), durchfluss(0.0), }; #endifIn der Cpp steht doch:
#include <vcl.h> #pragma hdrstop #include "Messdaten.h" //--------------------------------------------------------------------------- #pragma package(smart_init) Messdaten::Messdaten() : temperatur(0.0), pHWert(0.0), tsGehalt(0.0), fuellstand(0.0), drehzahl(0.0), ch4Gehalt(0.0), co2Gehalt(0.0), o2Gehalt(0.0), h2sGehalt(0.0), redox(0.0), leitwert(0.0), durchfluss(0.0) { }oder? ist bis hier alles richtig?
-
ich merke grad das, die Aufteilung in header- und cpp-Datei so nicht funktioniert.
-
Das:
: temperatur(0.0), pHWert(0.0), tsGehalt(0.0), fuellstand(0.0), drehzahl(0.0), ch4Gehalt(0.0), co2Gehalt(0.0), o2Gehalt(0.0), h2sGehalt(0.0), redox(0.0), leitwert(0.0), durchfluss(0.0),hat im Header nichts zu suchen, wenn du den Konstruktor in der Source-Datei hast.
Und in der Source-Datei muss stehen Messdaten::Messdaten
-
ok, das hat ich grad bemerkt

bekomm trotzdem noch die Meldung [C++ Fehler] Unit2.cpp(14): E2238 Bezeichner 'Messdaten::Messdaten()' mehrfach deklariert
-
Ich kenn die ganzen pragmas nicht, daher kann ich dazu nichts sagen.
Wie sieht es denn in deinem Header aus? Dort dürfte nur Messdaten(); stehen (den Konstruktor betreffend).
-
Zeig dann jetzt mal deine Struktur, wie sie aussieht.
-
so nu mal meine Struktur:
aus dem header:struct Messdaten { double temperatur; double pHWert; double tsGehalt; double fuellstand; double drehzahl; double ch4Gehalt; double co2Gehalt; double o2Gehalt; double h2sGehalt; double redox; double leitwert; double durchfluss; Messdaten(); };cpp:
#include "Messdaten.h" Messdaten::Messdaten(): temperatur(0.0), pHWert(0.0), tsGehalt(0.0), fuellstand(0.0), drehzahl(0.0), ch4Gehalt(0.0), co2Gehalt(0.0), o2Gehalt(0.0), h2sGehalt(0.0), redox(0.0), leitwert(0.0), durchfluss(0.0) { //Code }der code funktionert fehlerfrei. was meint ihr ist das ok so?
nu muss ich die daten in einen vektor packen.
So stell ich es mir vor:
Ein Eingabefeld (Messreihen) bestimmt die Anzahl der Messwerte. Ein weiteres Eingabefeld (Intervall) bestimmt das Intervall wann die Daten aufgenommen werden sollen (zB alle 60Sekunden). Über einen Startbutton kann man dann mit der Aufzeichnung beginnen (zusätzlich soll es auch einen Pause- und Stopbutton geben).
Die Frage ist jetzt wie ich über den vector auf die Strukturelemente zugreife? das hab ich jetzt:vector<Messdaten>batch1;Ich hab ja jetzt auch noch keine Instanz der Struktur um auf die Elemente zuzugreifen.
-
soweit ich weiss muss ich den vector so anlegen:
vector<Messdaten>batch(10); // Zugriff: batch[0].temperatur = 15.0;Nun möchte ich aber in der Variable nicht nur einen Wert speichern sondern mehrere. Also brauch ich doch ein Array. Nur das geht ja auch nicht, da ich meine temperaturvariable in einer Struktur habe und wenn ich daraus ein Array mache muss ich die Größe angeben, die aber einstellbar sein soll (Anzahl der Messreihen). Die Zeit soll ja auch noch mit in dem Vector stehen.
-
Ich glaube, du hast immer noch nicht so ganz verstanden, wozu der vector da ist... aber der Reihe nach.
Wenn du den Zeitpunkt der Messung benötigst musst du dafür ein Datenelement in deiner Messstruktur anlegen, z.B. als time_t.
std::vector ist ein dynamisches Array. In deinem Beispiel legst du einen vektor mit 10 Elementen an und weist der Temperatur des 1. Elements den Wert 15.0 zu.
Die Erfassung und Speicherung der Messdaten könnte so aussehen:void erfasse_daten() { Messdaten data; // Messdaten wie auch immer woher auch immer erfassen ... // Zeitstempel eintragen data.Timestamp = time( 0 ); // Daten in vektor eintragen (wo auch immer der gerade herkommt) DataVector.push_back( data ); }vector::push_back() fügt ein neues Element am Ende des Vektors ein, du brauchst dich dabei um keinerlei Speicherverwaltung/Reservierung zu kümmern.
-
also brauch ich keine Größe angeben? Das ist prima, so bleib ich flexibel. Die Anzahl der Messwerte soll ja auch per Eingabe des Benutzers festgelegt werden, ist also unbekannt.
hab die Funktion mal geschrieben und den Messwert mal als random genommen:
vector<Messdaten>batch1; void ErfasseMessdaten() { Messdaten data; data.temperatur = rand(); data.time_t = time(0); batch1.push_back(data); }so müsste es gehen?
Das heisst ich muss nur noch die Funktion aufrufen und dann fült er den Vektor?
-
Probier´s doch einfach aus :p
-
Wenn du die Anzahl vorher kennst, lohnt sich ein batch1.reserve(bekannteGroesse), da so unnötiges Kopieren verhindert wird.
Denn wenn der Speicherplatz für den Vektor nicht mehr ausreicht, wird er an eine Stelle kopiert, wo es genug Platz gibt (+ Platz für ein paar mehr). Je nach Größe des Inhalts kann das in die Performance gehen.
-
Die Größe ist vorher bekannt, da abgefragt wird wie viele Messwerte aufgenommen werden sollen.