Messwerterfassung ohne dynamische Arrays



  • Ich möchte als Übung eine Messwerterfassung schreiben und die Werte in einem Array speichern.
    Da ich noch Anfänger bin möchte ich noch keine dynamischen Arraylängen benutzen und definiere mein Array daten mit ```cpp
    float daten[2000];

    Ich möchte jetzt die Werte mittels Unterroutine in das Array einlesen.
    Ich kann zwar die Plausibilitätsprüfung erledigen, aber irgendwie kommen die Werte nicht im Array an. 
    
    Code snippets:
    ```cpp
    float eingabecon(float daten[], int& index)
    {
        bool gueltig = false;   
        float wert;
        while (!gueltig)
        {
            cout << endl << index << "ten Messwert eingeben: ";
            cin >> wert;
            if (wert > 0)
            {
                gueltig = true;
                daten[index] = wert;
                index++;
            }
            else if (wert == 0) gueltig = true;
                 else gueltig = false;
        }
        return wert;
    };
    

    und in main:

    float daten[2000];
    while (dummy != 0)
            {
                dummy = eingabecon(daten, anz_werte);
                daten[anz_werte] = dummy;
            }
    

    Wer kann helfen?


  • Mod

    @Gulper sagte in Messwerterfassung ohne dynamische Arrays:

    Da ich noch Anfänger bin möchte ich noch keine dynamischen Arraylängen benutzen

    Du lernst vermutlich das berüchtigte "C mit cout" anstatt C++. In C++ brauchst du keine Angst vor dynamischen Arrays zu haben. Überhaupt ist mit den C++-Datenstrukturen, egal ob dynamisch oder statisch, alles viel einfacher als das was du hier gerade mit deinen C-Arrays versuchst. Aber es ist jetzt auch nicht so einfach, dass ich dir das in 5 Zeilen beibringen könnte, von daher verweise ich dich auf externe Lehrbücher. Was jedenfalls der wesentliche Vorteil von den C++-Datenstrukturen ist, ist dass sie sich wie ganz "normale" Variablen verhalten, wenn man sie an Funktionen übergibt, keine komischen Pointerzerfälle. Das heißt, alles funktioniert damit ganz intuitiv so, wie man es von anderen Datentypen gewohnt ist.

    Das dynamische Array in C++ heißt std::vector (das wirst du ganz oft brauchen, sehr wichtig!), das statische heißt std::array. Es gibt noch viele weitere Container dieser Art, für andere Anwendungszwecke. Dir ist hoffentlich schon std::string begegnet, was im Prinzip so eine Art Vector von chars ist. Das war auch nicht schwierig zu benutzen, oder? Also keine Angst davor! (Falls dir std::string an dieser Stelle noch nicht begegnet ist, solltest du ernsthaft(!) dein Lehrbuch wegwerfen)

    Also mein Ratschlag ist, dass du dir diese wichtigen Standarddatenstrukturen von C++ anguckst. Damit lösen sich deine Probleme von alleine.



  • Welchen Wert hat denn anz_werte initial in deiner main-Funktion beim Aufruf?



  • @SeppJ : Danke, ich bin schon mit Structs unterwegs gewesen, hatte aber noch nicht daran gedacht. Das ist DAS Argument für mich, dass ich dann einfach übergeben kann, ohne dieses Pointer von Pointer etc. Das macht mir das Leben leichter.

    Das kommt so, wenn man seit 30 Jahren nicht mehr richtig programmiert hat.
    Danke, das bringt mich erst einmal einen Schritt weiter.



  • @Th69 anz_werte startet mit 0 und wir auch in der Eingabecon hochgezählt (Die Übergabe als Referenz scheint so zu klappen, oder habe ich nur Sonderfälle ausprobiert?)



  • @Gulper sagte in Messwerterfassung ohne dynamische Arrays:

    aber irgendwie kommen die Werte nicht im Array an.

    Wie hast du denn das getestet? Benutzt du eine IDE? Dann benutze den Debugger und durchlaufe dein Programm (Haltepunkt setzen und daten-Array überprüfen).

    Und was willst du mit der Zeile daten[anz_werte] = dummy; bezwecken?



  • Mache mich gleich ran,
    Die Zeile ist zugegebenerweise Dumm, da Daten ja schon als Referenz laufen und in der Unterroutine zugewiesen wird. - Also überflüssig.



  • @Gulper sagte in Messwerterfassung ohne dynamische Arrays:

    Da ich noch Anfänger bin möchte ich noch keine dynamischen Arraylängen benutzen und definiere mein Array daten

    Neee, weil du noch Anfänger bist möchtest du gerne ein dynamisches Array mit std::vektor verwenden.

    Wenn du ein Experte bist und eine sehr gute Begründung hast, warum weder std::vector noch std::array für etwas spezielle Anwendungsfälle genutzt werden kann / sollte, dann gegebenfalls unter Umständen möglicherweise ist ein C-Array die geeignete Wahl.

    Es hat einen Grund, warum es C-Array heißt und nicht C++-Array 😉

    Es besteht der Verdacht, dass du ein schlechtes Lehrbuch / Youtube Video / Vorlesung / Udemy Kurs etc. nutzt um C++ zu lernen. Wie lernst du aktuell C++?
    Vlt. können wir noch verhindern, dass du hier in ne falsche Richtung abdriftest.



  • Hi
    Erst einmal Danke für eure Hilfe.
    mit <vector> habe ich das Problem gelöst.
    Definitiv einfacher und entspricht eher der Vorgehensweise, die ich kenne.
    Ich kann endlich alles als Reference übergeben.

    Nur Pointer habe ich dabei noch immer nicht gelernt. Es erschließen sich für mich die Vorteile einfach nicht. Und dass der von euch propagierte Weg auch ohne Pointer Handling funktioniert ist nicht gerade eine Ermutigung.
    Evtl. hätte ich deutlicher auf die FAQ hören sollen. Ich schiebe mal nach: Ich wolle das Problem als Fingerübung programmieren, um mit Pointern umzugehen und die Vorteile besser zu verstehen. Für mich reduziert sich das ganze bisher auf Call by reference. Das kann doch aber nicht alles sein, oder...
    Schön, dass mir <vector> da viel Arbeit abnimmt. Funzt sogar mit dem struct, das ich angelegt habe.
    Und Danke für Eure Unterstützung


  • Mod

    Ein roher Pointer wird dir in C++ praktisch nie begegnen, daher brauchst du das auch nicht wirklich zu lernen. Wie schon mehrmals hier vermutet, hast du wahrscheinlich schlechtes Lehrmaterial, das dir eher C mit Extras anstatt C++ beibringen möchte. Jedenfalls ist es viel wichtiger, dass du erst einmal C++ vernüftig lernst (und so etwas wie Vector & Co. sind da absolute Grundlagen, die früh gelernt werden wollen) und dann kannst du dir irgendwann aus Neugierde mal angucken, was das mit den berüchtigten Pointern auf sich hat, oder was die Unterschiede zu C sind. Momentan scheint dir noch viel C++ Grundwissen zu fehlen, das wichtiger ist als die historischen Teile von C.

    Für mich reduziert sich das ganze bisher auf Call by reference. Das kann doch aber nicht alles sein, oder...

    Jedwede Art von Indirektion halt. Solange du keine komplexen Datenstrutkturen aufbaust, ist das im wesentlichen nur Call by Reference, ja. Aber für komplexe Datenstrukturen ist es unerlässlich. Irgendwo tief im Inneren besteht ein Vector beispielsweise auch nur aus 3 Pointern.



  • @SeppJ sagte in Messwerterfassung ohne dynamische Arrays:

    Jedenfalls ist es viel wichtiger, dass du erst einmal C++ vernüftig lernst (und so etwas wie Vector & Co. sind da absolute Grundlagen, die früh gelernt werden wollen) und dann kannst du dir irgendwann aus Neugierde mal angucken, was das mit den berüchtigten Pointern auf sich hat, oder was die Unterschiede zu C sind.

    @Gulper Ich würde sogar so weit gehen und sagen, wenn man die C++-Datenstrukturen richtig versteht und anwenden lernt, man den Großteil des notwendigen Wissens über Pointer automatisch mitlernt. Man stösst dann nämlich z.B. auch irgendwann auf solche Konzepte wie Iteratoren und Ranges, die man als Verallgemeinerung von Pointern begreifen kann. Pointer sind dann lediglich ein Spezialfall.

    Ich denke, das ist eine sinnvollere Richtung, sich diesem Thema zu nähern, da m.E. solche abstrakten Grundkonzepte ein wichtiger Teil dessen sind, was modernes C++ ausmacht und es von "C mit cout" abhebt.


Anmelden zum Antworten