Probleme mit einer Klasse...



  • Dauermuede schrieb:

    int ran_b_year()
        {
            b_year = 1950+(rand()%60);
            return b_year;
        }
    

    Ich picke mal diese Methode raus. Das gilt aber auch für die anderen.

    Es ist nicht sinnvoll, hier die Membervariable zu setzen und zurückzugeben. Wenn du die Methode so wie in deinem Konstruktor benutzt, passiert folgendes:

    (in der Methode)
    - b_year wird gesetzt
    - der Wert von b_year wird zurückgegeben
    (im Konstruktor)
    - b_year wird nochmal gesetzt (auf den Wert, den es schon hat)

    Entweder:

    Die Methode setzt die Membervariable und gibt nichts zurück.

    Oder:

    Die Methode ermittelt den Zufallswert und gibt ihn zurück, lässt aber die Membervariable in Ruhe.

    Wenn du beides vermischst, gibt das nur Käse.



  • wenn mans so sieht kann man die fufallsfunktionen auch ganz in den konstruktor auslagern (is ja eher unwahrscheinlich dass man nachtraeglich nochmal zufaellig das alter setzen moechte) - haette man auch gleich ne bessere performance 😃 .



  • hab den rückgabewert jetzt rausgenommen...
    es funktioniert zwar beides, aber da "return" überflüsig zu sein scheint, hab ichs jetzt entfernt.
    danke auch hierfür!

    mfg thomas



  • Cpt.Tanga schrieb:

    wenn mans so sieht kann man die fufallsfunktionen auch ganz in den konstruktor auslagern (is ja eher unwahrscheinlich dass man nachtraeglich nochmal zufaellig das alter setzen moechte) - haette man auch gleich ne bessere performance 😃 .

    gut hab ich jetzt auch gemacht...
    wenn du sagst, dass es der perfomance dient, wirds schon stimmen 😉 .
    ich mein jetzt spielt das noch keine rolle, aber das projekt befindet sich ja noch sehr am anfang 😉

    mfg thomas



  • hmm hab jetzt wieder ein problem...

    rand() scheint nich mehr zu funktionieren 😞

    ich hab einen Array erstellt (Musician Musi[3]), was am anfang auch funktioniert hat... aber wenn ich jetzt kompiliere, kommen immer die gleichen werte raus, beim ausführen. hab dann wieder "Musician Musi[3]" rausgenommen, aber es bleibt jetzt bei den gleichen werten, obwohl ich an den random-funktionen nichts geändert habe!

    könnte das problem vielleicht an dev c++ liegen?

    aber bei einem anderen "zufalls-programm" funktioniert alles einwandfrei



  • du musst srand() vorher aufrufen (mit time(0)) aber nicht im konstruktor und nur 1 mal im programm-am besten ganz am anfang in der main.



  • es steht ja am anfang der main-funktion und wird nur einmal ausgeführt... die ganze zeit hats ja geklappt keine ahnung warums jetzt nich mehr tut!?!

    main.cpp

    #include "people.h"
    
    int main()
    {
        srand((unsigned)time(NULL));
    
        int i;
    
        Musician One;
        Musician Two;
        Musician Three;
    
        cout << "Geburtstag   Musiker 1: " << One.b_day << endl;
        cout << "Geburtsmonat Musiker 1: " << One.b_month << endl;
        cout << "Geburtsjahr  Musiker 1: " << One.b_year << endl;
        cout << "Geburtstag   Musiker 2: " << Two.b_day << endl;
        cout << "Geburtsmonat Musiker 2: " << Two.b_month << endl;
        cout << "Geburtsjahr  Musiker 2: " << Two.b_year << endl;
        cout << "Geburtstag   Musiker 3: " << Three.b_day << endl;
        cout << "Geburtsmonat Musiker 3: " << Three.b_month << endl;
        cout << "Geburtsjahr  Musiker 3: " << Three.b_year << endl;
        cin >> i;
    
        return 0;
    }
    

    people.h

    #include <time.h>
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    typedef unsigned short int USI;
    
    class Musician
    {
        public:
        Musician();
    
        USI b_day;       // day of birth (value between 1 and 30
        USI b_month;     // month of birth (value between 1 and 12)
        USI b_year;      // year of birth (value between 1950 and 1990
    };
    
    Musician::Musician()
    {
        int ran_b_year()
        {
            b_year = 1950+(rand()%41);
        }
    
        int ran_b_month()
        {
            b_month = 1+(rand()%12);
        }
    
        int ran_b_day()
        {
            if (b_month == 2)
            {
                b_day = 1+(rand()%27);
            }   
            else
            {
                b_day = 1+(rand()%29);
            }
        }
    }
    


  • du kannst keine funktionen inerhalb von funktionen schreiben,
    (dein compiler sollte sich beschweren und sowas sagen wie "error: primary-expression expecteted")
    versuchs mal so:

    //people.h
    #include <ctime>
    #include <cstdlib> //fein die c++ header verwenden
    #include <iostream>
    
    using namespace std;
    typedef unsigned short int USI;
    
    class Musician
    {
        public:
        Musician();
    
        USI b_day;       // day of birth (value between 1 and 30
        USI b_month;     // month of birth (value between 1 and 12)
        USI b_year;      // year of birth (value between 1950 and 1990
    };
    
    Musician::Musician()
    {
            b_year = 1950+(rand()%41);
    
            b_month = 1+(rand()%12);
    
            if (b_month == 2) b_day = 1+(rand()%27);
            else b_day = 1+(rand()%29);
    }
    
    //main.cpp
    #include "people.h"
    
    int main()
    {
        srand((unsigned)time(NULL));
    
        int i;
    
        Musician One;
        Musician Two;
        Musician Three;
    
        cout << "Geburtstag   Musiker 1: " << One.b_day << endl;
        cout << "Geburtsmonat Musiker 1: " << One.b_month << endl;
        cout << "Geburtsjahr  Musiker 1: " << One.b_year << endl;
        cout << "Geburtstag   Musiker 2: " << Two.b_day << endl;
        cout << "Geburtsmonat Musiker 2: " << Two.b_month << endl;
        cout << "Geburtsjahr  Musiker 2: " << Two.b_year << endl;
        cout << "Geburtstag   Musiker 3: " << Three.b_day << endl;
        cout << "Geburtsmonat Musiker 3: " << Three.b_month << endl;
        cout << "Geburtsjahr  Musiker 3: " << Three.b_year << endl;
        cin >> i;
    
        return 0;
    }
    

    es nützt übrigens nichts, eine eigene headerdatei für die klasse zu schreiben, wenn du ihr nicht auch eine eigene .cpp datei gibst.



  • nachdem ich es jetzt im konstruktor so umgeschrieben habe, funktioniert es wieder. was mich nur verwundert: vorher hat es auch funktioniert, so wie ich es vorhin gepostet habe 😕

    naja hauptsache ist, dass es wieder geht! danke!

    zur sache mit dem header:
    der header wird noch erweiter... die klasse ist also nur ein teil davon. der grund, dass ich ein header verwende, ist eigentlich "nur" die übersichtlichkeit. ich will nicht alles in die main.cpp packen. somit bliebe das programm auch "modular".

    mfg thomas



  • hallo!

    habe erneut ein problem mit meiner klasse... diesmal gehts aber ausnahmsweise NICHT ums geburtsdatum. das scheint jetzt endlich stabil zu sein.

    jetzt geht es um die "namenvergabe". hier hat eigentlich alles am anfang funktioniert (den code habe ich vorerst mal von "00x" - sorry für den "klau" 🙄 ). dann habe ich eine zweite datei auslesen wollen, die dann den vornamen bestimmt. da kam das
    1. problem auf: es wurde nur der nachname zufällig bestimmt... "GivenName" blieb immer leer.

    doch nun gibt es ein weiteres problem... wieder ohne dass ich den code verändert hatte:
    jetzt wird nur noch die erste zeile aus der datei für alle namen genommen... und das immer!

    hier der code vom konstruktor:

    Musician::Musician()
    {
        b_year = 1950+(rand()%41);
    
        b_month = 1+(rand()%12);
    
        if (b_month == 2) b_day = 1+(rand()%27);
        else b_day = 1+(rand()%29);
    
        ran_Name();
        ran_GivenName();
        ran_VoiceHeight();
        ran_VoiceType();
    }
    
    ran_Name()
    {
        int zeile1 = 1+(rand()%73);
        ifstream file;
        file.open("names.txt");
        // for(int w = 1; w <= zeile1; w++)
        getline(file,Name);
        file.close("names.txt");
    }
    
    ran_GivenName()
    {
        int zeile2 = 1+(rand()%58);
        ifstream file2;
        file2.open("gnames.txt");
        // for(int x = 1; x <= zeile2; x++)
        getline(file2,GivenName);
    }
    
    ran_VoiceHeight()
    {
        int zeile3 = 1+(rand()%2);
        ifstream file3;
        file3.open("voice_h.txt");
        // for(int y = 1; y <= zeile3; y++)
        getline(file3,VoiceHeight);
    }
    
    ran_VoiceType()
    {
        int zeile4 = 1+(rand()%2);
        ifstream file4;
        file4.open("voice_t.txt");
        // for(int z = 1; z <= zeile4; z++)
        getline(file4,VoiceType);
    }
    

    die funktionen hatte ich anfangs auch direkt im konstruktor (auf die gleiche art, wie diejenigen fürs geburtsdatum...

    danke schonmal,
    thomas

    edit: könntet ihr mir vielleicht auch erklären, für was die for-schleife gut ist? anfangs hat es nämlich sowohl mit als auch ohne einwandfrei funktioniert, weshalb ich sie dann auskommentiert habe...

    edit2: es gibt bei dem ganze übrigens keine compiler-fehler...



  • bitte helft mir!
    ich komm da echt nich weiter... 😞



  • deine ganzen funktionen sollten im grundgeruest so in etwa aussehen:

    void ran_any()
        {
        int zeile=1+(rand()%anzahlZeilenInDatei);
        ifstream file;
        file.open("dateiname.txt");
        for(int i=1;i<=zeile;++i)
            getline(file,stringVar);
        file.close();
        };
    

    dann muesste es auch mit dem zufall wieder stimmen. in der variable 'zeile' steht also die nummer der zeile welche zufaellig ausgewaehlt wurde. dann wird in der for schleife solange aus der datei ausgelesen bis man an dieser zeile angekommen ist, und dieser inhalt sollte dann in 'stringVar' stehen.



  • void ran_Name()
    {
        int zeile1 = 1+(rand()%73);
        ifstream file;
        file.open("names.txt");
        for(int w = 1; w <= zeile1; w++)
        getline(file,Name);
        file.close();
    }
    

    hier... habs ja so 😕
    am anfang hats ja auch funktioniert... nur jetzt gehts nimmer 😡
    hab jetzt erst gedacht, es lag daran, dass ich die funktion nicht mit void initialisiert habe, aber das wars nun auch nich...



  • es ist zum verzweifeln...
    hab jetzt die for-schleife in eine "umständliche" while- und if-schleife umgeschrieben... aber immernoch das gleiche!
    wie wenn die erste zeile in der variable festgefressen wäre...
    die variable bzw. den string explizit leer zu definieren bringt auch nix -> es kommt dann auch die erste zeile aus der datei



  • die funktion an sich sollte funktionieren. aber das ungeschickte an diesen funktionen ist dass die anzahl der zeilen in der datei immer mit der in der funktion festgelegten uebereinstimmen muessen.

    Dauermuede schrieb:

    es wurde nur der nachname zufällig bestimmt... "GivenName" blieb immer leer

    laesst darauf hinweisen das sich in der datei weniger eintraege befinden als in den funktionen angegeben. ich gehe mal davon aus das 'Name' ein string ist-kein char array.



  • ja, "Name" ist als string definiert... ist da z.b. char[20] eher angebracht?

    wie sollte ich es denn sonst machen, damit nur eine einzige zeile gelesen wird? ich brauch ja nur einen namen...

    achso... die txt-datei hat die namen lediglich untereinander angeordnet... bringts da vielleicht was, semikolons nach jeder zeile einzufügen?

    mfg thomas



  • und "durchschnitt" wäre dann average - wenn schon denn schon...



  • also ich werd aus dev-cpp nich schlau...
    auf einmal zeigt der compiler mir fehlermeldungen...

    z.b. meckert er jetzt bei

    using namespace ios;
    

    17 expected namespace-name before ';' token
    17 `<type error>' is not a namespace

    dann folgendes:

    66 ran_Name' undeclared (first use this function) 73void ran_Name()' used prior to declaration
    78 `Name' undeclared (first use this function)



  • das_brot schrieb:

    und "durchschnitt" wäre dann average - wenn schon denn schon...

    hehe ja... eigentlich schon 😉
    aber als ich den kommentar geschreiben hab is mir ums verrecken "average" nich mehr eingefallen...
    danach war ich dann zu faul 🙄 um nach dem wort zu suchen 😉

    mfg thomas

    edit: --> danke dir! 😉



  • lol dann bin ich wenigstens nicht der einzige, der unbedingt engl. kommentieren muss 😃


Anmelden zum Antworten