Variable Anzahl an dynamischen pointern



  • Hi,
    gibt es sowas?
    Ich bin gerade dabei einen Baum zu machen und brauche, je nachdem wie viele bestimmte Knotenpunkte es gibt. Also wenn in meinem Baum 6 Knoten mit von dem Wert vorkommen halt 6.

    Ich habe es probiert mit

    for (int i=0; i<6; i++)
    {
       baum *npointer[i]=new baum;
    }
    

    aber es klappt nicht. Hat jemand ne Idee? Ich verzweifele langsam an diesem Prog ~~


  • Mod

    Wie wäre es mit einem vector von Pointern?



  • Hmm ja ich erinnere mich ganz vage mal sowas gesehen zu haben.
    War das nicht mit ** ? Ich will wirklich nicht faul erscheinen, aber kann mir jemand da die Lösung von sagen? Bin bestimmt noch die ganze Nacht mit dem Programm beschätigt, bin um jede Verkürzung sehr dankbar ^^



  • Geht das so?

    baum **npointer= new baum *[i]
    

    Und wenn ja: greife ich dann mit *npointer[0] auf den ersten pointer zu?





  • ....
    ey komm das ist so eine kleine Frage, die mir die meistens wahrscheinlich in 5 Sekunden beantworten können. Ich hab echt sehr wenig Lust mich jetzt durch diese Seite zu suchen.
    kommt schon 🙂



  • ist es eine hausaufgabe bzw. übung?
    also willst du es selbst schreiben oder darfst/kannst du die standard-bibliothek nutzen?

    std::vector<baum*> my_baum;
    
    my_baum.push_back(new baum);
    /*...*/
    
    //achtung: hier musst du manuell speicher freigeben:
    for(std::vector<baum*>::const_iterator i(my_baum.begin()), e(my_baum.end()); i != e; ++i)
      delete *i;
    
    //my_baum.clear(); -- nur notwendig, wenn du den vector dann wieder verwenden willst - ansonsten passiert das automatisch ohnehin
    

    jz sieht das aber komisch aus, dass x bäume dann ein baum sind.
    also wäre der klassen-name vrmtl mit baum_node etwas intuitiver 😉
    das ganze hat noch ein problem (was dir nicht viel sagen wird, aber ich will es dir nicht vorenthalten, auch wenn es für dich unwichtig ist): du hast keine exceptionsicherheit. wenn irgendwo was fliegt, wird kein speicher frei gegeben (idR macht es das OS nach beendigung des Prozesses trotzdem, aber eben erst dann).

    ansonsten würde es so gehen:

    int size = ???;
    baum** my_baum = new baum[size];
    
    baum[0] = new baum;
    baum[1] = new baum;
    /*...*/
    
    for(int i(0); i != size; ++i)
      delete baum[i];
    
    delete[] baum;
    

    (natürlich auch nicht exception-sicher)
    ist ein wenig frickelig und der weg, den man in C++ wohl niemals verwenden wird - nur der vollständigkeit halber hab ich ihn mal mit hingeschrieben.

    bb

    edit: wenn ich deine antwort so sehe, hast du glück, dass ich den beitrag gerad schon fertig hab... ansonsten hätt ich nicht geantwortet - bei so viel eigeninitiative...

    ps: includes fehlen + ist alles nur so runtergetippt - also tippfehler usw. sind bestimmt drin 😉



  • Danke erstmal.
    Es geht nicht um wenig eigeninitiative. An dem Programm sitze ich jetzt schon über 17 Stunden dran und es ist nur eine Teilaufgabe einer Übung.
    Und es ist nicht so, dass ich dafür so ewig viel Zeit hatte, es gibt nur momentan sehr viel zu tun und da ists doch halbwechs verständlich, wenn man nicht noch so lang rumsuchen will, bis man die Lösung von so nem Problem gefunden hat...?

    Wenn Du ein bestimmtes Werkzeug brauchst hast Du doch auch weder Lust dich durch nen ganze Geräteliste zu wühlen oder dir mit den paar Dingen die Du kennst etwas nützliches zusammen zu basteln (ja, sehr schwache Metapher ich weiß^^). Ist ja nicht so, dass ich durch das sture suchen nach der Lösung sonderlich viel schlauer werden würde 🙂

    Die Lösung die Du als zweites beschreibst hatte ich auch noch im Kopf, aber sie klappt leider nicht.

    if (z==0)
        {
            sb **p_sin=new sb[s_count];
            for (int i=0;i<s_count;i++)
            p_sin[i]=new sb;
            z++;
        }
    

    error: cannot convert 'sb*' to 'sb**' in initilalisation



  • Dafür steht die Lösung schon in der Fehlermeldung:

    if (z==0)
    {
            sb **p_sin=new *sb[s_count];// erstelle Feld von Zeigern auf sb
            for (int i=0;i<s_count;i++)
              p_sin[i]=new sb;
            z++;
    }
    


  • jo,
    das hatte ich auch gerade eben als Lösung angenommen, es aber wieder verworfen, weil die Meldung:
    p_sin was not declared in this scpe
    kam.



  • So wie das da steht, ist p_sin auch nur innerhalb der geschweiften Klammern deklariert. Wenn das alles ist, was dort steht, müsstest du auch innerhalb dieser Klammern den Speicher wieder frei geben. Ich denke aber du willst den Zeiger später noch verwenden? Deshalb musst du die Variable in dem Block (Scope) deklarieren, wo du sie nutzt. Ein Block ist alles das, was du zusammen einrückst. Ich hoffe, das war verständlich.


Log in to reply