Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C] Uso di malloc

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    7

    Domanda da niubbo su malloc

    Ciao, è un po' che non posto su questo forum quindi ciao a tutti, è come se fossi nuovo!

    Dopo anni di php e java mi sono deciso ad impare a programmare in C da autodidatta. Purtroppo però ho qualche dubbio. Per iniziare un porgettino sto programmando un wrapper per sqlite, molto molto semplice.

    Il codice che ho scritto fino adesso è questo. Chiedo scusa in anticipo per gli strafalcioni che posso aver scritto!!

    Riporto qua solo le parti di codice necessarie a capire dov'è l'errore, almeno spero

    Codice PHP:
    /* puntatore al tipo di dato "rislutato" */
    typedef struct DBResult *DBRow;

    /* struttura che definisce il tipo di dato "rislutato" */
    typedef struct DBResult
    {
        
    char **fields;
        
    char **values;
        
    int fields_number;
        
    DBRow next;
    DBResult;

    ...

    /* connessione al database */
    sqlite     *__db_connection;

    /* nome del database */
    char     *__db_name;

    /* ultimo risultato tornato */
    int     __last_result;

    /* ultima query eseguita */
    char    *__last_query;

    /* ultimo messaggio d'errore riscontrato */
    char    *__last_error 0;

    /* puntatore alle righe del risultato */
    DBRow    __result_rows NULL;

    /* puntatore alla riga corrente del risultato */
    DBRow    __current_row NULL;

    ...

    main()
    {

    ...

        
    DBRow dbh;

        
    connectToDB("./prova.db");
        
    DBSelect("SELECT * FROM pippo2;");
        
    closeDBConnection();
        
        while ((
    dbh nextDBRow()))
        {
            
    printf("%s = %s"dbh->fields[0], dbh->values[0]);
            
    printf("\n");
        }

    ...

    }

    ...

    /* funzione che esegue una query di select */
    int DBSelect(char *query)
    {
        
    __last_result sqlite_exec(__db_connectionquerycallbackSelectNULL, &__last_error);
        if (
    __last_result != SQLITE_OK)
        {
            
    DBError("Errore nella query");
            return 
    1;
        }
        else
            return 
    0;
    }

    /* callback per select */
    int callbackSelect(void *not_usedint row_fields_numberchar **row_valueschar **row_fields)
    {
        
    int i;
        
    char new_fields[row_fields_number][200];
        
    char new_values[row_fields_number][200];
        
    DBRow new_row;

        
    new_row = (DBRow)malloc(sizeof(DBResult));
        if (
    new_row == NULL)
        {
            
    DBError("Memoria esaurita");
            return 
    1;
        }
        else
        {
            
    new_row->values = (char**)malloc(sizeof(new_values));
            
    new_row->fields = (char**)malloc(sizeof(new_fields));
            if (
    new_row->values == NULL || new_row->fields == NULL)
            {
                
    DBError("Memoria esaurita");
                return 
    1;
            }
            else
            {
                
                for (
    0row_fields_numberi++)
                {
                    
    strcpy(new_row->values[i], row_values[i]);
                    
    strcpy(new_row->fields[i], row_fields[i]);
                }
                
    new_row->fields_number row_fields_number;
                
    new_row->next __result_rows;
                
    __result_rows new_row;
                
    __current_row new_row;
                return 
    0;
            }
        }
    }

    /* restituisce un puntatore alla riga corrente e si sposta alla successiva */
    DBRow nextDBRow()
    {
        
    DBRow current_row;
        
        if (
    __current_row == NULL)
            return 
    NULL;
        else
        {
            
    current_row __current_row;
            
    __current_row current_row->next;
            return 
    current_row;
        }
    }

    ... 
    Il problema è che quando chiamo

    Codice PHP:
    printf("%s = %s"dbh->fields[0], dbh->values[0]); 
    nel main mi da un segmentation fault.
    Sono sicuro che il problema è nella malloc chiamata nella funzione di callback ma non riesco a venirne fuori.

    Se ho fatto una domanda troppo in dettaglio chiedo scusa. Grazie a chi mi darà una mano

    PS: il riquadro dice "codice php" ma è C ovviamente

  2. #2
    Allora dato l'orario potrei anche sbagliare, ma chredo che il problema sia dovuto al fatto che non allochi effettivamente le matrice di caratteri (insomma i doppi puntatori) della struttura, ho provato a modificare il codice per adattarlo alla mancanza delle interfacce sqlite e ne ho ricavato questo:
    codice:
    int callbackSelect(void *not_used, int row_fields_number, char **row_values, char **row_fields)
    {
        int i;
        char new_fields[row_fields_number][200]; //questi li puoi eliminare
        char new_values[row_fields_number][200];//idem come sopra
        DBRow new_row;
    
        new_row = (DBRow)malloc(sizeof(DBResult));
        if (new_row == NULL)
        {
            DBError("Memoria esaurita");
            return 1;
        }
        else
        {
            new_row->values = (char**)malloc(sizeof(char*)*row_fields_number);//qui allochi i putatori ai puntatori
            new_row->fields = (char**)malloc(sizeof(char*)*row_fields_number);//idem come sopra
            if (new_row->values == NULL || new_row->fields == NULL)
            {
                DBError("Memoria esaurita");
                return 1;
            }
            else
            {
                //Questo è il codice che ho aggiunto. Per ogni puntatore a puntatore creato allochi un array di caratteri di 200.
                for(i = 0; i < row_fields_number; i++)
                {
                    new_row->values[i] = (char*)malloc(sizeof(char)*200);
                    new_row->fields[i] = (char*)malloc(sizeof(char)*200);
                }
                for (i = 0; i < row_fields_number; i++)
                {
                    strcpy(new_row->values[i], row_values[i]);
                    strcpy(new_row->fields[i], row_fields[i]);
                }
                new_row->fields_number = row_fields_number;
                new_row->next = __result_rows;
                __result_rows = new_row;
                __current_row = new_row;
                return 0;
            }
        }
    }
    Spero ti sia di aiuto

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2005
    Messaggi
    7
    Grazie mille!!! Hai risolto il problema, adesso funziona tutto senza problemi!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.