Strukturen, Funktionen, Referenzen.....



  • Hallo,
    ich habe folgendes Problem:
    wir haben in C++ ein Programm geschrieben, dass zufallszahlen und sensorenwerte erzeugt und dann auf der Konsole ausgibt.

    Kurzversion des programms:

    using namespace std;
    
    struct tMessung
    {
    	char sensor;
    	double Messwert;
    };
    
    int main(void)
    {
    	int anz;
    	char c;
    	struct tMessung *pFeld = NULL;
    
    	while (true)
    	{		
    			cout << "\n\n Wieviele Messwerte moechten sie erzeugen? \t";
    			cin >> anz;
    
    			pFeld = new struct tMessung [anz];
    
    			for (int i = 0;i < anz; i++)
    			{
    				pFeld[i].sensor = rand()%3+97;
    				pFeld[i].Messwert = rand()/100.0;
    			}
    
    			cout << "\n\t" << "Sensor" << "\t\t" << "Messwert\n";
    
    			for (int i = 0;i < anz; i++)
    			{
    				cout << "\t" << setw(3) << right << pFeld[i].sensor;
    				cout << "\t\t" << fixed << setw(6) << right << setprecision (2) << pFeld[i].Messwert << "\n";
    			}
    
    	}
    
    	return 0;
    }
    

    Im 2. Schritt sollen nun die beiden einzelnen Teile:
    also
    1. zufallszahlen erzeugen
    2. zahlen ausgeben
    als funktionen in die main-funktion geschrieben werden. Nun habe ich den Quellcode einfach in die Funktionen gepackt:

    void zufallsDatensaetzeErzeugen (tMessung pFeld [], int anz)
    {
    	delete [] pFeld;
    	pFeld = new struct tMessung [anz];
    
    	for (int i = 0;i < anz; i++)
    	{
    		pFeld[i].sensor = rand()%3+97;
    		pFeld[i].Messwert = rand()/100.0;
    	}
    }
    
    void datensaetzeAusgeben (tMessung pFeld[], int anz)
    {
    	cout << "\n\t" << "Sensor" << "\t\t" << "Messwert\n";
    
    	for (int i = 0;i < anz; i++)
    	{
    		cout << "\t" << setw(3) << right << pFeld[i].sensor;
    		cout << "\t\t" << fixed << setw(6) << right << setprecision (2) << pFeld[i].Messwert << "\n";
    	}
    }
    

    Bis zum erzeugen der zufallswerte klappt das auch weiterhin ohne probleme.
    aus meinem wissen heraus müssen beim erzeugen der zufallswerte mit einer referenz auf pfeld gearbeitet werden, aber leider meckert der compiler ständig...und beim debuggen sieht man, das die erzeugten zahlen nach dem verlassen der erzeugen-funktion wieder gelöscht sind bzw das feld leer ist....

    kann mir dabei jemand helfen??

    danke schonmal für euer hilfe....



  • Hmm also wenn dann allokiert man den Speicher in der main, nicht in der Funktion:

    void zufallsDatensaetzeErzeugen (tMessung* pFeld, std::size_t anz)
    {
        for (std::size_t i(0); i < anz; ++i)
        {
            pFeld[i].sensor = std::rand() % 3 + 97;
            pFeld[i].Messwert = std::rand() / 100.0;
        }
    }
    

    und jetzt mal Container-Klassen nutzen:

    struct measurement_item
    {
        char sensor;
        double value;
        measurement_item(char const& sensor, double const& value)
            : sensor(sensor), value(value)
        {}
        friend std::ostream& operator << (std::ostream& out, measurement_item const& data)
        {
            return (out << "\t" << std::setw(3) << std::right << data.sensor << "\t\t" << std::fixed << std::setw(6) << std::right << std::setprecision(2) << data.value);
        }
    };
    
    void generate_measurement_items(std::vector<measurement_item>& data, std::size_t count)
    { for (std::size_t i(0); i < size; ++i)data.push_back(messurement_item(std::rand() % 3 + 97, std::rand() / 100.0)); }
    
    void show_measurement_items(std::vector<measurement_item> const& data)
    {
        std::cout << "\n\t" << "Sensor" << "\t\t" << "Messwert\n";
        std::copy(data.begin(), data.end(), std::ostream_iterator<measurement_item>(std::cout, "\n"));
    }
    
    int main()
    {
        while (true)
        {       
                std::cout << "\n\nWieviele Messwerte moechten sie erzeugen?\t";
                std::size_t size(0)
                std::cin >> size;
                std::vector<messurement_item> data;
                generate_messurement_items(data, size);
                show_messurement_items(data);           
        }
    }
    

    und dann kannst du das jetzt natürlich auch ni Klassen kapseln!



  • äh, was????
    bin auf dem gebiet leider noch blutiger anfänger....

    eigentlich wollte ich ja nur wissen, wie ich die daten des felds aus der funktion in die main-funktion (deshalb fragte ich nach referenz) übergeben kann um sie in der ausgabe zu benutzen....

    von deinem quelltext versteh ich höchstens die hälfte 😕 bzw kenn ich höchstens die hälfte....und wenn ich den quelltext so abgeben würde, würden unangenehme fragen gestellt die ich dann nicht beantworten kann....



  • #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <iomanip>
    
    struct Messung
    {
        char sensor;
        double messwert;
    };
    
    void zufallsDatensaetzeErzeugen (Messung*, std::size_t);
    void datensaetzeAusgeben (Messung*, std::size_t);
    
    int main()
    {
        std::srand(static_cast<unsigned>(std::time(0))); // nicht vergessen! :P
        while (true)
        {       
            std::cout << "\n\nWieviele Messwerte moechten sie erzeugen?\t";
            std::size_t size(0);
            std::cin >> size;
    
            Messung* ptr_arr = new Messung[size];
            zufallsDatensaetzeErzeugen(ptr_arr, size);
            datensaetzeAusgeben(ptr_arr, size);
            delete [] ptr_arr;           
        }
    }
    
    void zufallsDatensaetzeErzeugen (Messung* ptr_arr, std::size_t size)
    {
        for (std::size_t i = 0; i < size; ++i)
        {
            ptr_arr[i].sensor = std::rand() % 3 + 97;
            ptr_arr[i].messwert = std::rand() / 100.0;
        }
    }	
    
    void datensaetzeAusgeben (Messung* ptr_arr, std::size_t size)
    {
        std::cout << "\n\t" << "Sensor" << "\t\t" << "Messwert" << std::endl;
    
        for (std::size_t i = 0; i < size; ++i)
        {
            std::cout << "\t" << std::setw(3) << std::right << ptr_arr[i].sensor
                      << "\t\t" << std::fixed << std::setw(6) << std::right << std::setprecision(2) << ptr_arr[i].messwert << std::endl;
        }
    }
    

    so solltest du es aber verstehen können ^^



  • ah jetzt ja....

    vielen dank!! jetz hab ichs verstanden udn auhc meinen denkfehler gefunden!!



  • Es läuft jetzt beinahe wie es soll...nur noch eine Frage:

    es soll auch eine Funktion geben, die die gespeicherten werte (die funktion habe ich hinbekommen!) aus der .txt datei lädt und auf der konsole ausgibt...

    jetz habe ich folgende funktion:

    int ausDateiLesen (tMessung pFeld[], int anz)
    	{
    		for (int i = 0; i < anz;i++ )
    		{
    
    			ifstream quelle ("messwerte.txt");
    			if (!quelle)
    			{
    				return -1;
    			}
                                                                 //Hier irgendwo muß das Problem liegen denk ich.....
    			char sensor;
    			double Messwert;
    			quelle >> sensor;
    			quelle >> Messwert;
    
    			pFeld[i].sensor = sensor;     //ob die beiden zeilen  seien müssen, weiß ich nich, aber anders hats bisher nicht funktioniert
    			pFeld[i].Messwert = Messwert;
    
    			cout << "\t" << setw(3) << right << pFeld[i].sensor;
    			cout << "\t\t" << fixed << setw(6) << right << setprecision (2) << pFeld[i].Messwert << "\n";
    
    			quelle.close();
    		 }
    			cout << "\n\n";
    			system ("pause");
    			system ("cls");
    
    	}
    

    die wie folgt in die main-funktion eingebunden ist:

    cout << "\n Wieviele Messwerte moechten sie aus der Datei einlesen einlesen?\n";
    			cin >> anz;
    
    			pFeld = new struct tMessung [anz];
    			cout << "\n\t" << "Sensor" << "\t\t" << "Messwert\n";
    			ausDateiLesen (pFeld, anz);
    

    Doch leider liest er nur die erste zeile der txt-datei ein....wie komme ich, nachdem ich eine zeile eingelesen und ausgegeben habe in die nächste??



  • Du hast einfach die falsche Verschachtelung, d.h. du solltest erst die Datei öffnen und dann die 'anz' Werte auslesen. Nicht jedesmal die Datei öffnen - denn dann liest er immer wieder die erste Zeile.

    ifstream quelle ("messwerte.txt");
    if (!quelle)
      return -1;
    
    for (int i = 0; i < anz;i++ )
    {
       ...
    }
    
    return 0; // diese Anweisung fehlt bei dir noch (sollte eigentlich bei dir sonst einen Compiler-Fehler erzeugen)
    

    Außerdem solltest du dir noch überlegen, ob du wirklich den Datenmember 'sensor' als char abspeichern willst (d.h. als ASCII-Zeichen)?
    Ich denke, eine Zahl (int) wäre dafür besser geeignet.



  • daran lags. vielen dank!!

    das der sensor als ascii ausgegeben wird hat seine richtigkeit, es soll einfach die 3 messpunkte a, b und c symbolisieren....


Anmelden zum Antworten