Arrays erstellen, so daß Constructor greift



  • Hallo,

    der Titel läßt schon vermuten, daß ich nicht genau weiß, wie ich das Problem beschreiben soll. Ist aber eigentlich recht einfach:

    IntArray v(7);  // erstellt ein Integer Array der Größe 7
    IntArray v[10]; // erstellt ein Array mit 10 Einträgen mit jeweils einem IntArray (Größe 0)
    

    Meine Frage ist, wie ich beides verbinden kann. Sprich: Ich möchte eine Array mit 10 Einträgen erstellen, in dem in jedem Eintrag ein IntArray der Größe 7 steht. Geht das überhaupt?

    Vielen Dank für jede Hilfe! 🙂

    Dee



  • Seit wann hat C Konstruktoren? (bzw das Problem sollte eine Etage tiefer hingehören :))

    Du kannst bei einem Array auch eine Initialisierungsliste angeben:

    IntArray v[10] = {IntArray(7),IntArray(7),IntArray(7),IntArray(7),IntArray(7),IntArray(7),IntArray(7),IntArray(7),IntArray(7),IntArray(7)};
    

    Oder alternativ definierst du eine resize()-Methode für dein Array, die die Größe nachträglich anpasst:

    InArray v[10];
    for(int i=0;i<10;++i) v[i].resize(7);
    


  • Oh Mist, hab mich so auf das Array versteift, daß ich im falschen Forum gelandet bin. *peinlich sei* Ein Mod möge es bitte verschieben, wenn nötig...

    Die Initialisierung würde zwar gehen, aber das Beispiel mit 10 Einträgen ist auch etwas klein... Ich habe so ca. 5000 Einträge, deren Anzahl auch variert. (Ich würde das ganze dann natürlich mit nem Pointer auf das Array machen.)

    Die zweite Möglichkeit nutze ich derzeit auch tatsächlich. Ich hatte gehofft, es geht etwa schneller bzw. komfortabler.

    Danke & Gruß, Dee



  • Du kannst auch statt eines simplen Arrays einen STL-Container verwenden, da geht das einfacher:

    #include <vector>
    
    std::vector v(10,IntArray(7));
    


  • Das Beispiel ist nicht auf Integer Arrays beschränkt. So habe ich zum Beispiel auch ein VectorArray, in dem dreidimensionale Vektoren zu finden sind.

    Ich hätte dann quasi ein Array, was ähnlich wie double *[3][Anzahl_Vektoren][Anzahl_Arrays] aufgebaut... Ich hätt's nur gern komfortabler. *g*

    Gruß, Dee



  • Du kannst auch die STL-Container ineinander verschachteln, das dürfte etwa so aussehen:

    vector<vector<vector<double> > > ultimate_array(10,vector<vector<double> >(5,vector<double>(7,3.14)));
    

    Aber vermutlich ist es besser, du schachtelst dir die ganze Funktionalität in einer eigenen Klasse, die einen entsprechenden Konstruktor bekommt, z.B.:

    class my_3d_array{
      // erstellt das Array mit sx*sy*sz Elementen und initialisiert alle mit val:
      my_3d_array(double val,int sx,int sy,int sz);
    
      //...
    };
    
    my_3d_array(3.14,10,5,7);
    


  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    Dee schrieb:

    Hallo,

    der Titel läßt schon vermuten, daß ich nicht genau weiß, wie ich das Problem beschreiben soll. Ist aber eigentlich recht einfach:

    IntArray v(7);  // erstellt ein Integer Array der Größe 7
    IntArray v[10]; // erstellt ein Array mit 10 Einträgen mit jeweils einem IntArray (Größe 0)
    

    Meine Frage ist, wie ich beides verbinden kann. Sprich: Ich möchte eine Array mit 10 Einträgen erstellen, in dem in jedem Eintrag ein IntArray der Größe 7 steht. Geht das überhaupt?

    Vielen Dank für jede Hilfe! 🙂

    Dee

    IntArray v[10][7];
    

    oder ausführlicher

    typedef IntArray Elem[7];
    Elem v[10];
    


  • Hallo Camper...

    Mit

    IntArray v[10][7];
    

    erhalte ich nur eine 10x7-"Matrix" mit IntArrays (also 70 Stück), deren Größe aber überall 0 ist. Das gleiche erreicht man mit der Typedef-Definition. Und das will ich ja gerade nicht... Ich hätte gern n IntArrays, welche alle die Größe m haben, welche nur durch einen Konstruktoraufruf

    IntArray(m);
    

    erreicht werden kann.

    Gruß, Dee



  • Arrays haben keinen eigenen Konstruktor, du könntest dort aber eine Initialisierungsliste mit übergeben:

    IntArray v[10][7] =
    {
      {m,m,m,m,m,m,m},
      {m,m,m,m,m,m,m},
      ...
    };
    

    Alternativ verwendest du statt eines Arrays einen STL-Container (z.B. vector) oder eine selbstgeschriebene Array-Klasse.



  • Äh, die IntArray-Klasse ist ja selbst geschrieben... Ich dachte, das wäre klar. 🙂

    Daher ja meine Frage, ob man Allokierung und Initalisierung zusammen machen kann.

    Gruß, Dee



  • Ja, kannst du, aber nicht mit plumpen C-Arrays. Um ein ganzes Paket von IntArray's auf einmal anzulegen und zu initialisieren, benötigst du ein IAArray:

    class IAArray
    {
    public:
      IAArray(int count,int size) : fields(new IntArray[count])
      {
        for(int i=0;i<count;++i) fields[i].resize(size);
      }
      ~IAArray() { delete[] fields;}
    private:
      IntArray* fields;
    };
    


  • Also doch ne neue Klasse dafür. Okay, danke, dann weiß ich bescheid...

    Gruß, Dee



  • Das sagte ich doch bereits (falls du zu faul bist, selber eine zu schreiben, nimm einen STL-Container dafür ;))


Anmelden zum Antworten