Dynamische Arrays mit ...



  • Gibt's ein kurzes Beispiel - wie soll man das anwenden?



  • Schau mal ob Du mit diesem link was anfangen kannst.
    oder diesen Link

    Sehr kuzres Beispiel:

    #include <vector>
    
    std::vector<int> test;
    
    test.push_back(1);
    test.push_back(2);
    
    int a = test[0];
    a = test[1];
    

    Natürlich hast Du noch mehr Möglichkeiten mit dem Vector aber ich denke das würde erst mal erschlagend wirken ?!

    [ Dieser Beitrag wurde am 24.04.2003 um 16:59 Uhr von Knuddlbaer editiert. ]



  • gibt es etwas "einfacheres" - evtl array manuell redimensionieren: in der art:

    int test[100];

    redim test[1000];



  • int* asd = new int[10];
    ...
    delete[] asd;
    asd = new int[15];
    


  • Einen redim gibt es nicht.

    Bei einem "redim" muss folgendes gemacht werden:

    Neuer Speicher muss aufgetrieben werden
    alle alten Elemente müssen in den neuen Speicher geschrieben werden
    alter Speicher muss freigegeben werden.

    Beschreib mal was Du mit dem Vector vor hast.



  • anstatt irgendeinem redim sollte man lieber realloc benutzen 😉 . Dies hätte aber zur Folge, dass man den Speicher auch mit malloc und free anfordern bzw. löschen muss und das ist in C++ schlicht und einfach k*cke 😉 . Dynamischer Speicher kann über vector, deque etc. aus der STL ziemlich einfach gehandhabt werden.



  • Original erstellt von Knuddlbaer:
    **Einen redim gibt es nicht.
    **

    Einspruch! realloc heisst es in C.



  • Original erstellt von Lars:
    [quote]Einspruch! realloc heisst es in C.

    Ich glaub Knuddlbaer wollte nur sagen, dass es keinen redim-Operator in C++ gibt 😉



  • Hm, realloc kenn isch nich 🤡 *zugeb*

    Ich kenn das redim was oben angesprochen wurde noch aus VB und dieses verhalten bekommt man nich in C hin.

    Hm, mich würde eher interessieren was TS mit dem vector vorhat. Ich denke so komplex ist der std::vector nicht. Und man hat doch viele vorteile mit 🤡

    Würde ihm den Vector gerne näher bringen, am besten direckt am Beispiel seines Problemes.



  • vector<int> asd(10);
    ...
    asd.resize(15);
    


  • <TS>: std::vector wird automatisch vergrößert wenn zusätzliche Elemente per push_back() angehängt werden, es gibt aber auch noch reserve(), resize(), back_inserter() uswusf



  • Naja ich programmiere einen Konverter Basic->C(++). Und da will ich unbedingt dynamische Felder haben - das ist allerdinst nicht einfach zu realisieren:

    Am optimalsten wäre es, wenn alles automatisch freigegeben wird, was ich zuvor belegt habe. Wenn ich new benutze, dann muss ich mit delete freigeben (soweit ich weiß). Wenn ich malloc benutze, dann muss ich mit free freigeben. ich suche irg. was automatisches - wie bei normalen arrays, variablen...

    int test()
    {

    int x[...] //dynamisches Feld erstellen

    if ..... return ...; //autom. x freigeben

    int y[...] //dynamisches Feld erstellen

    if ..... return ...; //autom x,y freigeben
    }

    in diesem Code kann int x reserviert werden und bei return muss es freigegeben werden. Es kann aber x und y reserviert werden - dann müssen beide freigegeben werden. Es ist fast unberechenbar was alles freigegeben werden muss (stell euch vor es gibt noch IF's usw...). Was kann man da blos machen?

    Das dabei Werte verlorengehen - ist halbsoschlimm - nur es muss ordentlich freigegeben werden - ich finde keine Lösung

    Wenn es geht, dann wäre mir irgendwas C-Kompatibles noch lieber...



  • In C gibt es sowas nicht, da ist malloc/ realloc/ free das Höchste der Gefühle.
    Lass Dir einen guten Tip geben und arbeite Dich in die Verwendung von std::vector ein, der ist extrem praktisch.



  • sehr schade - dann muss ich alles irgendwie faken...



  • Was heißt hier faken?

    Wenn Du Basic nach C++ konvertieren möchtest wird Dir wohl nichts anderes übrig bleiben!



  • *ggg*

    jo wenn c(++) sowas (automatisches) hätte, dann müsste ich nix faken... egal...



  • std::vector wäre imo am besten geeignet.
    basic macht intern sicher etwas ähnliches. "magische" funktionen gibt es nicht



  • Original erstellt von <TS>:
    jo wenn c(++) sowas (automatisches) hätte, dann müsste ich nix faken... egal...

    vector, list,...
    aber auch smartpointer

    es gibt vieles in C++, aber du kannst nix 1:1 von einer anderen sprache übernehmen... das geht einfach nicht!
    (sonst würden ja alle in basic programmieren und dann nach C++ konvertieren lassen :p)



  • ja da gibt es schon was - nur ich möchte unbedingt dass es automatisch gelöscht wird - sonst kann ich ja statt vector auch normale speicherfunktionen von C nehmen...



  • Hi!

    Der Vector entfernt seine Elemente automatisch.

    class MyClass
    {
    [...]
    }

    foo()
    {
    std::vector<MyClass> test;

    } // Lebensende von test

    Jedes MyClass element würde gelöscht. Destruktur aufgeurfen etc.

    foo()
    {
    std::vector<MyClass *> test;
    }

    Hier ist das Element ein Zeiger. Dieser wird gelöscht. Der Speicher auf den der Zeiger zeigt wird NICHT gelöscht.

    Nun läge es nahe eine Klasse zu schreiben die das übernimmt.
    Diese soll den Speicher anlegen bzw. den angelegten Speicher entgegen nehmen, ihn halten. Beim zerstören dieser Klasse könnte man den Speicher der gehalten wird zerstören.

    Dieses bieten Dir die oben angsprochenen auto_ptr .

    Lies dich da dann aber ein, beim Zuweisen wird der "Besitz" des Speichers gewechselt. Alternativ könntest Du hier dann auch referenzzählung machen.

    Das Redim bekommst Du also leider nicht ohne Arbeit hin.

    Mit a.at(index) kannst Du prüfen lassen ob der index legal ist mit dem zugegriffen wird.

    Alles das müsstest Du selbst implementieren.... 🤡

    [ Dieser Beitrag wurde am 25.04.2003 um 19:11 Uhr von Knuddlbaer editiert. ]

    [ Dieser Beitrag wurde am 25.04.2003 um 19:12 Uhr von Knuddlbaer editiert. ]


Anmelden zum Antworten