dynamische liste knallt



  • Hallöschn!

    ich bastle mir gerade eine kleine DB mit SQLITE und C zusammen und bin eiiigentlich schon so gut wie fertig mit der Logik und jetzt knallts ^^

    mein sqlite3_exec() bekommt eine Liste zum Anhängen der Ergebnisse.

    mein sqlite-callback-funktion sieht so aus:

    static int callback_list(void *dataset, int argc, char **argv, char **azColName) {
            struct s_resultset *set = (struct s_resultset *) dataset;
            if (set != NULL) {
                add_result(set, argc, argv, azColName);
            }
            return SQLITE_OK;
    }
    

    Für den, der sqlite nicht kennt, die callback wird quasi für jede gefundene Zeile aufgerufen. dataset ist ein beliebiger Parameter (bei mir eben das Resultset) argc ist die Anzahl der Spalten, argv sind die Spalten und azColName sind die Spaltennamen.

    Mein s_resultset/s_resultset sieht so aus

    struct s_result {
            int count;
            char **elements;
            char **heads;
    
            struct s_result *next;
    };
    
    struct s_resultset {
            struct s_result *first;
            int count;
    };
    

    in dieser Funktion knallts dann am Ende:

    void add_result(struct s_resultset *set, int count, char **elements,
            char **heads) {
        struct s_result *new;
        struct s_result *last = set->first;
        int cnt;
    
        /*
         * erzeuge ein neues Element und befülle es
         */
        new = (struct s_result *) malloc(sizeof(struct s_result));
        new->count = count;
        new->next = NULL;
    
        new->elements = malloc(count * sizeof(char *));
        new->heads = malloc(count * sizeof(char *));
    
        /*
         * kopiere die Daten aus den Spalten
         */
        for (cnt = 0; cnt < count; cnt++) {
            new->elements[cnt] = malloc(strlen(elements[cnt]) + 1);
            strcpy(new->elements[cnt], elements[cnt]);
    
             new->heads[cnt] = malloc (strlen (heads[cnt]) + 1);
             strcpy (new->heads[cnt], heads[cnt]);
        }
    
        /*
         * finde das ende der kette und hänge das neue Element an
         */
        if (last == NULL) {
            set->first = new;
        }
        else {
            while (last->next != NULL) {
                last = last->next;
            }
            last->next = new;
        }
    
        set->count ++;
    }
    

    das Ganze funktioniert, solange nur eine Zeile zurückgeliefert wird. beim zweiten element knallts..



  • ookay, nach 24 versuchen im gdb hab ich mein problem gefunden: NULL in einer Spalte. Das hab ich jetzt umgangen und nun läufts...

    Erkenntnis des Tages: Man wird faul, wenn man Java programmiert..



  • DocJunioR schrieb:

    Erkenntnis des Tages: Man wird faul, wenn man Java programmiert..

    😮
    Ich bewundere Javaprogrammierer für ihre enorme Geduld so unglaublich viel Code für minimalen Inhalt zu schreiben. Java programmieren ist das absolute Gegenteil von faul sein. Aber schön dass du deinen Fehler gefunden hast 😃



  • DocJunioR schrieb:

    /*
         * erzeuge ein neues Element und befülle es
         */
        new = (struct s_result *) malloc(sizeof(struct s_result));
        new->count = count;
        new->next = NULL;
    

    DocJunioR schrieb:

    Erkenntnis des Tages: Man wird faul, wenn man Java programmiert..

    und man castet plötzlich unnötigerweise und der rückgabewert von malloc wird auch nicht mehr überprüft *fg*

    nwp2 schrieb:

    Ich bewundere Javaprogrammierer für ihre enorme Geduld so unglaublich viel Code für minimalen Inhalt zu schreiben.

    das macht alles die IDE, wortvervollständigung, usw.
    🙂


Anmelden zum Antworten