Dynamische Speicherverwaltung



  • Hallo,

    ich schreib an einem Programm, welches eine Datei ausliest. Gleiche Elemente in dieser Datei, soll das Programm in einem Array speichern, welches als Datentyp eine eigene Struktur besitzt. Da ich nicht weiß, wieviele solcher Elemente in der Datei vorhanden sein werden, bzw es verschiedene Dateien geben wird, die alle eine unterschiedliche Anzahl dieser Elemente haben, möchte ich ein dynamisches Array anlegen, welches um ein Element erweitert wird sobald wieder ein Element in der Datei auftritt. Nun habe ich einen Zeiger angelegt, der den Zugriff auf den Speicher realisieren soll.

    driverparam *p_driverParam = (driverparam*) calloc(1,sizeof(driverparam));
    

    Damit hoffe ich nun Speicherplatz für ein Element vom Typ "driverparam" zu reservieren.
    Nun meine Fragen:
    1. Wie ermittle ich die Größe des belegten Speicherplatzes?
    2. Wie ermittle ich die Anzahl der bereits angelegte Elemente, auf die ich mit dem Zeiger zugreifen kann?
    3. Wie erhöhe ich den reservierten Speicher um ein Element?

    mfg chuqa



  • Hallo

    int size = 1;
    driverparam *p_driverParam = (driverparam*) calloc(size, sizeof(driverparam));
    p_driverParam = (driverparam *) realloc(p_driverParam, ((size + 1) * sizeof(p_driverparam)));
    

    mfg
    asci



  • Ok jetzt habe ich den Speicher so erhöht, wie erhöhe ich ihn nun wieder um eins?
    Ich mein damit nicht einfach "size+2" zu schreiben, sondern abhängig davon wieviel Elemente bereits vorhanen sind. Also müsste ja vorher eine Prüfung durchgeführt werden um die Elementanzahl zu ermitteln und aufgrund dessen den reservierten Speicherplatz zu erhöhen.

    mfg chuqa



  • Hallo

    du kannst aus dem pointer nicht die länge ermitteln. Du musst die länge
    in der Variable size ablegen.

    int size = 1;
    driverparam *p_driverParam = (driverparam*) calloc(size, sizeof(driverparam));
    size++;
    
    p_driverParam = (driverparam *) realloc(p_driverParam, (size * sizeof(p_driverparam)));
    

    mfg
    funcky



  • Hallo

    Und warum nicht einfach std::vector?

    bis bald
    akari



  • @funky
    Ja stimmt , so kann man es machen.

    Aber gibt es nicht irgend eine Möglichkeit die Menge der Elemente zu ermitteln, die den Speicherplatz belegen bzw. die Größe der reservierten Speicher auf den der Pointer zeigt?

    hmm an Vektor hab ich noch gar nicht gedacht, aber ist natürlich auch ne Möglichkeit. Dann werd ich mich dahingehend ma informieren 😉

    mfg chuqa



  • Hallo

    es gibt viele Lösungen. Aber weil du für die Specherverwaltung die funktion "calloc()" (ist eine C-Funktion)genommen hast, hab ich dir diesen Vorschlag gemacht. Hättest die für die Speicherverwaltung "new" genommen, hätte ich dir Vector vorgeschlagen. Du kannst auch für "calloc()" Vector benutzen. Aber wenn Du die Antwort kennst, verstehe ich nicht warum Du fragst ?

    mfg
    funcky



  • Hallo

    nein ein Pointer kennt nur seine Adresse. Bei dynamisch erstellten Arrays must du immer die Anzahl der Elemente merken. Alternativ kannst du (wie bei C-Strings) dafür sorgen, das das letzte Element immer 0 ist. So das du wenigstens beim Iterieren das Ende feststellen kannst.

    Deshalb ist ein std::vector in C++ wesentlich angebrachter. Der merkt sich die Anahl seiner Elemente.

    bis bald
    akari



  • Hallo

    "nein ein Pointer kennt nur seine Adresse."
    Ist mir klar.

    "Bei dynamisch erstellten Arrays must du immer die Anzahl der Elemente merken."
    Deswegen ja die Variable size.

    "Deshalb ist ein std::vector in C++ wesentlich angebrachter."
    Brauchst Du für std::vector noch eine Hilfe ?

    mfg
    funcky



  • Hallo

    @ funcky : Mein letzter Post war ein Kommentar zum letzen post von Chuqa, nicht zu deinem, den ich noch nicht beim Schreiben gesehen habe.

    bis bald
    akari



  • Gut ich habe eine Vektor mit einem Element angelegt:

    vector <driverparam> drvParams(1);
    

    Wie erhöhe ich nun die Anzahl der Elemente, die der Vektor aufnehmen kann, um ein Element?

    mfg chuqa



  • Indem du das nächste Element per push_back() hinten anhängst (btw kannst du auch mit einem leeren vector beginnen) oder den vector per resize() vergrößerst.

    //a:
    vector<driverparam> drv;
    while(fin)
    {
      driverparam prm;
      //lies prm aus fin;
      drv.push_back(prm);
    }
    
    //b:
    vector<driverparam> drv;
    while(fin)
    {
      int s = drv.size();
      drv.resize(s+1);
      //lies drv[s] aus fin;
    }
    


  • Ok herzlichen Dank für eure Hilfe.

    mfg chuqa


Anmelden zum Antworten