Funktionsübergreifendes Array



  • Hey,

    ich hab gerade ein kleines Problem...
    Ich fange an einen Vokabeltrainer für den Lateinunterricht zu schreiben.

    Jetzt nach dem Einlesen der Vokabelliste stelle ich fest, dass die Strings & Variablen nicht mehr funktionieren.

    Das Problem liegt denke ich darin dass das einlesen in einer Funktion geschieht und ich mich aktuell in einer anderen Funktion befinde.

    Theoretisch könnte ich die Variable Array usw einfach als static bzw. global definieren. (Static wird kompiliert - geht trotzdem nicht /// global wird nicht compiliert - geht auch nicht).
    Was kann ich da noch machen.

    Mein aktueller Code:

    int hoehe = 0;
    	int breite = 0;
    	int vokabelzaehler = 0;
    	string temp = "";
    	string lektion = "";
    	string vokabel [6][100];
    
    	ifstream lektiontxt("lektion.txt");
    	getline(lektiontxt, lektion);
    
    	ifstream datei(lektion.c_str());
    
    	while(!datei.eof())
    	{
            getline(datei, temp);
            vokabel [breite][hoehe] = temp;
    
            breite =+ 1;
            if(breite >= 6)
            {
                breite = 0;
                hoehe =+ 1;
            };
    
            vokabelzaehler = hoehe;
            }
    

    eigentlich müssen nur die variablen, strings und das array oben geändert werden. Ich weiß aber nicht mehr wie...

    Bin dankbar für jede Hilfe!

    MfG: Eric



  • Du übergibst eine Referenz der Funktion. So in die Richtung:

    void fill_voc ( std::vector<std::string>& voc )
    {
     // fülle voc
    }
    
    int main ()
    {
     std::vector<std::string> voc;
    
     fill_voc ( voc );
    
     // voc ist nun gefüllt
    }
    


  • Dann wird am Ende aber alles nochmal eingelesen?



  • Nein, warum? - Du musst die Funktion ja lediglich 1x aufrufen..



  • Der Button wird aber mehrmals geklickt.
    Also bei dir: Voc ist nun gefüllt.

    Wird da nicht jedes mal wenn die Funktion / Button geklickt wird, nochmal alles eingelesen?



  • Keine Ahung, was du machst, wenn du einen Button klickst, aber bei mir wird die Funktion lediglich einmal aufgerufen. Kommt halt drauf an, was du in dem Button machst..



  • Das funktioniert aber immernoch nicht so wie ich das möchte...

    wofür ist std::vectorstd::string voc; und std::vectorstd::string& voc ???

    Der Compiler sagt das voc nicht deklariert sei und vector is not a member of std.
    std:: kann ich aber durch das using namespace std; eigentlich weglassen.
    Das selbe Problem besteht weiterhin.

    Ich hab das std::vectorstd::string& voc mal weggelassen und eine normale Funktion gemacht... auf die bei jedem Button-klick zurückgegriffen wird.
    Die Variablen sind trotzdem "weg".



  • Das war rein prinzipiell, wies geht. Du musst an die Funktion eine Referenz (oder halt auch einen Zeiger) auf die Liste gebeben, dann kannst du die Liste füllen und wenn die Funktion fertig ist, hat der Aufrufer seine gefüllte Liste.

    Das std::vector war ein Hinweis, dass es mit einem Standardcontainer wesentlich einfacher geht, als mit einem Array. (ist auch dynamisch).

    btw:

    breite =+ 1;
            if(breite >= 6)
            {
                breite = 0;
                hoehe =+ 1;
            };
    

    Bist du sicher, dass du hier 'breite =+ 1' haben willst? - Da weist du nämlich breite immer 1 zu. Mehr nicht. Wenn du inkrementieren willst, dann mach das so:

    breite += 1; // oder ++breite;
            if(breite >= 6)
            {
                breite = 0;
                hoehe += 1; // oder alternativ ++hoehe;
            };
    


  • Ich habe es jetzt etwas anders Probiert.
    Meine Überlegung:
    Funktion in Funktion aufrufen -> Strings können genutzt werden
    Funktion mit return & strings beenden -> Strings können in der Buttonclickfunktion verwendet werden.

    Das müsste theoretisch funktionieren. Der Compiler bringt aber Fehler bei dem { der Funktion vokabeluebergabe() -> "a function-definition is not allowed here before '{' token".
    Ich weis nicht was daran falsch sein soll.

    Wisst ihr was man da machen kann?
    PS: Ich will nicht jedes mal nochmal alles neu einlesen!

    einlesen()	
    {
    	int hoehe = 0;
    	int breite = 0;
    	int vokabelzaehler = 0;
    	string temp = "";
    	string lektion = "";
    	string vokabel [6][100];
    
    	ifstream lektiontxt("lektion.txt");
    	getline(lektiontxt, lektion);
    
    	ifstream datei(lektion.c_str());
    
    	while(!datei.eof())
    	{
            getline(datei, temp);
            vokabel [breite][hoehe] = temp;
    
            breite =+ 1;
            if(breite >= 6)
            {
                breite = 0;
                hoehe =+ 1;
            };
    
            vokabelzaehler = hoehe;
        }
    
    	   void vokabeluebergabe(int hoch, int breit1, int breit2, int breit3, int breit4, int breit5, int breit6)
           {
                string vokabel1 = vokabel [breit1][hoch];
                string vokabel2 = vokabel [breit2][hoch];
                string vokabel3 = vokabel [breit3][hoch];
                string vokabel4 = vokabel [breit4][hoch];
                string vokabel5 = vokabel [breit5][hoch];
                string vokabel6 = vokabel [breit6][hoch];
    
                return vokabel1 + vokabel2 + vokabel3 + vokabel4 + vokabel5 + vokabel6; 
             }
    
    }
    
    void LVTFrm::WxButton1Click(wxCommandEvent& event)
    {
        vokabeluebergabe(3,1,2,3,4,5,6);
    }
    


  • Das hatten wir vor kurzem schon: http://www.c-plusplus.net/forum/viewtopic-var-t-is-250919.html

    Lokale Funktionen sind in C++ nicht erlaubt!



  • Hast du dann eine andere Variante, wie ich auf das array auch noch von einer anderen Stelle zugreifen kann?



  • Parameter ist das magische Wort. Und wenn du kein anständiges Design hin bringst, dann gehts halt über globale Variablen..



  • Mit Parametern habe ich doch gearbeitet... siehe letzten Post...
    Das es nicht möglich ist eine Funktion in eine Funktion zu bringen stellt für mich ein Problem dar, weil ich nicht die ganze Datei immer wieder neu einlesen möchte



  • Du machst da einfach eine Vokablen Klasse und dann hast du da eine Funktion, die z.B load heisst und wo du das File angeben kannst. Dann liest du das ganze ein und hälst dann die Liste in der Klasse. Und dann kannst du weitere Funktionen definieren.

    Ich habe irgendwie das Gefühl, dass du die Grundlagen nochmal anschauen solltest. Du hast da eine Funktion ohne Rückgabetyp und die (fälschlicherweise) in der Funktion definierte Funktion hat den Rückgabetyp void du gibst aber etwas zurück..


Log in to reply