return 2d Array



  • Hallo,

    ich habe versucht eine "Box" auf dem Bildschirm auszugeben. Hat auch Funktioniert, also hatte ich die einzelnen Zeichen in ein char Array gepackt. Auch das hatte funktioniert. Nur nun stehe ich vor dem Problem, wie gebe ich das 2d-Array zurück an die main-Funktion? Habe hier schon einen Ansatz:

    char *createBox ()
    {
        char box [11][21];
        char (*_box)[21] = box;
    
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j<20;j++)
            {
                if (i == 0 || i == 9 || j == 0 || j == 19)
                {
                    box[i][j] = '#';
                } else
                box[i][j] = ' ';
            }
        }
        return _box[0];
    }
    

    Welchen Typ brauche ich, um das Array zu "erhalten"?

    grüße,



  • Möglichkeit 1: (in Struct oder Klasse kapseln)

    struct box {
      typedef char c21[21];
      c21 data[11];
      c21      & operator[](int idx)       {return data[idx];}
      c21 const& operator[](int idx) const {return data[idx];}
    };
    
    box createBox()
    {
      box result;
      result[0][0] = '#';
      ...
      result[10][20] = '#';
      return result;
    }
    

    Möglichkeit 2: (Standardcontainer benutzen)

    typedef std::vector<std::vector<char> > box;
    
    box createBox()
    {
      box b (11);
      for (int k=0; k<11; ++k) b[k].resize(21);
      ...
      return b;
    }
    

    (beides ungetestet)

    Es gibt natürlich noch mehr, aber das sind die zwei Sachen, dir mir spontan einfallen und halbwegs Sinn machen.

    kk



  • Du müsstest das Array schon in nen Vektor oder so packen.
    Arrays lassen sich nicht kopieren, daher kannst du es nur per Referenz oder Zeiger zurückgeben, jedoch hast du dann ein Problem, das würde dann zu einem Laufzeitfehler führen.
    Denn wie du ja hoffentlich weißt, soll man niemals Zeiger oder Referenzen auf lokale Objekte zurückgeben, da des Objekt nach der Funktion ja gar nicht mehr exisitiert.

    Hoffe konnte dir helfen

    Lg freeG



  • Dein Code ist sowieso etwas gefährlich, da das Objekt box nach Funktionsende nicht mehr gültig ist. Du solltest es wenn dann auf dem Heap erstellen (mit new char[x][y] ) und nachher per delete[] wieder freigeben.
    /Edit: mist einer schneller gewesen^^



  • typedef char (*Ptr)[21];
    Ptr createBox ()
    {
        static char box [11][21];
        char (*_box)[21] = box;
    
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j<20;j++)
            {
                if (i == 0 || i == 9 || j == 0 || j == 19)
                {
                    box[i][j] = '#';
                } else
                box[i][j] = ' ';
            }
        }
        return _box;
    }
    

    🕶 😃


Anmelden zum Antworten