Problem mit realloc



  • Es ist ein Array von folgender Struktur:

    struct cEv{
    time_t StartTime, VPS;
    int Duration;
    int EventID;
    char *Title, *ShortText, *Description;
    };

    und ich erstelle es mit:

    Events = (cEv *)calloc(1, sizeof(cEv));

    und vergrößere es mit:

    Events = (cEv )realloc(Events, NumberOfEventssizeof(cEv));



  • Verwendest du C oder C++?
    Bei C++ würde ich an deiner Stelle die struct etwas umbauen.

    struct cEv
    {
      time_t StartTime, VPS;
      int Duration;
      int EventID;
      std::string Title, ShortText, Description;
    };
    // statt dynamischen Array dann sowas
    std::vector<cEv> cEvVect;
    // Elemente hinzufügen dann so
    cEv elem;
    cEvVect.push_back(elem);
    // oder so
    cEvVect.push_back(cEv());
    

    Evtl. könnte man deiner struct noch einen Konstruktor spendieren.

    Bezüglich deines Codes. Wo allozierst du eigentlich Speiche für deine char*?
    Ist für ein ordentliches free gesorgt?
    Das alles brauchst du bei obeigen Code nicht.



  • Wenn er mit realloc() arbeitet, ist es sehr unklug, std::string (oder andere Typen, die einen Konstruktor benötigen) einzusetzen - die C Speicherverwaltung hat keine Ahnung von Konstruktoeren etc. und dürfte dir nur einen Haufen Datenmüll als string-Wert interpretieren.

    (wobei - in C++ hat realloc sowieso nichts zu suchen, da kann man stattdessen vector<>en verwenden)



  • Deswegen habe ich die geänderten Struktur auch in einen vector gepackt.
    Gut, ich hätte explizit dazuschreiben sollen, dass hier malloc, realloc und Konsorten nicht mehr verwendet werden dürfen.
    Ist hiermit geschehen.



  • Hi

    Danke für den Tip mit Vectoren... kennt da zufällig jemand ein gues Tutorial?? Habe ich nämlich noch nie was von gehört.

    Der Speicher für die char* kommt später ran, wenn ich weiß wie lang die Texte werden müssen.

    @Braunstein: Gibtes bei structs nen Konstruktor, oder wird das dann zu ner Klasse?? Was würde der mir bringen??

    @CStoll:Wenn ich mit vector arbeite, sollte ich dann lieber strings einsetzen??



  • Wenn du einen C++-Compiler benutzt sind structs und Klassen nahezu identisch. Der einzige Unterschied liegt im default-Zugriffsbereich der Variablen und Methoden. Bei structs ist er public und bei class private.
    Ein Konstruktor in deiner struct vereinfacht die Handhabung. Insbesondere im Zusammenhang mit vector.
    BTW, wenn du vector nimmst solltest du auch string nehmen. Dann genügt nämlich der default Copyconstructur bzw. Zuweisungsoperator (sowas brachst du bei STL-Containern).



  • balta schrieb:

    Danke für den Tip mit Vectoren... kennt da zufällig jemand ein gues Tutorial?? Habe ich nämlich noch nie was von gehört.

    Tutorial fällt mir nicht ein, aber ich empfehle mal einen Blick ins Magazin (sehr weit unten im Board) - Stichwort "Aufbau der STL".



  • Braunstein schrieb:

    Wenn du einen C++-Compiler benutzt sind structs und Klassen nahezu identisch. Der einzige Unterschied liegt im default-Zugriffsbereich der Variablen und Methoden. Bei structs ist er public und bei class private.
    Ein Konstruktor in deiner struct vereinfacht die Handhabung. Insbesondere im Zusammenhang mit vector.
    BTW, wenn du vector nimmst solltest du auch string nehmen. Dann genügt nämlich der default Copyconstructur bzw. Zuweisungsoperator (sowas brachst du bei STL-Containern).

    Jetzt hast du mich richtig verwirrt 🙄 😕

    Bin eigentlich Delphi/Pascal-Programmierer, nur hier ging es leider nicht anders. Dort ist es so dass Klassen immer nur Zeiger auf die Klasse sind, während bei records (<- struct) immer gleich der gesamte Speicherbereich reserviert wird, also wenn es zwei 32bit-Variavblen enthält auch gleich 64bit. records können soweit ich weiß auch keinen Konstruktor kriegen.
    Was meinst du mit "Dann genügt nämlich der default Copyconstructur bzw. Zuweisungsoperator" ??

    Das im Magazin ist wirklich gut erklärt, danke dafür!



  • Hallo,

    Wie schon gesagt sind Klasse und Structs in C++ fast das gleiche. Belies dich mal in einem Tutorial darüber.
    Bezüglich Copyconstructor schau mal hier rein (vielleicht auch den Rest über Klassen)
    http://www.volkard.de/vcppkold/copykonstruktor.html
    bzw. auch hier
    http://tutorial.schornboeck.net/bigthree.htm



  • Ich habe dabei jetzt leider noch ein Problem...

    Dieses Array bzw. jetzt vector soll ein Element einer Klasse sein, Und von dieser Klasse habe ich wieder ein Array (läuft hier problemlos mit der realloc-Methode) Allerdings bleibt er jetzt beim Erstellen eines der ersten Klassen anscheinend in einer Endlosschleife stecken (es bleibt stehen und CPU 100%). Muss ich dabei noch was beachten?? Man kann es sich so vorstellen:

    class Klasse{
    private:
      vector<cEv> Events;
      [...]
    }
    
    Klasse *Klassen;
    
    Klassen = (Klasse *)calloc(1, sizeof(Klasse));
    for(int i := 1; i < 10; i++){
      Klassen = (Klasse *)realloc(Klassen, i*sizeof(Klasse));
      Klassen[i-1] = Klasse::Klasse();
      cout << "Klasse " << i << "erstellt\n";
    }
    

    Er bleibt dann bei Klasse 1, 2 oder 3 stecken.

    Mfg,
    balta



  • Dabei mußt du vor allem das alte Problem beachten: "Klasse" hat einen nichttrivialen Konstruktor (auch wenn man's nicht sieht - der braucht dessen Aufruf, um 'Events' ordentlich zu initialisieren), also solltest du es nicht an malloc() und Konsorten verfüttern (diese Funktionen stammen noch aus C-Zeiten - und haben keine Ahnung, was ein "Konstruktor" ist). In C++ nimmt man deshalb new/delete (oder auch wieder STL-Container):

    //a:
    Klasse* Klassen = new Klasse[10];
    ...
    delete[] Klassen;
    
    //b:
    vector<Klasse> Klassen
    for(int i=0;i<10;++i)
      Klassen.push_back(Klasse(i));
    


  • danke, habe jetzt wieder nen vector genommen. Wusste nicht ob ich nen Vector in nem Vector nehmen kann...
    jetzt läuft es!


Anmelden zum Antworten