Funktionen funktionieren nur wenn ich sie einzeln aufrufe



  • Hi,
    ich habe eine klasse in der ein paar memberfunktionen sind.
    Nun wenn ich diese memberfunktionen aufrufe (nur eine) dann geht sie.
    Rufe ich in meinem Programm mehr als eine memberfunktion auf, geht nur die erste.
    Am code dürfte es nicht liegen, ich erhalte ausserdem keine Fehlermeldung.
    Woran könnte das liegen?
    Ein kleines Beispiel in Pseudo Code:

    int main(void)
    {
       //Objekterstellung
       Streaming German
    
       //Aufruf der Ersten memberfunktion:
       int Lines=German.function();
       //Wenn ich nur das tue geht es!
       cout << Lines<<endl;
    
       int Random=function(Lines);
       //Geht nicht mehr, aber wenn ich es einzeln aufrufe geht es!
    
       string Word=German.functionzwei(Random);
       //Geht auch nicht mehr, aber wenn es einzenl aufrufe schon!
       cout <<Word<<endl;
    
    getch();
    return 0;
    }
    

    Ich weis nicht woran es liegt, da die Funktionen und klassen alle funktionieren, nur eben nur dann wenn ich sie ohne eine andere von ihnen aufgerufen zu haben.

    Ich überschreibe keine Daten der anderen funktionen.

    Vielleicht habt ihr eine idee.

    cu max



  • Nö, wir brauchen die Funktionsimplementierungen 🙂

    Aber zweierlei fällt mir auf:

    int main(void)
    {
       //Objekterstellung
       Streaming German // ; fehlt
    
       //Aufruf der Ersten memberfunktion:
       int Lines=German.function();
       //Wenn ich nur das tue geht es!
       cout << Lines<<endl;
    
       int Random=function(Lines); // Keine Methode
       //Geht nicht mehr, aber wenn ich es einzeln aufrufe geht es!
    
       string Word=German.functionzwei(Random);
       //Geht auch nicht mehr, aber wenn es einzenl aufrufe schon!
       cout <<Word<<endl;
    
    getch();
    return 0;
    }
    


  • Master_Max schrieb:

    Am code dürfte es nicht liegen, ich erhalte ausserdem keine Fehlermeldung.

    Mein Programm funktioniert nicht! Aber ich hab keinen Fehler gemacht. Ein kurzes Beispiel:

    int main()
    {
      RunMyApp();
    }
    

    Aber irgendwie funktioniert das nicht, woran könnte das liegen?

    ----------------------

    Okay, im Ernst! Wir sind doch nicht doof, wenn Du sagst man kann die Funktionen einzeln aufrufen, aber mehrere geht nicht, dann wissen wir denke ich alle was gemeint ist. Der Beispiel-Code ist also etwas überflüssig, aber gut. Dennoch solltest Du uns wenigstens den Code der Funktionen mit dazu posten, am besten die ganze Klasse. An was soll es denn bitte sonst liegen?

    MfG Jester



  • Hi,
    vielen dank ersteinmal.
    Das war leider nur Pseudo Code und ich bekomme ja keinerlei Compilier Fehler.
    Du hast recht, das zweite ist keine Methode sondern eine Normale Funktion.

    cu max



  • Ok, der Code kommt gleich.



  • Dann zeig uns doch bitte mal den Code!



  • Jester schrieb:

    Dann zeig uns doch bitte mal den Code!

    Ich musste ihn erst vom anderen Rechner holen.

    RandomVocabulary.cpp diese Datei wird aus der main aufgerufen und ruft die relevanten methoden und funktionen auf:

    #include <conio.h>
    
    #include <iostream>
    #include <string>
    using namespace std;
    
    #include "Streaming.h"
    #include "Random.h"
    
    void randomVocabulary(void)
    {   
    	Streaming German("VocabularyGerman.txt","VocabularyGermanWrite.txt");
    
    	int Lines;
    	    Lines=German.m_seekEndOfInFile();
    
        int RandomValue;
    	    RandomValue=randomValueFunction(Lines);
    
    	cin.sync();
    	cin.clear();
    	string Content=German.m_readLine(RandomValue);
    	cout <<Content<<endl;
    
    	getch();
    }
    

    Der Header der Streaming Klasse:

    #ifndef STREAMING
    #define STREAMING
    
    #include <string>
    #include <fstream>
    using namespace std;
    
    class Streaming
    {
    private:
    	ifstream in;
    	ofstream out;
    	//string content;
    public:
    	Streaming(const char *In,const char *Out);
    	~Streaming();
    
    	int m_seekEndOfInFile(void);
    	string m_readLine(int NumberOfLine);
    	bool m_writeLine(string Inhalt);
    
    };
    
    #endif //STREAMING
    

    Die Streaming KLasse:

    #include "Streaming.h"
    #include <fstream>
    #include <iostream>
    
    Streaming::Streaming(const char *In,const char *Out)   
    {  
        this->in.open(In, ios::in); //öffnen zum lesen mit Standardoptionen 
        this->out.open(Out, ios::out);  //öffnen zum schreiben mit Standardoptionen 
    }
    
    Streaming::~Streaming()
    {
    	in.close();
    	out.close();
    }
    
    //Sucht das ende der Textdatei (in Zeilen)
    int Streaming::m_seekEndOfInFile(void)
    {  
    	string sContent;
    	int zaehler=0;
    	while(in>>sContent)
    	{
    		++zaehler;
    	}
    
    return zaehler;
    }
    
    //Lies eine Zeile aus einer Textdatei in einen String und gibt diese mit return zurück
    string Streaming::m_readLine(int NumberOfLine)
    {
    	string rContent;
    	for(int i=0;i<NumberOfLine;i++)
    	{
    		getline(in,rContent);
    	}
    
    	return rContent;
    }
    
    //Schreibt eine Zeile den im string gespeicherten inhalt in eine Textdatei
    bool Streaming::m_writeLine(string Inhalt)
    {
    	if(!(out<<Inhalt))
    	{
    		return false;
    	}
    return true;
    }
    

    Der Header der Zufallsfunktion:

    #ifndef RandomValueFunction
    #define RandomValueFunction
    
    int randomValueFunction(int MaxValueOfZeichen);
    
    #endif
    

    Und die Zufallsfunktion:

    #include <cstdlib>
    #include <ctime>
    
    #include "Random.h"
    
    int randomValueFunction(int MaxValueOfZeichen){
    static bool srandCalled=false; 
    
    if(!srandCalled)
    {
    
    srand(static_cast<unsigned>(time(0))); 
        srandCalled=true; 
      } 
    
    return rand()%MaxValueOfZeichen;;
    
    }
    

    Tut mir leid das ich soviel posten muss, aber ich kann mir die Fehler nicht erklären. Ich vermute, das es beim auruf oder der Objekterstellung scheitert.

    Vielen dank im voraus.

    cu max



  • Was erwartest Du da eigentlich?
    Du liest erst alle Tokens aus der Datei und zählst mit, die Datei ist danach sozusagen leer. Anschließend versuchst Du Werte rauszulesen und wunderst Dich, daß nichts kommt.

    Probiers mal mit einem

    in.seekg(0,ios::beg);
    

    vor dem Auslesen der Daten.

    Ansonsten ist es so, daß Du erst die Anzahl der Wort zählst (mit operator>> einlesen) und nachher aber nach Zeilen vorgehst (getline). Ist das Absicht?

    MfG Jester



  • Jester schrieb:

    Du liest erst alle Tokens aus der Datei und zählst mit, die Datei ist danach sozusagen leer. Anschließend versuchst Du Werte rauszulesen und wunderst Dich, daß nichts kommt.

    Aha, ja stimmt, in der version davor hatte ich noch überall getline verwendet, aber mir schien >> einfacher zu sein.

    Ich werde es mal testen.

    vielen dank.

    cu max



  • Tja, ich scheine zu blöd zu sein das hinzubekommen.
    So sieht jetzt meine funktion zum einlesen von Zeilen aus:

    //Lies eine Zeile aus einer Textdatei in einen String und gibt diese mit return zurück
    string Streaming::m_readLine(int NumberOfLine)
    {   
        in.seekg(0,ios::beg);
    	string rContent;
    	for(int i=0;i<NumberOfLine;i++)
    	{
    		getline(in,rContent);
    	}
    
    	return rContent;
    }
    

    Ich bin wahrscheinlich nur zu blöd das zu tuen was du sagst.
    Ich habe jetzt jedes >> durch ein getline ersetzt.
    Zufallsgenerator und ende such funktion funktionieren gut.

    wäre nett, wenn mir noch jemand auf die Socken helfen könnt.

    cu max



  • [EDIT]Die idee ging auch nicht[/EDIT]

    cu max



  • Hm, das sieht eigentlich korrekt aus. Was funktioniert denn eigentlich genau nicht?



  • Hi,

    Jester schrieb:

    Hm, das sieht eigentlich korrekt aus. Was funktioniert denn eigentlich genau nicht

    Ich bekomme das Wort nicht angezeigt, der aufruf muss richtig sein, denn wenn ich ihm eine konkrete Zeile gebe dann liest er diese auch aus und zeigt sie mir an. Der aufruf:

    string Content=German.m_readLine(RandomValue); 
        cout <<Content<<endl;
    

    Ich kann mir nicht erkären was falsch ist, ich habe auch diese Variante ausprobiert:

    string Content;
           Content=German.m_readLine(RandomValue);
    cout <<Content<<endl;
    

    Nur um sicher zu gehen.

    langsam kommst du in die Credits 😃

    cu max



  • Mach mal erst das zählen und gib danach mal Zeile 1 aus oder so. Was passiert denn dann?



  • Hi,

    Jester schrieb:

    Mach mal erst das zählen und gib danach mal Zeile 1 aus oder so. Was passiert denn dann

    Dann sehe ich immer noch nicht das Wort.
    ➡ Es muss also an der Zähl Funktion liegen, wenn die weg ist dann geht es ja.

    [EDIT]Naja, beide benutzen den selben ifstream, ist das Ok so?[/EDIT]

    Ich weis nicht mehr weiter, ich kann keinen Fehler finden.

    cu max



  • Ok, jetzt geht es, ich habe einen neuen ifstream gemacht.
    Warum konnte m_readLine ihn nicht überschreiben?

    vielen dank an alle.

    cu max



  • Tja, hat gestern nur funktioniert weil es nicht in einer Schleife stand.
    Jetzt, weis ich allerdings das es an meinem Konstruktor liegen muss:

    Streaming::Streaming(const char *In,const char *Out)    
    {   
        this->in.open(In, ios::in); //öffnen zum lesen mit Standardoptionen  
        this->out.open(Out, ios::out);  //öffnen zum schreiben mit Standardoptionen  
    }
    

    Der Inhalt des Textfiles wird irgendwie immer gelöscht.
    In meinme Programm habe ich ein Objekt erstellt:

    Streaming German("VocabularyGerman.txt","VocabularyGermanWrite.txt");
    

    In einer do while Schleife greife ich dann auf die methoden der Klasse streaming zu:

    German.m_seekEndOfInFile();
    German.m_readLine(Lines);
    

    Bei dem ersten Schleifendurchlauf funktioniert alles wunderbar, ab einer wiederholungen ist die Textdatei leer und er kann nichts mehr auslesen.
    Beim verlassen des Programms ist die Textdatei wieder voll?
    Ich habe es schon einige Sachen probiert:

    this->in.open(In,ios::in|ios::ate);
    

    oder:

    this->in.open(In,ios::in|ios::app);
    

    Auch in der FAQ bei Hume habe ich nichts finden können.

    Ich hoffe es hat noch jemand eine idee, sonst werde ich wohl nicht herumkommen das ganze neu zu schreiben.

    danke.

    cu max



  • Hallo,
    du löschst aber nach dem Lesen schon das eof-Bit, oder?



  • Hallo,
    danke ersteinmal.

    HumeSikkins schrieb:

    du löschst aber nach dem Lesen schon das eof-Bit, oder?

    Ich denke nicht, ich werde mal schauen wie das geht, mit dem eof bit bezeichnest du doch '\n' oder?
    Wäre nett wenn du dir mal meine methoden anschaust, ist allerdings recht schlecht gemacht dar ich dateien überschreibe weil ich mich mit vektoren nicht auskenne.
    Streaming.h:

    #ifndef STREAMING
    #define STREAMING
    
    #include <string>
    #include <fstream>
    using namespace std;
    
    class Streaming
    {
    private:
    	ifstream in;
    	ofstream out;
    	string content;
    public:
    	Streaming(const char *In,const char *Out);
    	~Streaming();
    
    	int m_seekEndOfInFile(void);
    	string m_readLine(int NumberOfLine);
    	bool m_writeLine(string Inhalt);
    
    };
    
    #endif //STREAMING
    

    Streaming.cpp:

    #include "Streaming.h"
    #include <fstream>
    #include <iostream>
    
    Streaming::Streaming(const char *In,const char *Out)   
    {  
        this->in.open(In,ios::out); //öffnen zum lesen mit Standardoptionen 
        this->out.open(Out,ios::out);  //öffnen zum schreiben mit Standardoptionen 
    }
    
    Streaming::~Streaming()
    {
    	in.close();
    	out.close();
    }
    
    //Sucht das ende der Textdatei (in Zeilen)
    int Streaming::m_seekEndOfInFile(void)
    {  
    	in.seekg(0,ios::beg);
    	int zaehler=0;
    	while(getline(in,content))
    	{
    		++zaehler;
    	}
    
    return zaehler;
    }
    
    //Lies eine Zeile aus einer Textdatei in einen String und gibt diese mit return zurück
    string Streaming::m_readLine(int NumberOfLine)
    {   
        in.seekg(0,ios::beg);
    	for(int i=0;i<NumberOfLine;i++)
    	{
    		getline(in,content);
    	}
    
    	return content;
    }
    
    //Schreibt eine Zeile den im string gespeicherten inhalt in eine Textdatei
    bool Streaming::m_writeLine(string Inhalt)
    {
    	if(!(out<<Inhalt))
    	{
    		return false;
    	}
    return true;
    }
    

    So wie es jetzt ist, wird der Inhalt der Textdatei zwar nicht gelöscht, aber auch nicht richtig ausgelesen.

    cu max



  • Hat das eigentlich einen bestimmten Grund, dass du alle Memberfunktionen mit einem m_ Präfix versiehst?


Log in to reply