Messwerte in Klasse aufnehmen und als Vektor speichern



  • ich habe ein Gerät, dass ich über eine serielle Schnittstelle ansteuern kann und das Messwerte liefert. Die Ansteuerung funktioniert bereits und ich möchte diese Daten in einer Klasse ablegen und als Vektor speichern. Diese Daten sollen dann in eine Datei gespeichert werden und/oder als Grafik ausgegeben werden (als Chart). Wie würdet Ihr das machen?



  • Ich weiß ja nicht was das für Daten sind, ein struct dafür zu erstellen wäre aber sicher nicht verkehrt. Dieses in einen vector füllen (dafür sorgen das genug Platz da ist, damit nicht ständig resize ausgeführt wird (oder eine queue oder sowas nehmen)).

    Der Rest ist ja recht simpel, Container durchlaufen und ausgeben...

    Als Grafik? Wäre hier nicht ein csv sinnvoller die dann von Excel oder gnuplot geladen wird?



  • Daten sind Messwerte wie Temperatur, pH-Wert, Drehzahl eines Motors, CO2-Gehalt,...) Die Daten kommen von verschiedenen Sensoren, die die Messwerte liefern.
    warum ein struct und kleine Klasse?
    als Grafik wollte ich ein Chart-Komponente nehmen (Borland Builder 5).



  • rudpower schrieb:

    warum ein struct und kleine Klasse?

    1. stuct und class sind in C++ identisch (vom Standardzugriff einmal abgesehen)
    2. Gibt es zu den Messdaten sinnvolle Funktionen? Wenn nein, würde ich auch zu einer klassischen Struktur greifen.



  • Kannst auch eine Klasse nehmen, im Grunde kein wirklicher Unterschied (bis auf ein paar Details).
    Für simple Zusammenfassungen von zusammengehörigen Daten nehme ich aber einfach immer structs. Mehr als ein Struct und einen überladenen Streaming-Operator brauchst dann ja nicht.

    Borland Builder kenn ich nicht, wäre dafür auch das falsche Subforum.


  • Mod

    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;
    };
    #endif
    

    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?



  • 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),
    };
    #endif
    

    In 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.


Anmelden zum Antworten