Anfänger bruacht Hilfe: Array Werte werden vermutlich nicht übergeben und angezeigt
-
tw14199 schrieb:
Habe vermutlich Probleme mit der übergabe der Array Werte.
Tja, dann zeig doch mal LAEUFER::Teilnehmer_anlegen.
-
Das hat zwar jetzt vermutlich nichts mit dem Problem zu tun, aber:
tw14199 schrieb:
if (Menue == 'J' || Menue == 'j') { i = i++; }Dir ist klar, daß diese Zuweisung undefiniert ist? (je nachdem, in welcher Reihenfolge die Nebeneffekte sich auswirken, wird i entweder um 1 erhöht oder bleibt unverändert)
for(i = 0; i <500;i++) { 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; ...Hiermit gibst du 500x die lokalen Variablen Startnummer etc. aus - die haben absolut nichts mit dem Array-Inhalt zu tun, sondern enthalten noch die letzten Werte, die du eingegeben hast - an die Elemente des Arrays kommst du mit
a_Laeufer[i].Startnummeretc (wie die zugehörigen Member heißen, mußt du wissen).PS: Und system() solltest du vermeiden, wenn es möglich ist - wie das in deinem Fall geht, steht in der Konsolen-FAQ.
-
Fehler
-
tw14199 schrieb:
Kann mir vielleicht jemaand konkret sagen wie das geht, finde den Fehler einfach nicht.
Habe jetzt im main min a_Laeufer.Startnummer in der If Anweisung auf den Array zuzugreifen.
Die Bemerkung bezog sich nicht nur auf das if(), sondern auch auf die vorigen Ausgabe-Anweisungen
Du gibst n-mal hintereinander die letzten Werte aus, die du im vorigen case 'a':Durchlauf eingegeben hast. Stattdessen solltest du die Elemente des Arrays ausgeben (oder diese gesamte Ausgabe gleich umlagern in die Laeufer::Teilnehmer_anzeigen()).PS: Und einen int-Wert kannst du nur schwer mit einem String(literal) vergleichen

-
tw14199 schrieb:
Kann mir vielleicht jemaand konkret sagen wie das geht, finde den Fehler einfach nicht.
Nimm die Ausgabe aus dem b-case raus und steck sie in Teilnehmer_anzeigen, wo sie hingehört.
-
Sorry, dass ich nochmal nachfrage. Also heißt das jetzt das ich die Ausgabe in meiner Laeufer.cpp schreiben sollte? Wenn ja? ist das immer so? Und dann greife ich nur auf die Methode zu?
Danke.
-
tw14199 schrieb:
Sorry, dass ich nochmal nachfrage. Also heißt das jetzt das ich die Ausgabe in meiner Laeufer.cpp schreiben sollte?
Ja
Wenn ja? ist das immer so? Und dann greife ich nur auf die Methode zu?
Meistens - Daten verarbeiten und ausgeben sollte derjenige, der die Daten besitzt. In deinem Fall geht es um die Attribute der Laeufer-Klasse, also sollte die ihre Daten auch selber ausgeben (und den Grundstein dazu hasz du ja bereits gelegt, indem du die passende Methode deklariert hast).
-
Die Ausgabe ist jetzt in der Laeufer.cpp
Habe im Main im case 'b': noch folgendes:
case 'b': for(i = 0; <500;i++) { if (a_Laeufer[i].Startnummer != "") { a_Laeufer[i].Teilnehmer_anzeigen(); } else { break; } }Kapiere das irgendwie noch nicht ganz, warum das so nicht geht. Könnte mir das jemand erklären und zeigen (
Ich bekomme noch einen Zusammenbruch)
-
tw14199 schrieb:
Die Ausgabe ist jetzt in der Laeufer.cpp
Habe im Main im case 'b': noch folgendes:
case 'b': for(i = 0; <500;i++)
Ich hoffe, das ist nur ein Tippfehler (womit vergleichst du denn die 500?){ if (a_Laeufer[i].Startnummer != "")Wie ich schon sagte, einen int-Wert (Startnummer) kannst du nicht mit einem String-Literal ("") vergleichen, sondern nur mit anderen Zahlen - und da solltest du eine Kennung für "nicht belegt" verwenden, mit der du vergleichen kannst (z.B. -1 - natürlich mußt du im Ctor auch ein 'Startnummer=-1;' ergänzen).
PS: Und wie sieht die Methode Teilnehmer_anzeigen() inzwischen aus?
-
#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; } }
-
In der Anweisung steht:
for(i = 0; i <500;i++)
...........
Das I habe ich nicht vergessen.
-
Hi, schon mal danke für die bemühungen.
Habe den jetzt geändert.
Fehlermendlung: LAEUFER::Startnummer is not accesible.......
Versteh ich nicht ganz. Kann er jetzt nicht darauf zugreifen und überprüfen?case 'b': for(i = 0; i <500;i++) { if (a_Laeufer[i].Startnummer =-1) { a_Laeufer[i].Teilnehmer_anzeigen(); } else { break; } }
-
Endlich mal eine echte Fehlermeldung

Hast du den Member Startnummer vielleicht private gesetzt? Wenn ja, kommst du du von außen nicht an den Wert dran, es sei denn, du spendierst der Klasse eine passende Getter-Methode.
-
Hier mal die Laeufer.h
Das stimmt Startnummer ist in protect. Protect brauche ich dann noch wegen einer Vererebung aber das ist noch Zukunft.
#include <iostream> #include <string> using namespace std; class LAEUFER //Klasse der Laeufer anlegen { protected: int Startnummer; //private Attribute setzen std::string Vorname; 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(); };
-
[C++ Warning] main.cpp(78): W8060 Possibly incorrect assignment
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.Muss an dem
cout <<"Wollen Sie einen weiteren Teilnehmer eingeben? [J/N]: "; cin >> Menue; cout <<endl; if (Menue == 'J' || Menue == 'j') { i = i++; } else { if (Menue == 'N' || Menue == 'n') { break;Muss an dem
i = i++liegen
-
"protected vs. private" ist für das Hauptprogramm irrelevant - wichtig ist hier, daß die Member nicht 'public' sind, du aus dem Hauptprogramm heraus also nicht darauf zugreifen kannst. Wenn das Hauptprogramm irgendeinen dieser Werte wissen muß, braucht deine Klasse eine entsprechende Zugriffsmethode:
class LAEUFER { ... public: ... int get_Startnummer() {return Startnummer;} ... }; ...//im Hauptprogramm if(a_Laeufer[i].get_Startnummer == -1) ...PS: Nur eine Kleinigkeit, aber vermutlich kommst du mit einem vector<LAEUFER> besser weg als mit deinem Array

-
Jetzt kommt folgende Fehlemeldung:
[C++ Error] LAEUFER.H(18): E2451 Undefined symbol 'Startnummer'
im Main
-
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 MainDie 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.