Anfänger bruacht Hilfe: Array Werte werden vermutlich nicht übergeben und angezeigt



  • tw14199 schrieb:

    [C++ Warning] main.cpp(78): W8060 Possibly incorrect assignment

    Ja, = ist eine Zuweisung, Vergleich ist == 😉

    Stratnummer steht jetzt mal in public.

    Da kann ich das Programm dann wieder starten.
    Laeufer eingeben. Aber bei der Ausgabe Leauft er alle 500 durch und zeigt auch die inhalbe der String Variablen nicht an.

    Wie ich oben schon sagte, solltest du im Konstruktor der Läuferklasse den Wert auch initialisieren.

    Muss an dem

    i = i++
    

    liegen

    Ganz sicher - daß diese Anweisung unsinnig ist, habe ich weiter oben schon erläutert.

    tw14199 schrieb:

    Jetzt kommt folgende Fehlemeldung:

    [C++ Error] LAEUFER.H(18): E2451 Undefined symbol 'Startnummer'
    im Main

    Die Zugriffsmethode benötigst du nicht anstelle der Membervariable, sondern zusätzlich.



  • Hallo
    Versuche die Probleme schon selber zu lösen, das fuktioniert heute einfach nicht so. Muss auch sagen das ich ein bisl überfordert bin. Denn egal was ich ädere, es kommen immer neue Fehlermeldungen.

    Fehlermeldung: [C++ Error] main.cpp(78): E2235 Member function must be called or its address taken

    Habe jetzt die Methode in der Laeufer.h und die Implementierung der Methode in der Laeufer.cpp

    int LAEUFER::get_Startnummer()
        {
        return Startnummer;
        }
    

    Danke für die Mühe.



  • Zeig mal, wie Startnummer und get_Startnummer in Laeufer.h aussehen.



  • #include <iostream>
    #include <string>
    using namespace std;
    
    class LAEUFER                         //Klasse der Laeufer anlegen
    {
      protected:
    
        int Startnummer;
        std::string Vorname;               //private Attribute setzen
        std::string Nachname;
        std::string Geschlecht;
        float Laufzeit;
        char Hobbyklasse;
        int Startgebuehr;
    
      public:
    
        LAEUFER();                       //Konstruktor definieren
        ~LAEUFER();                      //Destruktor  definieren
    
                                         //Definition der Methoden
        void Teilnehmer_anlegen(int s_Startnummer, std::string s_Vorname, std::string s_Nachname, std::string s_Geschlecht,  char s_Hobbyklasse, float Laufzeit);
        void Teilnehmer_anzeigen();
        float Laufzeit_eingeben(float s_Laufzeit);
        void Ergebnis_anzeigen();
        void Startgebuehr_berechnen();
        int get_Startnummer();
    };
    


  • #include "Laeufer.h"
    
    LAEUFER::LAEUFER()                        //Implementierung des Konstruktors
    {
    Laufzeit = 0;
    }
    LAEUFER::~LAEUFER()                       //Implementierung des Destruktors
    {
    }                                         //Implementierung der Methode Teilnehmer_anlgen
    void LAEUFER::Teilnehmer_anlegen(int s_Startnummer, std::string s_Vorname, std::string s_Nachname, std::string s_Geschlecht, char s_Hobbyklasse, float s_Laufzeit)
    {
            Startnummer = s_Startnummer;
            Vorname     = s_Vorname;
            Nachname    = s_Nachname;
            Geschlecht  = s_Geschlecht;
            Hobbyklasse = s_Hobbyklasse;
            Laufzeit    = s_Laufzeit;
    
    }
    void LAEUFER::Teilnehmer_anzeigen()        //Implementierung der Methode Teilnehmer_anzeigen
    {
       cout << "Teilnhemer des Crosslaufes in diesem Jahr: \n"<<endl;
       cout << "Startnummer: " << Startnummer  << endl;
       cout << "Geschlecht:  " << Geschlecht  << endl;
       cout << "Vorname:     " << Vorname     << endl;
       cout << "Nachnem:     " << Nachname    << endl,
       cout << "Hobbyklasse: " << Hobbyklasse << endl;
    }                                          //Implementierung der Methode Laufzeit_eingeben
    float LAEUFER::Laufzeit_eingeben(float s_Laufzeit)
    {
            Laufzeit = s_Laufzeit;
            return 1;
    }
    void LAEUFER::Ergebnis_anzeigen()          //Implementierung der Methode Ergebniss_anzeigen
    {
    }
    
    void LAEUFER::Startgebuehr_berechnen()     //Implementierung sowie berechnung der Startgebuehr
    {
            if (Hobbyklasse == 'J' || Hobbyklasse == 'j')
            {
            Startgebuehr = 8;
            }
            else
            {
            Startgebuehr = 10;
            }
    }
    
    int LAEUFER::get_Startnummer()
        {
        return Startnummer;
        }
    


  • Und wie benutzt du das in main.cpp, Zeile 78?



  • Fehlen mir die Eingabeparameter in der Methode?

    int LAEUFER::get_Startnummer(int s_Startnummer)
        {
        Startnummer = s_Startnummer;
        return Startnummer;
    

    }



  • tw14199 schrieb:

    Fehlen mir die Eingabeparameter in der Methode?

    Nein, das ist so schon in Ordnung. Ich vermute eher, dass beim Funktionsaufruf die Klammern fehlen.



  • case 'b':
            for(i = 0; i <500;i++)
            {
              if(a_Laeufer[i].get_Startnummer == -1)
              {
              a_Laeufer[i].Teilnehmer_anzeigen();
              }
                else
                {
                break;
                }
    

    }



  • Hallo

    [cpp]get_Startnummer**()**;[/cpp]

    chrische



  • MFK schrieb:

    Ich vermute eher, dass beim Funktionsaufruf die Klammern fehlen.

    Du musst übrigens immer noch, wie von CStoll schon mehrfach erwähnt, im Konstruktor Startnummer mit -1 initialisieren, damit das funktioniert.



  • Ich schließe mich mal der Frage an:

    MFK schrieb:

    Und wie benutzt du das in main.cpp, Zeile 78?

    PS: Nein, du brauchst keine Parameter für die get_() Methode. Und das, was du im letzten Beitrag geschrieben hast, wäre eine set_() Methode (die dir aber gar nichts nützt, weil sie die bisher eingetragene Startnummer einfach überschreibt.

    PPS: Und damit der Vergleich "Startnummer==-1" (in welcher Abwandlung auch immer) etwas ergeben kann, mußt du die Startnummer im Konstruktor mit -1 initialisieren - aber das habe ich auch schon dreimal gesagt.



  • sorry, habe ich schon gelesen, aber das am Anfang bisl viel für mich. Ich habe mit Mühe und Not das soweit gebracht. Bin eben noch ein Neugling, Anfänger ohne Erfahrung.



  • public:
    
        LAEUFER(int Stratnummer =-1);                       //Konstruktor definieren
        ~LAEUFER();                      //Destruktor  definieren
    

    Sie das dann so aus?
    Danke



  • Nein - so:

    ...
    LAEUFER(); //Ctor
    ~LAEUFER();//Dtor
    ...
    
    //Läufer.cpp:
    LAEUFER::LAEUFER()
    {
      Laufzeit = 0; //Wozu du das brauchst, ist mir schleierhaft, aber ich lasse es mal stehen
      Startnummer = -1;// <- initialisiert die Startnummer mit einem Dummy-Wert
    }
    ...
    

    (Ich könnte jetzt anfangen mit Initialisierungslisten, aber darauf verzichte ich lieber ;))



  • Hallo

    Wollte ja einfach nur die Laufer anzeigen lassen. Durch den chat im Forum sind wir dann an den Punkt gelangt, das ich noch eben den Konstruktor initialisieren muss, dammit das geht. Kenne mich einfach in der Programmierung zu wenig aus.



  • Die Methode get_Startnummer habe wir ja gebraucht, da dieser in private war und ich nicht darauf zugreifen konnnte. Wollte dann im main, die Laeufer anzeigen die ich im Array abgelegt habe

    case 'b':
            for(i = 0; i <500;i++)
            {
              if(a_Laeufer[i].get_Startnummer == -1)
              {
              a_Laeufer[i].Teilnehmer_anzeigen();
              }
                else
                {
                break;
    

    Das sollte dann so funktionieren.
    Dann kammen eine weitere Fehlermeldung, wodurch man mir sagte ich soll den Konstruktor inistialisieren.

    Jetzt habe ich das gemacht.

    Fehlermeldung: [C++ Error] main.cpp(76): E2235 Member function must be called or its address taken

    Ich versteh die ganze logig noch nicht ganz. Warum das so kompliziert ist die Laeufer anzeigen zu lassen. Oder stimmt die vorgehensweise nicht?

    Danke



  • Du denkst einfach zu kompliziert (nicht persönlich nehmen) und dadurch entsteht dann solcher (sorry) Spagehetti-Code 😉 Irgendwann wirst du noch soweit kommen, daß du deine Programme vernünftig strukturieren kannst.

    Ich (als alter Hase) hätte statt des Arrays einen vector<> verwendet, um das Starterfeld einzutragen - im 'case a'-Fall jeweils mit push_back() neue Werte eingetragen. Damit würde sich auch die Überprüfung auf eine dummy-Nummer erübrigen (den vector<> kannst du fragen, wieviele Elemente er aktuell hat).

    tw14199 schrieb:

    Die Methode get_Startnummer habe wir ja gebraucht, da dieser in private war und ich nicht darauf zugreifen konnnte. Wollte dann im main, die Laeufer anzeigen die ich im Array abgelegt habe

    case 'b':
            for(i = 0; i <500;i++)
            {
              if(a_Laeufer[i].get_Startnummer == -1)
              {
              a_Laeufer[i].Teilnehmer_anzeigen();
              }
                else
                {
                break;
    

    Das sollte dann so funktionieren.
    Dann kammen eine weitere Fehlermeldung, wodurch man mir sagte ich soll den Konstruktor inistialisieren.

    Jetzt habe ich das gemacht.

    Fehlermeldung: [C++ Error] main.cpp(76): E2235 Member function must be called or its address taken

    Wenn du eine Funktion/Methode aufrufen willst, mußt du die Klammern angeben (selbst wenn da nichts drin steht) - also if(a_Laeufer[i].get_Startnummer()==-1)... .



  • Hallo

    Kein Thma, dass muss bestimmt mühsam für dich sein so einem möchtegern Programmierer zu helfen, fide ich aber echt super, dass du dir die Zeit nimmst.

    Status Habe nun:

    Die Methode in der Laeufer.h ergänzt

    ........
    .........
     public:
    
        LAEUFER();                       //Konstruktor definieren
        ~LAEUFER();                      //Destruktor  definieren
    
                                         //Definition der Methoden
        void Teilnehmer_anlegen(int s_Startnummer, std::string s_Vorname, std::string s_Nachname, std::string s_Geschlecht,  char s_Hobbyklasse, float Laufzeit);
        void Teilnehmer_anzeigen();
        float Laufzeit_eingeben(float s_Laufzeit);
        void Ergebnis_anzeigen();
        void Startgebuehr_berechnen();
        int get_Startnummer();
    
    };
    

    Dann in der Laeufer.ccp Implementiert und den Kostruktor ergäntzt.

    #include "Laeufer.h"
    
    LAEUFER::LAEUFER()                        //Implementierung des Konstruktors
    {
    Startnummer == -1;
    Laufzeit = 0;
    }
    .........
    .........
    .........
    int LAEUFER::get_Startnummer()
        {
        return Startnummer;
        }
    

    Im Main folgendes:

    case 'b':
            for(i = 0; i <500;i++)
            {
              if(a_Laeufer[i].get_Startnummer() == -1)
    
              {
              a_Laeufer[i].Teilnehmer_anzeigen();
              }
                else
                {
                break;
                }
    

    Das stimmt doch?
    Funktioniert immer noch nicht. Komme jetzt wieder ins Programm aber er zeigt nichts an.

    PS: Falls du keine Zeit mehr hast, ich schon nerve etc. einfach ehrlich sein und ich versuch das noch irgendwie anders.

    Danke nochmal



  • tw14199 schrieb:

    Funktioniert immer noch nicht.

    Kein Wunder. Schau dir den Code doch mal genau an!

    Wenn die Startnummer -1 ist (wenn also der Läufer "leer" ist), gibst du ihn aus. Das ist schon doch schon Unsinn. Und wenn er nicht "leer" ist, brichst du die Schleife ab. Wenn also der erste Läufer im Array als Startnummer nicht die -1 hat, so wie es sein sollte, passiert logischerweise gar nichts.


Anmelden zum Antworten