Dynamisches Array fixer String Arrays?



  • Hop zusammen

    So weit bin ich bereits bekommen: Ein MagicKey besteht immer aus 2 Strings, welche ihn identifizieren:

    using std::string;
    
    string strMagicKey[2];
    char *strTmp = (char *) malloc(sizeof(char));
    for(int i = 0; i < 2; i++) {
        sprintf(strTmp, "Test %i", i);
        strMagicKey[i] = strTmp;
        printf("%s\n", strMagicKey[i].c_str());
    }
    free(strTmp);
    

    So sieht z.B. ein MagicKey aus. Jetzt ist es aber so, dass es beliebig viele solcher MagicKeys geben kann, welche ich gerne in einem entsprechenden Array speichern würde.

    Wie lässt sich das also anstellen 😋 ?

    Danke und Greeetz Kessi



  • benutzt du lieber c oder c++?



  • C++ wenn möglich 🙂



  • meinst du sowas? bin etwas schwer von begriff heut

    string** str = new string*[10];
    for (int i=0;i<10;++i)
     str[i] = new string[2];
    
    str[0][0] = "A";     //String 1 posi 1
    str[0][1] = "B";     //String 1 posi 2
    
    cout<<str[0][1];
    
    for (int i=0;i<10;++i)       //nicht vergessen aufzuräumen
     delete[] str[i];
    
    delete[] str;
    


  • Hey danke 😛

    Wenn ich genauer darüber nachdenke, ist mir C allerdings doch lieber, da ich das Array dynamisch alloziieren und somit realloc verwenden möchte. Daher habe ich den Code wie folgt geändert:

    using std::string;
    string** strMagicKey = (string **) malloc(sizeof(string *) * 8);
    strMagicKey = (string **) realloc(strMagicKey, sizeof(string *) * 10);
    char *strTmp = (char *) malloc(sizeof(char));
    for(int i = 0; i < 10; i++) {
        strMagicKey[i] = new string[2];
        for(int j = 0; j < 2; j++) {
            sprintf(strTmp, "Test: %i/%i\n", i, j);                
            strMagicKey[i][j] = strTmp;
            printf(strMagicKey[i][j].c_str());
        }
        delete strMagicKey[i];
    }
    free(strMagicKey), free(strTmp);
    

    Klappt wunderbar. Da ich allerdings bereits malloc()'s verwende, möchte ich der Form halber auch für das Allozieren der beiden Strings malloc verwenden, also statt:

    strMagicKey[i] = new string[2];
    

    und

    delete strMagicKey[i];
    

    jetzt neu

    strMagicKey[i] = (string *) malloc(sizeof(string) * 2);
    

    und

    free(strMagicKey[i]);
    

    Gibt aber jetzt plötzlich einen Laufzeitfehler 👎

    Was mach' ich da falsch 🙂 ?



  • <Sarkasmus pur> Wirklich eine super Idee hier malloc und seine Companen zu verwenden!! 👍

    Villeicht liegts ja daran, dass man damit gar keine C++ Objekte anlegen kann weil keine Konstruktoren aufgerufen werden?



  • ⚠ Autsch, das tut weh...

    Ist aber berechtigt 😛

    Naja, jedenfalls danke und greeetz
    Kessi



  • wieso kannst du denn mit new das array nicht dynamisch allozieren und eben delete[] benutzen?



  • Naja, mit new und delete gibt's keinen realloc() 🙂

    Allerdings wäre ist das bei strMagicKey, welcher nicht dynamisch sein muss, nur eine Formsache. Worauf mich Thomas allerdings eben so freundlich aufmerksam gemacht hat, ist, dass mit malloc und free in C++ keine Kon- bzw. Destruktoren von Objekten aufgerufen werden.

    Was, da ich versuche, ein String Objekt zu erzeugen, trotz aller Formschönheit nur von Nachteil sein kann :p



  • KessiMC schrieb:

    So sieht z.B. ein MagicKey aus. Jetzt ist es aber so, dass es beliebig viele solcher MagicKeys geben kann, welche ich gerne in einem entsprechenden Array speichern würde.

    Wie lässt sich das also anstellen 😋 ?

    Mit einem Vector oder Deque



  • KessiMC schrieb:

    char *strTmp = (char 😉 malloc(sizeof(char));

    sprintf(strTmp, "Test %i", i);

    free(strTmp);[/cpp]

    Ich hoffe, du weißt, was du DAMIT erreichst: BUMM (wenn nicht, schau dir mal an, wieviel Platz du angefordert hast, und wieviel Platz du verwendest). Da du mit C++ arbeitest, nimm lieber C++ Methoden zum Zusammenbauen deiner Strings (im Notfall Stringstream, aber für dich reicht vermutlich "strMagicKey[i] = string("Test ") + (i+'0');" aus).



  • KessiMC schrieb:

    ...
    Wenn ich genauer darüber nachdenke, ist mir C allerdings doch lieber, da ich das Array dynamisch alloziieren und somit realloc verwenden möchte....

    Wieso brauchst Du "realloc()" ?
    Wieso kann man mit C++ nicht "dynamisch allozieren ?
    Wieso packst Du die Strings nicht einfach in einen Standardcontainer ?

    Fragen über Fragen ....

    Gruß,

    Simon2.



  • man nehme

    vector<pair<string,string> >
    

    das ganze erzeug ein dynamisches array von paaren


Anmelden zum Antworten