Hab eine Program mit cout
-
Servus,
kennt jemand folgendes Problem?
Ich hab erst Objekte angelegt und Attribute über cin eingelesen. Aber obwohl noch nichts eingelesen wurde, werden irgendwelche Zahlen ausgespuckt,
wie z.b. 1.05691e-307Ein Compiler-fehler tritt nicht auf.
Gruß
Martini
-
achte drauf, dass die objekte nicht benutzt werden, bevor sie vollständig initialisiert sind.
entweder verwendest du die objekte schon, bevor deine eingaben über cin getätigt wurden, oder du behandelst nutzereingaben falsch.
zum testen von funktionalität sollte man von cin die finger lassen und sein zeug erstmal statisch vorbelegen. wenn dann alles funzt, kann man nutzereingaben einbauen.
-
alle Daten, die du erstells, bekommen am anfang immer einen Speicherbereich zugewiesen, der vorher nicht aufgeräumt wurde (wozu auch). Das heist, wenn du nichst sagst, was da stehen soll, aber vorher abfragst, was da steht, dann versucht der dir diesen datenmüll irgendwie zu interpretieren.
-
Danke euch beiden,
aber wie geh ich bei folgenden Problem vor:
ich möchte mir verschiedene Daten ausgeben lassen, die nach Kategorie geordnet sind. Das sind 3 Kategorien, so dass ich 3 For-Schleifen hab.
cout << "/nJugendliche unter 18, 10 km: " << endl; for(int i=0; i < 500; i++){ if(la[i].getstartnr() > 0){ if(la[i].getZeit() > 0){ if(la[i].getAlter() < 18){ la[i].anzeigenKatJug(); continue; } } } }Und das Mach ich für Kategor Männer und Frauen auch.
Über getstartnr prüf ich eigentlich ob die eingegebene startnr. größer 0 ist.
Der dürfte doch da eigentlich doch dann auch keine Ausgabe machen, mit den if-bedingungen.
Oder was mach ich das falsch?
-
1.05691e-307 IST größer als 0

-
ah ok, dann ist das verständlichWeißt du eine Möglichkeit zu prüfen, ob ein Objekt tatsächlich angelegt wurde?
In Java würde man machen, (la != null)
Oder wie würdest du in der for-schleife, die if-abfrage schreiben?
Damit der compiler mir nicht das falsche ausspuckt sondern nur die Läufer, die auch angelegt wurden, und wenn ich noch nichts angelegt hab, dass dann auch nichts augegeben wird.
-
saubere initialisierung. lass nie zu, dass eine variable deklariert wird und uninitilaisiert mit ihr gearbeitet werden kann.
double d; // fehleranfällig! double d = 0; // d ist von anfang an belegt Object *o; // kann sonstwas mit passieren Object *o = 0; // überprüfung auf o == 0 liefert sinnvolles ergebnis
-
Krux schrieb:
Beukottiert Micro$oft
Falls das ernst gemeint sein sollte, schreib wenigstens "boykottiert" richtig.

-
Martini123 schrieb:
ah ok, dann ist das verständlichWeißt du eine Möglichkeit zu prüfen, ob ein Objekt tatsächlich angelegt wurde?
In Java würde man machen, (la != null)Klar gibt es die:
return true;
(scnr) - in C++ wird jedes Objekt an der Stelle angelegt, an der du es definierst. Aber dich interessiert wohl eher, ob das Objekt bereits vernünftig initialisiert wurde - und dafür gibt es keine allgemeingültige Lösung.Oder wie würdest du in der for-schleife, die if-abfrage schreiben?
Damit der compiler mir nicht das falsche ausspuckt sondern nur die Läufer, die auch angelegt wurden, und wenn ich noch nichts angelegt hab, dass dann auch nichts augegeben wird.Einfachste Lösung ist wohl, dir zu merken, wieviele Objekte tatsächlich in dem Array eingelesen wurden und nur bis dorthin zu laufen. Bessere Lösung ist es, anstelle des Arrays einen std::vector<> zu verwenden (der bietet sogar den Vorteil, daß du (theoretisch) unbegrenzt viele Teilnehmer unterbringen kannst).
-
Danke für die Tipps!