Welche Sprache lernen ?



  • STF-DIR schrieb:

    Wieso denn new int[2] ???

    Weil die anfängliche Kapazität 2 ist,

    und wieso kapazitaet(2) ?????

    Willkür seitens des Entwicklers. Die Klasse hat eine Kapazität, die größer ist als die Menge der Daten. Das hat den Zweck, dass das Datenarray nicht bei jedem Anfügevorgang vergrößert werden muss. Das spart Zeit, verschwendet aber dafür ein wenig Speicher.

    ein neuer Zeiger nf mit der kapazitaet*2 ???
    Wieso ?

    Wiederum Willkür. Wenn das Array schließlich vergrößert werden muss, wird gleich Platz für doppelt soviele Elemente angelegt. Grund siehe oben.

    feld=nf; // und hier plötzlich dem eben gelöschten Zeiger etwas zuweisen ?
    Wieso geht das ?

    Wieso geht das nicht? Delete löscht nicht den Zeiger, sondern das, auf das der Zeiger zeigt. Delete macht die Kiste kaputt, nicht den Zettel. Den Zettel kannst du dann neu beschriften, das macht die Zuweisung an den Zeiger.

    Technisch könnte das so aussehen, das Sie ein neue, größeres Array dynamisch reservieren, die Werte des alten Arrays in das neue kopieren und das alte Array löschen.
    ...
    So, das ist GENAU der Text aus dem Buch.

    Und das ist genau das, was in diesem Code passiert.

    int * kiste_pointer = new int[2];

    Kiste_pointer ist nur der Zettel auf dem steht WO die Kiste ( im SPeicher ) zu finden ist.
    Das "new int[2]" wäre dann eigentlich die physiche Kiste ??

    Fast, new int[2] erzeugt die Kiste und liefert dir einen Zettel.



  • STF-DIR schrieb:

    ...Hierbei ist mir schonmal unklar was es mit der kapazitaet auf sich hat...

    Ich will mich nicht groß einmischen (Du hast hier schon deutlich bessere Ratgeber als mich :D) und vielleicht ist es auch nicht neu, aber Vieles wird leichter, wenn man weiß, dass

    http://de.wikipedia.org/wiki/Kapazität schrieb:

    ... Kapazität (v. lat. capacitas „Fassungsvermögen“ ...

    ist.
    Wenn Du überall mal "Fassungsvermögen" liest, wo "Kapazität" steht, wird vielleicht einiges klarer.
    Wenn Du das schon wusstest: Vergiss mein Post und entschuldige Deine vergeudete Lebenszeit... 🙂

    Gruß,

    Simon2.



  • Hallo,

    erst mal dank an MFK und Simon2 für die Antworten.
    MFK ganz besonders für die große Mühe die sich aber wirklich gelohnt hat, denn
    da haben wir den Fehler :

    Wieso geht das nicht? Delete löscht nicht den Zeiger, sondern das, auf das der Zeiger zeigt. Delete macht die Kiste kaputt, nicht den Zettel. Den Zettel kannst du dann neu beschriften, das macht die Zuweisung an den Zeiger.

    Das ist es, ich hatte das so verstanden das ein delete[]() den Zeiger samt der Kiste löscht und danach gar nix mehr da ist.

    Ok,dann hab ich das jetzt auch endlich kapiert wieso
    feld = tempFeld; geht und das TempFeld dann icht gelöscht werden kann...klar.
    Danke...endlich...

    Das mit der kapazität .. naja, warum er das gemacht hat und einen so durcheinander bringt wird wohl sein Geheimnis bleiben 🙂

    Ok, dann danke ich euch allen nochmals !!

    Matthias



  • STF-DIR schrieb:

    ..
    Das mit der kapazität .. naja, warum er das gemacht hat und einen so durcheinander bringt wird wohl sein Geheimnis bleiben :-)...

    Nicht ganz. Immerhin muß man einmal festlegen, wie groß die Kiste am Anfang sein soll .... und um wieviel sie jeweils vergrößert werden soll.

    Gruß,

    Simon2.



  • Hallo,

    laut diesem Konstruktor :

    public: 
      DynIntFeld(): feld(new int[2]), groesse(0), kapazitaet(2) 
      {}
    

    welcher mit

    DynIntFeld f;
    

    ausferufen wird erstellt er einen IntArray mit 2 Elementen, IntArray[0] und IntArray[1] ja.

    Aber warum am Anfang gleich 2 ?

    Matthias



  • Du liest schon was hier geschrieben wird oder müssen es einfach 5 Leute stehts wiederholen ?!

    und wieso kapazitaet(2) ?????

    Willkür seitens des Entwicklers. Die Klasse hat eine Kapazität, die größer ist als die Menge der Daten. Das hat den Zweck, dass das Datenarray nicht bei jedem Anfügevorgang vergrößert werden muss. Das spart Zeit, verschwendet aber dafür ein wenig Speicher.



  • STF-DIR schrieb:

    ...
    Aber warum am Anfang gleich 2 ?

    Matthias

    Simon2 schrieb:

    ...Immerhin muß man einmal festlegen, wie groß die Kiste am Anfang sein soll ...

    ... und da er sich vermutlich gedacht hat "naja, 2 kommen meistens sowieso irgendwann rein", hat er wohl "auf Vorrat" geplant.
    So kann er sich beim ersten Add diesen Teil (also das Neuanlegen, Kopieren und Löschen) sparen:

    if(groesse>=kapazitaet) {
          int* nf=new int[kapazitaet*2];
          for(int i=0; i<groesse; ++i)
            nf[i]=feld[i];
          delete[](feld);
          feld=nf;
          kapazitaet*=2;
        }
    

    Im letzten Statement kommt die Strategie zum Ausdruck: "Je öfter ich vergrößern muß, umso mehr hole ich mir jedesmal auf Vorrat !" (beim ersten Mal 4, dann 8, dann 16 ....)
    Ist halt der Versuch,

    • weder einen Haufen überflüssigen Speichers zu reservieren (zu hohe Kapazität)
    • noch zu oft neu reservieren zu müssen (zu kleine Kapazität)

    Gruß,

    Simon2.



  • Simon2 schrieb:

    STF-DIR schrieb:

    ...
    Aber warum am Anfang gleich 2 ?

    Matthias

    Simon2 schrieb:

    ...Immerhin muß man einmal festlegen, wie groß die Kiste am Anfang sein soll ...

    ... und da er sich vermutlich gedacht hat "naja, 2 kommen meistens sowieso irgendwann rein", hat er wohl "auf Vorrat" geplant.
    So kann er sich beim ersten Add diesen Teil (also das Neuanlegen, Kopieren und Löschen) sparen:

    if(groesse>=kapazitaet) {
          int* nf=new int[kapazitaet*2];
          for(int i=0; i<groesse; ++i)
            nf[i]=feld[i];
          delete[](feld);
          feld=nf;
          kapazitaet*=2;
        }
    

    Im letzten Statement kommt die Strategie zum Ausdruck: "Je öfter ich vergrößern muß, umso mehr hole ich mir jedesmal auf Vorrat !" (beim ersten Mal 4, dann 8, dann 16 ....)
    Ist halt der Versuch,

    • weder einen Haufen überflüssigen Speichers zu reservieren (zu hohe Kapazität)
    • noch zu oft neu reservieren zu müssen (zu kleine Kapazität)

    Gruß,

    Simon2.

    Hallo,

    ja siehste, so schnell kanns gehen und man bekommt einfach mal ne erschöpfende Antwort...danke Simon2 !

    Anscheinend gibts hier ja doch Leute die verstehen das hier auch mal jemand schreibt der nicht alles gleich auf Anhieb versteht und mit anchen Sachen eben seine Probleme hat.

    Wenn ich die mal mit in meinen Flieger nehme dann verstehen sie sicher auch nicht alles auf Anhieb.

    Also danke nochmals !!

    Matthias



  • STF-DIR schrieb:

    ...danke Simon2 !...

    Gern geschehen.

    Gruß,

    Simon2.



  • STF-DIR schrieb:

    Anscheinend gibts hier ja doch Leute die verstehen das hier auch mal jemand schreibt der nicht alles gleich auf Anhieb versteht und mit anchen Sachen eben seine Probleme hat.

    Wenn das der Fall ist, dann sollte der Fragende aber schon sagen, was er an der Erklärung nicht verstanden hat, und nicht immer wieder dieselbe Frage stellen, als ob er die Antwort gar nicht mitbekommen hätte.


Anmelden zum Antworten