Mehrdimensionale, dynamische String-Arrays



  • Hallo,

    ich habe eine SQLite Datenbank. Aus dieser Datenbank möchte ich nun 2 Werte auslesen und in ein Array speichern. (UserID und Name - also ein INT und ein String)
    Diese Werte möchte ich in einem mehrdimensionalen Array speichern. Das Array muss aber dynamisch sein, da ich vorher nicht weiß, wieviele User es gibt, bzw es könnten zur Laufzeit welche hinzukommen.
    (Als DB-Verbindung nutze ich übrigens "kompex", was aber nichts zur Sache tut 😉 )

    Das hier ist mein Ansatz, wie ich das Array mit dem Namen befülle. Nur leider weiß ich nicht, wie ich die jeweilige ID dazu bekomme. Ich hoffe Ihr könnte mir helfen.

    Viele Grüße

    pStmt->Sql("SELECT name, id FROM user; ");
    	int i = 0;
            string *user_array = new string[];
    	while (pStmt->FetchRow())
    	{
    		user_array[i] = pStmt->GetColumnString("name");
    		i++;
    	}
    


  • Nein. Das machst Du bitte nicht so.

    Du hast ja im Kopf wahrscheinlich irgendeine Idee von "Klassen", von denen Du einzelne Instanzen in der DB speicherst.

    Meinetwegen:

    struct user { int id; std::string name; };
    

    .
    Und jetzt nimmst Du einen std::vector<user> . und speicherst die einzelnen Objekte, die Du aus der DB ausliest, da rein.



  • struct user
        {
           int id;
           string name;
        };
    
        std::vector<user> user_vector;
    
        while (pStmt->FetchRow())
        {
            user tmp;
            tmp.id = pStmt->GetColumnInt("ID");
            tmp.name = pStmt->GetColumnString("name");
    
            user_vector.push_back(tmp);
        }
    


  • maikell schrieb:

    string *user_array = new string[];
    

    Bitte nie wieder sowas schreiben. Erstens reservierst du so keinen Speicher weil deine Klammer leer ist. Wenn du dort die Anzahl Elemente angegeben hättest, dann hättest du zwar Speicher gekriegt um deine Strings zu speichern aber es ist trotzdem schlechter Stil, da man sich so selbst um die Freigabe des speichers mit delete[] kümmern muss. Außerdem ist der Code nicht Exception Safe. In C++ gibt es haufenweise Container, die einem das Speichern von Elementen abnehmen, sodass man selbst kaum noch new in seinem Code schreiben muss und sich überhaupt nicht um die Freigabe kümmern muss. Am nützlichsten ist sicher std::vector für dynamische Arrays.



  • Vielen Dank für die Lösung und für die Erklärungen dazu! 👍


Anmelden zum Antworten