Unlogisches Verhalten einer Variable



  • So, hallo nochmal.

    Das Programm, um das es geht sollte nach Auswahl bestimmter Songtitel deren Anzahl und Spieldauer addieren (nicht sehr anspruchsvoll, ich weiß).
    Dazu gab es ein Beispielprogramm auf CD.

    Ich habe beim schrittweise Ausführen festgestellt, dass der Wert der die Zeit addiert im Quellcode ein andere ist, als der den ich selber schrieb:

    MyJukebox.Time = 2.6420.... <-- von CD
    MyJukebox.Time = -9.2559... <.. selber geschrieben

    Dies lies sich zwar beheben, indem ich vorher MyJukebox.Time auf 0 setzte, dass Programm von der CD kam allerdings damit auch ohne aus.

    Es kann doch nicht sein, dass der gleiche Quellcode unterschiedliche Werte fabriziert ??

    #include <iostream.h>
    #include <math.h>

    //Diese Zahlen stehen für verschiedene Stücke.
    const int LittleWing = 1;
    const int LittleEarthquakes = 2;
    const int LittleBrownJug = 3;

    //Die Abspielzeit der verschiedenen Stücke.
    const double LittleWingTime = 2.37;
    const double LittleEarthquakesTime = 6.85;
    const double LittleBrownJugTime = 3.15;

    class Jukebox {
    public:
    int NumberOfSongs;
    double Time;
    };

    void main() {
    Jukebox MyJukebox;
    int SongChoice;
    int NumMinutes;
    int NumSeconds;

    //Fange mit 0 Stücken an.
    MyJukebox.NumberOfSongs = 0;
    MyJukebox.Time = 0; // Diese Zeilewar ursprünglich nicht vorhanden

    //Jetzt finden wir heraus, welche Stücke der
    //Benutzer hören möchte.
    do {
    //Führe dies aus, bis der Benutzer Stop sagt.
    cout << "Welche Stuecke?" << endl
    << "1 = Little Wing" << endl
    << "2 = Little Earthquakes" << endl
    << "3 = Little Brown Jug" << endl
    << "0 = Stop" << endl;
    cin >> SongChoice;

    //Addiere Zeit und Anzahl der Stücke
    switch (SongChoice) {
    case LittleWing:
    MyJukebox.Time += LittleWingTime;
    cout << "Eine gute Wahl von Jimi Hendrix.\n";
    MyJukebox.NumberOfSongs++;
    break;
    case LittleEarthquakes:
    MyJukebox.Time += LittleEarthquakesTime;
    cout << "Ein schoener Tori Amos Song.\n";
    MyJukebox.NumberOfSongs++;
    break;
    case LittleBrownJug:
    MyJukebox.Time += LittleBrownJugTime;
    cout << "Super, ein Glenn Miller Klassiker.\n";
    MyJukebox.NumberOfSongs++;
    break;
    case 0:
    //Wir überprüfen diesen Fall, damit der default
    //nicht ausgeführt wird, wenn der Benutzer nur
    //mit der Eingabe aufhören möchte.
    break;
    default:
    cout << "Wie bitte?\n";
    }
    }
    while (SongChoice != 0);

    //Berechne die Anzahl der Minuten und Sekunden.
    NumMinutes = int(MyJukebox.Time);
    NumSeconds = int((MyJukebox.Time - NumMinutes)*60);

    //Gib das Ergebnis aus.
    cout << "Das waeren also " << MyJukebox.NumberOfSongs
    << " Stuecke, die zusammen " << NumMinutes
    << " Minuten " << "und " << NumSeconds
    << " Sekunden laufen werden.\n";
    }



  • Tippe mal das der Code von CD (kannst du den code sehen, oder nur das binary ?)
    einen Konstruktor von MyJukebox aufruft, und dort den wert auf setzt.

    Devil



  • Den Code kann ich direkt einsehen. Er ist ja auch völlig identisch, mit dem, den ich hier reingeschrieben hab - ausser eben MyJukebox.Time = 0;

    Und was ist ein Konstruktor ? (Hab erst vor kurzem angefangen, mich mit C++ zu beschäftigen)



  • Ein Konstuktor ist eine Elementfunktion der Klasse, in der die Datenelemente der Klasse initialisiert werden. Der Konstuktor heißt genauso wie die Klasse selber und hat keinen Rückgabewert. Bei Bedarf kann er auch Parameter übernehmen.

    class Beispielklasse
    {
    public:
       int Variable;
       Beispielklasse()  // Konstuktor
       {
          Variable = 0;
       }
    }
    

    Der Konstuktor wird jedesmal, wenn ein Objekt dieser Klasse erstellt wird aufgerufen.

    [ Dieser Beitrag wurde am 28.06.2003 um 09:16 Uhr von Bill Geiz editiert. ]



  • hallo,

    aha, c++ für dummies... (ich meine das buch)

    mfg
    kurt


Anmelden zum Antworten