Probleme mit einer Klasse...



  • 1. falls du deine funktion nicht getestet hast: sie funktioniert einwandfrei
    2. aber das gleiche problem gibt es auch hier: es wird nur der nachname eingelesen (vielleicht wird aber auch nur der gespeichert?)

    mfg thomas



  • wenn du alle deine variablen mit der einen funktion initialisierst wird blos der nachname initialisiert? - oder wie meinst du das? naja schau zur not mal mit nem debugger durch ob alle anderen namen leer sind oder lass dir die mal ausgeben. der fehler muss auf alle faelle wo anders liegen als in der funktion -die is eigentlich ok.



  • ICH WERD NOCH WAHNSINNIG 😡

    gerade hab ich die "fehlersuche" durchlaufen lassen... plötzlich sagt mir der compiler wieder folgendes (wieder ohne, dass ich den code verändert hab):
    65 GetSomeName' undeclared (first use this function) 70 no \void Musician::GetSomeName(const std::string&, std::string&, int)' member function declared in class `Musician'

    gerade eben hats noch funktioniert... hab ich ja gepostet!

    main.cpp (hier kein fehler):

    #include "people.h"
    
    int main()
    {
        srand((unsigned)time(NULL));
    
        int i;
    
        Musician One;
        Musician Two;
        Musician Three;
    
        cout << "Name         Musiker 1: " << One.Name << endl;
        cout << "Vorname      Musiker 1: " << One.GivenName << endl;
        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 << "Stimmlage    Musiker 1: " << One.VoiceHeight << endl;
        cout << "Stimmtyp     Musiker 1: " << One.VoiceType << endl;
        cout << "Name         Musiker 2: " << Two.Name << endl;
        cout << "Vorname      Musiker 2: " << Two.GivenName << 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 << "Stimmlage    Musiker 2: " << Two.VoiceHeight << endl;
        cout << "Stimmtyp     Musiker 2: " << Two.VoiceType << endl;
        cout << "Name         Musiker 3: " << Three.Name << endl;
        cout << "Vorname      Musiker 3: " << Three.GivenName << 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;
        cout << "Stimmlage    Musiker 3: " << Three.VoiceHeight << endl;
        cout << "Stimmtyp     Musiker 3: " << Three.VoiceType << endl;
        cin >> i;
    
        return 0;
    }
    

    people.h

    #include <time.h>
    #include <stdlib.h>
    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    typedef unsigned short int USI;
    
    class Musician
    {
        public:
        Musician();             // constructor
    
        string Name;            // musicians last name
        string GivenName;       // musicians given name
    
        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
    
        string VoiceHeight;     // describes the voice height
        string VoiceType;       // describes of whick type the voice is
    };
    
    Musician::Musician()
    {
        b_year = 1960+(rand()%30);                  // randomly created birth year
    
        b_month = 1+(rand()%12);                    // randomly created birth month
    
        if (b_month == 2) b_day = 1+(rand()%27);    // randomly created birth day
        else b_day = 1+(rand()%29);
    
        GetSomeName("names.txt",Name,73);
        GetSomeName("gnames.txt",GivenName,58);
    }
    
    void Musician::GetSomeName(const string &fileName,string &name,int ml)
    {
        int z=1+(rand()%ml);
        ifstream file(fileName.c_str());
        for(int i(1);i<=z;++i)
        getline(file,name);
        file.close();
    }
    


  • du musst die funktion im konstruktor fuer jede deiner variablen fuer die du vorher eine funktion hattest aufrufen - also GetSomeName() noch fuer VoiceHeight und VoiceType mit den richtigen parametern aufrufen :).
    und bitte auch darauf achten das bei dir die datei names.txt auch wirklich 73 zeilen hat, genauso bei den anderen dateien.



  • und GetSomeName() musst du nochmal als member definieren. bzw. nochmal den prototyp in die klasse reinschreiben. also:

    void Musician::GetSomeName(...)...
    


  • das problem lag woanders...
    ich hatte die "void GetSomeName" nich in der klasse selbst eingetragen 🙄

    jetzt kompiliert er wieder ohne probleme und zum ersten mal werden auch alle daten angezeigt!



  • hehe ja... schon passiert... aber danke!

    noch ne frage zur zeilenanzahl:
    meine names.txt hat insgesamt 74 zeilen. also muss ich doch für ml 73 angeben, weil ja 1 + 73 im extremfall dann is, oder?

    aber nun wiedermal ein großes DANKE an dich für deinen einsatz und deine hilfe!!! die ganzen probleme hatte nun wenigstens einen lernfaktor 🙂

    jetzt werd ich wohl erstmal wieder ruhe geben, und sage gute nacht!

    mfg thomas

    ps: die fehlersuche lass ich jetzt glaub nimmer duchlaufen... sonst findet er wieder irgendwas, was er grad ned sieht 😃 . würd das passieren, wäre ich wahrscheins heute wirklich noch vor dem ausflippen 😉



  • Dauermuede schrieb:

    ich hatte die "void GetSomeName" nich in der klasse selbst eingetragen

    sag doch prototyp vergessen 🙂 .
    aber immerhin laeufts ja jetzt.

    *gratulier*

    😃 :p



  • so, hab nun doch wieder ne frage. diesmal gehts aber eher um mathe (aber ich denke wegen diesem kleinen problem lohnt es sich nicht, ein neues topic zu eröffnen!! -> bitte dehalb jetzt nicht verschieben!!).

    habe folgendes geschrieben:

    Motivation = 100;
        Learning = (Motivation * Talent * (1+(rand()%99)))/1000000;
    }
    

    Motivation ist als "unsigned short int" definiert.
    Learning ist als "double" definiert.

    bei der ausgabe kommen aber nun andere werte heraus, als sein müssten! die zahl müsste sich ja zwischen 0,00000000001 und 1 bewegen. stattdessen bekomm ich aber ganzahlige werte wie "32, 65, 12" usw.

    was ist hier falsch? liegts an der größe der zahl vor dem dividieren bzw. der größe des teilers? wenn ja, wie kann man das lösen?

    mfg thomas



  • geht

    Learning = ((double)Motivation * (double)Talent * (double)(1+(rand()%99)))/1000000;
    

    ?



  • wow, schnelle antwort!

    aber nee, geht leider auch nich... kommt das gleiche dabei raus! also wieder ganzzahlen wie z.b. 32 oder 2 oder 62

    mfg thomas



  • vllt weil das letzte als int gehandelt wird:
    [cpp]
    Learning = ((double)Motivation * (double)Talent * (double)(1+(rand()%99)))/1000000.0f;[/cpp]
    sonst ka.
    schnelle antworten gibts nur, weil ich jedes mal ein sms bekomme, wenn ich neue mails kriege 🙄 *weg sucht um diesen sch*** auszuschalten*



  • nee, geht leider auch nicht!! aber danke für dein bemühen 🙂

    offtopic: ruf deinen email-account provider an und sags dem, stells evtl. im mail-client ab (gehts da überhaupt?) oder deaktivier die funktion email-benachrichtignug im forum (-> weniger sms)

    mfg thomas



  • thx, habs schon hingekriegt, über vodafone live settings (angebot von swisscom).
    @topic hab ich leider spontan ka sry



  • hat denn noch jemand anderes vielleicht einen vorschlag?

    mfg thomas



  • habs jetzt mit folgendem versucht, was die lernfähigkeit zwar nicht von talent und motivation abhängig macht, aber auch hier funktionierts nich 😕

    Learning = 1 / (1+(rand()%9));
    

    dabei kommt immer 0.00000 raus. wieso das?
    es müsste doch 1/10 bis 1 rauskommen, wobei sich der nenner immer von 1 bis 10 bewegt ?!

    danke,
    thomas



  • Learning = 1.0f / (1+(rand()%9));
    

    Sollte funktionieren 😉
    Kurt



  • nicht wenn die definition immer noch so wie im ersten post aussieht:

    unsigned short int Learning;
    


  • Cpt.Tanga schrieb:

    nicht wenn die definition immer noch so wie im ersten post aussieht:

    unsigned short int Learning;
    

    Gebe zu den thread nicht gelesen zu haben.
    Kurt



  • nee, nee!
    auf seite 7 hab ichs im einen post geschrieben... Learning ist als double definiert!!!

    aber mit:

    Learning = 1.0f / (1+(rand()%9));
    

    gibt das programm dennoch 0.00000 aus 😞

    mfg thomas


Anmelden zum Antworten