Von einer Funktion auf eine andere zugreiffen?



  • Hallo!

    Wir sollen ein Spiel (4 Gewinnt) Programmieren.
    Hab dazu drei Funktionen deklariert.

    Die Funktion main, die die beiden anderen aufruft.
    Dann eine Funktion "make_it".
    Diese Funktion erzeugt das Spielfeld, und zeichnet die Kanten usw.

    int make_it()
    {
        typedef vector<string> Zeile;
        typedef vector<Zeile> Matrix;
    
        Matrix Feld(17, Zeile(15, "   " )); // Vektorgröße wird festgelegt
    
        int SpaltenNr = 1; // Variable für die Nummerrierung der Spalten
    
        // Feld wird erstellt (Striche usw.)
        for (int a = 0; a < 17; a++)
        {
            for(int b = 0; b < 15; b++)
            {
                // Spielfeld wird "gezeichnet"
            }
        }    
        return 0;
    }
    

    Dann noch eine Funkton "draw_it". Diese Funktion soll den Vektor bzw. die Matrix ausgeben.
    Sagt aber das die Variablen unbekannt sind. Auch wenn ich make_it.Variablenname schreibe meckert er.

    Was mache ich falsch??

    int draw_it()
    {   
        // Spielfeld ausgeben
        for (Matrix::iterator zeile=Feld.begin(); zeile!=Feld.end(); zeile++)
        {
            for (Zeile::iterator spalte=zeile->begin(); spalte!=zeile->end(); spalte++)
            {
                cout << *spalte;
            }
            cout << endl;
        }
        return 0;
    }
    

    Danke schon mal für eure Hilfe!

    Gruß

    Christian



  • Woher kennt draw_it() zeile und spalte 😕

    mfg JJ



  • Die Funktion draw_it() kennt halt nicht die Variablen:
    - Zeile
    - Spalte
    - Feld
    - Matrix

    Dass ist ja mein Problem.
    Wie sage ich der Funktion draw_it() das die Variablen aus der Funktion make_it() gemeint sind??

    Gruß

    Christian



  • Da globale Variablen keine gute Lösung sind musst du wohl oder übel beide
    Variablen als Parameter übergeben. Da beide Funktionen auf die gleichen Daten
    zugreifen sollen übergibst du sie am besten in beiden Funktionen als Parameter

    mfg JJ



  • John Doe schrieb:

    Da beide Funktionen auf die gleichen Daten
    zugreifen sollen übergibst du sie am besten in beiden Funktionen als Parameter

    ⚠ Am besten als konstante Referenz.

    Gruss



  • Würdet ihr mir das bitte etwas genauer erklären??
    Ich habe noch nicht soviel Ahnung.

    Wenn ich schreibe

    return Feld;
    

    kommt eine Fehlermeldung von G++ (error: cannot convert 'make_it()::Matrix' to 'int' in return)

    Danke!

    Gruß

    Christian



  • Hi!

    Hast du noch nie etwas von Parametern gehört?:

    void meineFunktion(int param1, char* param2)
    {
      /* ... */
    }
    

    Code-Hacker



  • int draw_it(const vector<vector<string> >& Feld)
    

    draw_it benötigt übrigens die gleichen typedefs wie make_it, wenn du schon 'Zeile' und 'Matrix' verwenden willst.



  • Danke Leute, aber irgendwie bin ich zu blöd dazu.

    Ich poste euch hier mal den ganzen Code:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    // Spielfeld wird erstellt
    int make_it()
    {
        typedef vector<string> Zeile;
        typedef vector<Zeile> Matrix;
    
        Matrix Feld(17, Zeile(15, "   " )); // Vektorgröße wird festgelegt
    
        int SpaltenNr = 1; // Variable für die Nummerrierung der Spalten
    
        // Feld wird erstellt (Striche usw.)
        for (int a = 0; a < 17; a++)
        {
            for(int b = 0; b < 15; b++)
            {
                // Spielfeld wird "gezeichnet"
                if (a%2 == 1 && b%2 == 0)
                {
                    Feld.at(a).at(b)="|";
                }
    
                if (a%2 == 0 && b%2 == 0)
                {
                    Feld.at(a).at(b)="+";
                }
    
                if (a%2 == 0 && b%2 == 1)
                {
                    Feld.at(a).at(b)="---";
                }
    
                if (a == 2 && b%2 == 1)
                {
                    Feld.at(a).at(b)="===";
                }
    
                if (a == 1 && b%2 == 1)
                {
                    string temp;
                    temp = temp + " " + char((SpaltenNr + 48)) + " ";
                    Feld.at(a).at(b)= temp;
                    SpaltenNr++;
                }
    
            }
        }    
        return 0;
    }
    
    //----------------------------------------------------------------------------------------------------------------------------------------------------
    
    // Spielfeld wird gezeichnet
    int draw_it()
    {
        // Spielfeld ausgeben
        for (Matrix::iterator Zeile=Feld.begin(); Zeile!=Feld.end(); Zeile++)
        {
            for (Zeile::iterator spalte=zeile->begin(); Spalte!=Zeile->end(); Spalte++)
            {
                cout << *Spalte;
            }
            cout << endl;
        }
        return 0;
    }
    
    //----------------------------------------------------------------------------------------------------------------------------------------------------
    
    int main ()
    {
        make_it();
        draw_it();
    }
    

    Wo muss ich jetzt was ändern??


Anmelden zum Antworten