SQLite Result in Array speichern



  • Hallo zusammen,

    dies ist mein erster Post in diesem Forum....
    Kurz zu mir, ich bin zwar zeit gut 10 Jahren beruflich Softwareentwickler, aber ich komme aus einem ganz anderen Bereich. Also würde ich mich beim Thema C++ als Einsteiger/Umsteiger betrachten.
    Jedenfalls habe ich noch einige Gehschwierigkeiten, die mich manchmal selbst staunen lassen 😄

    Zu meinem aktuellen Problem:
    Ich möchte eigentlich nur Daten aus einer SQLite in einem Array zwischenspeichern, um die Daten in einer anderen Funktion zu verwenden. Aber auch diesmal scheint das Problem vor der Tastatur zu sitzen.
    Hier mal ein paar Codefetzen

    Hier die Deklaration im Header:

    class PopupGR{
    
    
    public:
    	char *Captions[8+1];
        char *pszKto[8+1][15+1];
       
    
        int HGItemCount;
        int SubItemCountKto[8];
    
    } PG;
    

    Und hier die Funktionen, wo ich "versuche" die Daten von SQLResult zu übernehmen.

    
    void TFormBuchen::SQLResultHG(int col, char **row, char **azColName)
    {
        for(int i = 0; i < col; i++)
        {
            if(i == 2)
        	{
         		PG.Captions[PG.HGItemCount] = row[i];
           	}
        }
        PG.HGItemCount++;
    }
    //---------------------------------------------------------------------------
    
    void TFormBuchen::SQLResultKto(int KtoNr, int col, char **row, char **azColName)
    {
        for(int i = 0; i < col; i++)
        {
        	if(i == 2)
            {
                PG.pszKto[PG.SubItemCountKto[KtoNr-1]][i] = row[i];
    
         	}
        }
        PG.SubItemCountKto[KtoNr-1]++;
    }
    

    Wenn ich mir direkt in diesen Funktionen das Ergebnis im Array anschaue, sind die Daten wohl geschrieben. Für mich erstaunlich, das ich in einer anderen Funktion nicht darauf zugreifen kann. Da steht dann NULL im Array...

    Schon mal vielen Dank für eure Antworten

    Gruß
    Matthias



  • Das fliegt dir immer um die Ohren. In popupGR speicherst du nur die Zeiger auf die Strings im aktuellen Datensatz, wenn der Datensatz zerstört wird zerstört er seinen internen Puffer gleich mit. Damit hast du gleich mehrere dangling Pointer, die irgendwohin zeigern, nur nicht auf gültige Daten.
    Ersetz´ deine char* [] durch std::array<std::string,9> und std::array<std::array<std::string,16>,9> bzw. durch std::string Captions[9] und std::string Kto[9][16].

    Vermutlich erleichtert die ein C++ Wrapper für die SQLite C-API, da gibt´s einige.



  • Benutzt du tasächlich VCL (C++ Builder) oder bist du im falschen Forum?



  • Erstmal Danke für die schnelle Antwort...
    Werde es nachher direkt umsetzen

    Ja , ist tatsächlich eine antiquirte Version 6 vom C++ Builder 😄
    Aber ich mag das Teil



  • @MHage
    Dann vergiss alles, was ich geschrieben habe. Das Ding ist ja nicht mal kompatibel zu sich selbst.

    • std::array kam mit C++11, das kennt der BCB 6 nicht
    • 3rd Party Libraries mit dem BCB 6 zu übersetzen ist ein Glücksspiel, da der Compiler sich nicht an den Sprachstandard hält. Du kannst Glück haben, dass er erfolgreich übersetzt, aber wahrscheinlich kann er´s nicht.


  • @MHage sagte in SQLite Result in Array speichern:

    Erstmal Danke für die schnelle Antwort...
    Werde es nachher direkt umsetzen

    Ja , ist tatsächlich eine antiquirte Version 6 vom C++ Builder 😄
    Aber ich mag das Teil

    Ich mochte das Teil auch, aber irgendwann muss man Abschied nehmen. Und der Zeitpunkt war vor 10 Jahren 😄



  • @DocShoe
    Und doch ist das Problem gelöst, und dein Beitrag hat mich in die richtige Richtung geschubst...

    @It0101
    Ja, ich weiß... 😏 Habe die 10.3 Community ebenfalls installiert.


Anmelden zum Antworten