Probleme mit einer Klasse...



  • Cpt.Tanga schrieb:

    ran_Name() muss natuerlich auch noch member von deiner klasse sein.

    ist es doch durch den konstruktor. ich mein als ichs jetzt dazugeschrieben hab, kam zumindest keine zusätzliche fehlermeldung aber ohne dass es direkt in der klasse (nicht über den konstruktor) eingetragen is, gibts auch keinen fehler...

    übrigens wegen source: am source-code hat sich nichts geändert... der gibt nur die sachen zum test aus.

    das_brot schrieb:

    Name ist ein elem von Musician

    habs dazugeschrieben, wie du es angegeben hast, aber der fehler besteht weiterhin 😕

    mfg thomas



  • im konstruktor solltest du die funktion dann auch aufrufen (du deklarierst sie da nur).



  • jetzt gehts wieder...
    und so hat ichs doch auch am anfang... irgendwie is der compiler von dev-cpp nich so ganz zuverlässig... mal zeigt er nen fehler mal nich... selbst wenn man an der besagten stelle nichts ändert!

    naja, aber das andere problem bleibt bestehen: es wird nur der nachname ausgelesen... die anderen variablen bleiben leer...

    mfg thomas



  • ne, ich wollte nur erklären, was Name ist, weil Cpt.Tanga danach gefragt hat.



  • achso... 😃

    habt ihr beiden vielleicht noch ne idee, wie ich das andere problem in den griff bekomme?

    code-ausschnitt:

    int zeile1 = 1+(rand()%73);                 // random selcetion last name
        ifstream file;
        file.open("names.txt");
        for(int w = 1; w <= zeile1; ++w)
        getline(file, Name);
        file.close();
    
        int zeile2 = 1+(rand()%57);                 // random selection given name
        ifstream file2;
        file2.open("gnames.txt");
        for(int x = 1; x <= zeile2; ++x)
        getline(file2,GivenName);
        file2.close();
    

    muss man hier eigentlich "file" durchnummerieren oder is das dann egal, weil die andere datei geschlossen is? die 2 weglassen behebt das problem jedenfalls nicht 😕

    mfg thomas



  • nein du musst 'file' nicht durchnummerrieren - reicht doch eins aus.

    istream file("meineDatei.txt");
    //tu was mit der datei
    file.close();
    file.open("meineNaechsteDatei.txt");
    //noch was damit machen
    


  • haettest auch nicht jedesmal ne neue funktion gebraucht. sowas in der art waer in deinem fall bestimmt auch ganz gut gegangen:

    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();
    	};
    


  • 1. file hab ich jetzt also einheitlich
    2. zeile nun auch (gilt dann wohl auch hier?). wird ja jedes mal neu "generiert".
    3. mit deiner vorgeschlagenen funktion kann ich weniger anfangen... in der art hab ich sie auch damals nich aufgebaut... außerdem müsste man hier doch immer wieder einen neuen wert für die ml angeben, da ja nicht jede datei die gleiche anzahl an zeilen hat?!

    mfg thomas



  • Dauermuede schrieb:

    müsste man hier doch immer wieder einen neuen wert für die ml angeben, da ja nicht jede datei die gleiche anzahl an zeilen hat?

    ja, aber ich denke das ist besser als jedesmal dafuer ne neue funktion zu schreiben.

    die aufrufe wueden ja dann so aussehen:

    ...
    GetSomeName("names.txt",name,73);
    GetSomeName("gnames.txt",givenNames,58);
    ...
    

    aber es laeuft ja jetzt zum glueck auch so (?).



  • ja es läuft fast! die nachnamen werden wieder zufällig ausgesucht...
    aber wie gesagt: die anderen strings werden nicht "befüllt"

    aber ich werds mal mit deiner funktion versuchen. danke für die erklärung, jetzt hab ichs kapiert 🙂

    mfg thomas



  • 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;
    

    ?


Anmelden zum Antworten