Dynamische Arrays mit ...



  • 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. ]



  • So habe was ausprobiert - das scheint zu gehen:

    #include <iostream.h>
    #include <stdlib.h>
    
    class vector
    {
      public:
        int *data;
        int size;
    
        vector(int index)
        {
          size=index;
          data=new int[index];
        };
    
        ~vector()
        {
          delete[] data;
        };
    
        int operator[](int index)
        {
          return data[index];
        };
    
        int getsize()
        {
          return size;
        };
    };
    
    int test()
    {
      vector v(100);
    }
    
    int main()
    {
      system("PAUSE");
    
      for(int i=1;i<=50000;++i)
      {
        test();
    //50.000 Aufrufe X 100 Elemente X 4 = 20.000.000 Bytes
    //Systemmonitor zeigt keine Speicherverluste - OK!
      }
    
      system("PAUSE");
    };
    

    Danke Leute - Es ist zwar nicht ganz was ich wollte - aber das geht schon mal...



  • Nach Funktionsdefinitionen brauchst Du kein Semikolon und außerdem meinten wir eigentlich std::vector, der ist um einiges praktischer.


Anmelden zum Antworten