Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505

    [C] problema cursore con librerie berkeley

    salve! ho implementato una funzione in C che mi consenta (tramite cursori) di scorrere un database berkeley per effettuare delle ricerche! la funzione è la sottostante :

    void cercaDBAutore(DB **dbpp, struct Libro *vett, char * search) {
    DB *dbp;
    dbp=*dbpp;

    int ret;
    DBC *cursorp;
    DBT key, data;
    char type[3]="usr";

    libro book;

    // azzero i DBTs prima di usarli
    //memset(&key, 0, sizeof(DBT));
    //memset(&data, 0, sizeof(DBT));

    // crea il cursore
    dbp->cursor(dbp, NULL, &cursorp, 0);

    key.data = &type;
    key.size = sizeof(char);

    data.data = &book;
    data.ulen = sizeof(libro);
    data.flags = DB_DBT_USERMEM;

    cursorp->close(cursorp);
    //while ((ret = cursorp->get(cursorp, &key, &data, DB_NEXT)) == 0) {
    // //if (strcmp(book.autore,search)==0) {
    // // //vett[0]=book;
    // //}
    //}

    //if (ret != DB_NOTFOUND) {
    // errori
    //}
    }

    search è una stinga, vett è un vettore di strutture di tipo libro!
    quando inizializzo il cursore, inspiegabilmente mi dà segmentation fault! non riesco propio a capire il perchè... qualcuno può aiutarmi?

    arrivederci

  2. #2
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    dbp è un puntatore non inizializzato.. cioè null

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    eh ma glielo passo con **dbpp, e poi assegno l'indirizzo di memoria di quello! infatti quando chiamo questa funzione gli passo cercaDBAutore(&dbp, vett, search); dove &dbp è un headler del mio database!

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    aspetta.. mostra il codice che chiama quella funzione con le dichiarazioni e tutto.. perchè c'è qualcosa che non quadra..

    ps: usa il bebugger per capire dove ti da esattamente il segmentation fault e qual'è (se c'è) il puntatore nullo

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    ok! allora :

    client.c dichiaro un header di tipo dbp, poi ne apro (se non esiste lo crea) e scrivo dentro qualcosa!

    DB *dbp;
    openDB(&dbp);
    scriviDB(&dbp);

    quì chiamo la cerca:

    fgets(search, 200, stdin);
    vettlibro vett;
    cercaDBAutore(&dbp, vett, search);

    quì apro :

    int openDB(DB **dbpp) {
    // dichiaro riferimento al database, flag per il database (typedef unsigned int u_int32_t), valore di ritorno
    DB *dbp;
    u_int32_t flags;
    int ret;

    // creo il riferimento per il mio database
    ret = db_create(&dbp, NULL, 0);
    if (ret != 0) {
    // quì vanno implementati gli errori
    }

    // creo il flag per il mio database (DB_CREATE : se non esiste, lo crea)
    flags = DB_CREATE;

    *dbpp=dbp;

    // imposto database per supportare dei duplicati
    ret = dbp->set_flags(dbp, DB_DUPSORT);
    if (ret != 0) {
    // quì vanno implementati gli errori
    //dbp->err(dbp, ret, "Attempt to set DUPSORT flag failed.");
    //dbp->close(dbp, 0);
    //return(ret);
    }

    // apro il database. specifico :
    // riferimento, NULL (transaction pointer), nome database, NULL (nome logico),
    // metodo di accesso, flag, filemode (0 default)
    ret = dbp->open(dbp, NULL, "database.db", NULL, DB_BTREE, DB_CREATE, 0);
    if (ret != 0) {
    // quì vanno implementati gli errori
    }
    return 0;
    }

    quì scrivo dentro qualcosa :

    void scriviDB(DB **dbpp) {
    // imposto alcune variabili che mi serviranno per scrivere/leggere
    // inoltre dichiaro la struct che mi definisce il tipo oggetto libro
    libro book;
    strcpy(book.titolo, "leopardi");
    strcpy(book.autore, "leopardi");
    strcpy(book.keywords, "leopardi");
    strcpy(book.anno, "leopardi");
    strcpy(book.ISBN, "leopardi");

    DB *dbp;
    dbp=*dbpp;

    int ret;
    DBC *cursorp;
    DBT key, data;
    char type[3]="usr";

    // azzero i DBTs prima di usarli
    memset(&key, 0, sizeof(DBT));
    memset(&data, 0, sizeof(DBT));

    key.data = &type;
    key.size = sizeof(char);
    data.data = &book;
    data.size = sizeof(libro);

    // inserisce i dati (0 alla fine singifica niente flags. li inserisce anche doppi)
    ret = dbp->put(dbp, NULL, &key, &data, 0);
    //if (ret == DB_KEYEXIST) {
    // dbp->err(dbp, ret, "Put failed because key %f already exists", type);
    //}
    }

    e poi per cercarli il codice è quello sopra! la struct è definita così :

    // struttura oggetto libro
    typedef struct Libro {
    char titolo[200];
    char autore[200];
    char keywords[200];
    char anno[200];
    char ISBN[200];
    } libro, vettlibro[50];

    credo sia tutto quello che ti serva, spero

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    505
    sono un idiota! uhahuauhauh

    non ha nessun motivo per non andare (infatti), è solo che ho dimenticato un dbp->close in giro per il codice, prima di fare la ricerca! mi scuso per aver fatto perdere tempo a voi! dio che imbecille uhauhauh

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 © 2024 vBulletin Solutions, Inc. All rights reserved.