Dynamisches Array macht Probleme



  • Hi,

    ich erstelle mir mit folgendem Code ein dynamisches Array

    class Model
    {
      private:
        Feld** array;
    
      public:
       Model(int x, int y)
       {
         array = new Feld*[x];
         for (int i = 0; i < x; i++)
         {
            array[i] = new Feld[y];
         }
    
         array[0][0].Color = clRed; //nur zum Test
       }
    };
    

    und speichere es als Attribut einer Klasse / Objekt ab.

    Allerdings erscheint eine Fehlermeldung (EAccess Violation), wenn ich

    Model* model = new Model(3,3);
    

    ausführe.

    Woran liegt das?



  • Hi,

    Fullspast schrieb:

    private:
        Feld** array;
    

    Wie ist denn Feld abgeleitet?



  • Hi,

    Feld sieht bei mir so aus:

    class Feld : public TLabel
    {
       private:
         unsigned short int belongsToPlayer;
    
       public:
         __fastcall Feld(AnsiString name = NULL,
              TComponent* Owner = NULL,
              TWinControl* parent = NULL,
              unsigned int width = NULL,
              unsigned int height = NULL,
              unsigned int top = NULL,
              unsigned int left = NULL)
         : TLabel(Owner)
         {
           this->Color = clBlack;
           this->AutoSize = false;
           this->Font->Color = clWhite;
           this->Parent = parent;
           this->Caption = " ";
           this->Top = top;
           this->Left = left;
           this->Width = width;
           this->Height = height;
           this->Name = name;
           this->belongsToPlayer = NULL;
         }
    };
    

    Meinst du, dass es nicht geht, weil ich NULL als Standartwert genommen habe?
    Das habe ich gemacht, um erstmal zu testen, ob das dynamische Array überhaupt funktioniert.

    Aber wie könnte ich hier überhaupt Werte mitgeben? Ich wüsste nicht, wie man das schreibt

    array = new Feld*[x];
    

    MfG
    Fullspast



  • Hi,

    ich habe gerade versucht, eine andere Klasse in das Array zu legen, was problemlos funktioniert:

    class Testklasse
    {
       public:
         char test;
    };
    
    class Model
    {
      private:
        Testklasse** array;
    
      public:
       Model(int x, int y)
       {
         array = new Testklasse*[x];
         for (int i = 0; i < x; i++)
         {
            array[i] = new Testklasse[y];
         }
       }
    };
    

    Das Problem ist wohl einfach, dass TLabel keinen Konstruktor ohne Parameter anbietet und ich das deshalb so nicht machen kann.

    Gibt es eine andere Lösung, wie ich beliebig viele Elemente ablegen kann, ohne es vorher wissen zu müssen?



  • Hi,

    das geht bei mir so :

    class Model 
    { 
      private: 
        Testklasse* array[];
    
      public: 
       Model(int x, int y) 
       { 
         array[x] = new Testklasse;
         for (int i = 0; i < x; i++) 
         { 
            array[i] = new Testklasse; 
         } 
       } 
    };
    

    Wie wolltest du den Labels das Parent zuweisen. Das ist glaub ich der Knackpunkt.

    kpeter



  • Ich halte das Design schon für nicht gut. Das Modell sollte keine Details über seine Visualisierung kennen und daher auch keine TLabels enthalten.
    Eine neue Komponente von TLabel abzuleiten, nur um ein einzige Attribut zu ergänzen, das bestimmt, zu welchem Spieler das Label gehört verletzt mMn das gleiche Prinzip: Die Visualisierung sollte keine Modelldetails kennen, dafür ist das Modell da.

    Ausserdem gibt den Datentyp unsigned short int nicht, das ist entweder unsigned int oder unsigned short, aber nicht beides.



  • DocShoe schrieb:

    Ausserdem gibt den Datentyp unsigned short int nicht, das ist entweder unsigned int oder unsigned short, aber nicht beides.

    Sicher? Soweit ich weiß, ist sowohl short int als auch long int und vermutlich auch long long int erlaubt. Weder BCC noch Comeau haben ein Problem mit unsigned short int .



  • audacia schrieb:

    DocShoe schrieb:

    Ausserdem gibt den Datentyp unsigned short int nicht, das ist entweder unsigned int oder unsigned short, aber nicht beides.

    Sicher? Soweit ich weiß, ist sowohl short int als auch long int und vermutlich auch long long int erlaubt. Weder BCC noch Comeau haben ein Problem mit unsigned short int .

    Hm, habe jetzt den Stroustrup grade nicht zur Hand, aber ich habe das in 15 Jahren noch nirgendwo gesehen, und daher bin ich davon ausgegangen, dass das so nicht korrekt ist. Gut möglich, dass ich mich da auch irre.


Anmelden zum Antworten