array beliebiger dimension dynamisch anlegen...



  • hi,

    ich möchte ein array beliebiger dimension dynamisch anlegen. sprich, wenn vom nutzer dimension 4 und größe 5 angegeben wird hätte ich gerneein 4-dimensionales array mit der ausprägung 5 in jeder dimension. leider weis ich nicht wie ich
    die zeiger auf mein array dynamisch allokiere.
    wie lege ich also eine datenstrukur wie diese:

    int *field = (int *)malloc(size*sizeof(int));
    

    für beliebige dimensionen(also quasi " **...**field ") an?

    danke schonmal für eure hilfe

    snuuts



  • Dafür gibt es in C++ keine einfache Lösung. Dir wird wohl nichts anderes übrig bleiben dein Array in einem flachen std::vector abzulegen und dann manuell die Position innerhalb der verschiedenen Dimensionen in einen Index umzurechnen.

    Eventuell kann man Proxy-Klassen verwenden, um soetwas array[x1][x2][x3] usw. trotzdem zuzulassen. Aber das wird dann richtig kompliziert, (ohne dir persönlich nahetreten zu wollen) wohlmöglich zu kompliziert für jemanden, der glaubt, daß es eine gute Idee ist in C++ malloc zu verwenden.



  • mit std::vector sollte es doch gehen, dass man die einfach beliebig ineinander schachtelt.



  • Z2 schrieb:

    Dafür gibt es in C++ keine einfache Lösung. Dir wird wohl nichts anderes übrig bleiben dein Array in einem flachen std::vector abzulegen und dann manuell die Position innerhalb der verschiedenen Dimensionen in einen Index umzurechnen.

    Eventuell kann man Proxy-Klassen verwenden, um soetwas array[x1][x2][x3] usw. trotzdem zuzulassen. Aber das wird dann richtig kompliziert, (ohne dir persönlich nahetreten zu wollen) wohlmöglich zu kompliziert für jemanden, der glaubt, daß es eine gute Idee ist in C++ malloc zu verwenden.

    jo, habs schon befürchtet, dass ich das flach darstellen muss, trotzdem danke!
    bzgl malloc: "komme halt von C " und fang grad erst mit c++ an :-).



  • stl schrieb:

    mit std::vector sollte es doch gehen, dass man die einfach beliebig ineinander schachtelt.

    Nicht, wenn die Tiefe der Verschachtelung erst zur Laufzeit feststeht.



  • Hallo,

    Wie wärs denn mit boost::multi_array



  • Braunstein schrieb:

    Hallo,

    Wie wärs denn mit boost::multi_array

    Das duerfte auch nix bringen weil der Templateparameter schon zur Compile-Zeit feststehen muss.



  • Hem, weiß jetz nicht genau wo das Problem sein soll. Man muß schon etwas basteln, aber das ist schnell gemacht.

    int zeilen = 5;
    std::vector<std::vector<int>> felder(zeilen);
    
    int spalten = 10;
    for(int i=0; i < felder.size(); i++)
        felder.at(i).resize(spalten);
    
    // Zugriff auf Zeile 2 und Spalte 8:
    felder.at(1).at(7);
    

    Oder meinstest du was anderes? Wenn man das noch schön in einer andere Klasse verpackt, kan man das komfortabler machen.



  • Z2 schrieb:

    stl schrieb:

    mit std::vector sollte es doch gehen, dass man die einfach beliebig ineinander schachtelt.

    Nicht, wenn die Tiefe der Verschachtelung erst zur Laufzeit feststeht.

    Also der Sinn eines Vectors ist es, das man erst zur Lauftzeit die Größen setzt. Sonst wäre der Vector witzlos.



  • Artchi schrieb:

    Hem, weiß jetz nicht genau wo das Problem sein soll. Man muß schon etwas basteln, aber das ist schnell gemacht.

    Und was machst du, wenn du zur Laufzeit feststellst, dass du drei Dimensionen brauchst?



  • OK, die Dimensionsanzahl ist schon schwieriger. Stimmt.



  • Artchi schrieb:

    Z2 schrieb:

    stl schrieb:

    mit std::vector sollte es doch gehen, dass man die einfach beliebig ineinander schachtelt.

    Nicht, wenn die Tiefe der Verschachtelung erst zur Laufzeit feststeht.

    Also der Sinn eines Vectors ist es, das man erst zur Lauftzeit die Größen setzt. Sonst wäre der Vector witzlos.

    Die Größe ja, aber (leider) nicht die Schachtelungstiefe - ein vector ist nunmal eine eindimensionale Datensammlung (und auch wenn du vector<vector<...> > schreibst, mußt du zur Compilezeit wissen, wieviele Dimensionen du verwalten willst - wie groß die jeweils werden, kannst du später definieren).



  • Artchi schrieb:

    Z2 schrieb:

    stl schrieb:

    mit std::vector sollte es doch gehen, dass man die einfach beliebig ineinander schachtelt.

    Nicht, wenn die Tiefe der Verschachtelung erst zur Laufzeit feststeht.

    Also der Sinn eines Vectors ist es, das man erst zur Lauftzeit die Größen setzt. Sonst wäre der Vector witzlos.

    Wir reden hier nicht von der Größe, sondern von der Tiefe der Verschachtelung:

    std::vector<irgendwas>

    oder

    std::vector<std::vector<irgendwas> >

    usw.



  • Ja, sorry, weiß ich jetzt mittlerweile! 😃



  • Die einzige Frage die sich mir jetzt stellt: wie will man zur Laufzeit dann beliebige Dimensionsanzahlfälle behandeln? Ich muß ja irgendwo eine Syntax haben, die auf die Dimensionen zugreift. Genauso müsste ich das Problem auch mit dem Definieren der Dimensionen angehen.

    Lösen lässt sich das Problem ja...



  • Artchi schrieb:

    Ich muß ja irgendwo eine Syntax haben, die auf die Dimensionen zugreift. Genauso müsste ich das Problem auch mit dem Definieren der Dimensionen angehen.

    Das Problem liese sich vermutlich lösen, indem man die Indizes (und Dimensionsgrößen) auch als Vector übergibt.

    PS: Eventuell wären auch val_array und (g)slice's ein Ansatz, um so ein mehrdimensionales Array zu bauen.



  • CStoll schrieb:

    Das Problem liese sich vermutlich lösen, indem man die Indizes (und Dimensionsgrößen) auch als Vector übergibt.

    jepp, genau das mach ich auch gerade 🙂


Anmelden zum Antworten