C ++: fusione a void * e ritorno
-
21-09-2019 - |
Domanda
* --- Modifica - ora tutto il sourse *
Quando il debug che alla fine, "get" e "valore" hanno valori diversi! Probabilmente, converto a void * e di nuovo a utente nel modo sbagliato?
#include <db_cxx.h>
#include <stdio.h>
struct User{
User(){}
int name;
int town;
User(int a){};
inline int get_index(int a){
return town;
} //for another stuff
};
int main(){
try {
DbEnv* env = new DbEnv(NULL);
env->open("./",
DB_CREATE | DB_INIT_MPOOL | DB_THREAD |
DB_INIT_LOCK | DB_INIT_TXN | DB_RECOVER | DB_INIT_LOG, 0);
Db* datab = new Db(env, 0);
datab->open(NULL, "db.dbf", NULL, DB_BTREE, DB_CREATE | DB_AUTO_COMMIT, 0);
Dbt key, value, get;
char a[10] = "bbaaccd";
User u;
u.name = 1;
u.town = 34;
key.set_data(a);
key.set_size(strlen(a) + 1 );
value.set_data((void*)&u);
value.set_size(sizeof(u));
get.set_flags(DB_DBT_MALLOC);
DbTxn* txn;
env->txn_begin(NULL, &txn, 0);
datab->put(txn, &key, &value, 0);
datab->get(txn, &key, &get, 0);
txn->commit(0);
User g;
g = *((User*)&get);
printf("%d", g.town);
getchar();
return 0;
}catch (DbException &e){
printf("%s", e.what());
getchar();
}
soluzione
creare una sorta di "serializator" cosa sarebbe convertire tutti di POD in void * e quindi unirà questi pezzi
PS Oppure mi piacerebbe riscrivere l'utente in tipo POD e tutto sarà a posto, spero.
Aggiungi
E 'strano, ma ... ho gettato un oggetto generosi non-pod a void * e ritorno (è std :: string all'interno) e va tutto bene (senza inviarlo al db e ritorno). Come potrebbe essere? E dopo ho lanciato e mando 'depressione' db oggetto generosi pod (nessun metodo in più, tutti i membri sono pod, si tratta di una semplice struct {int a; int b;} ...) mi rimetto dirted uno. Cosa c'è di sbagliato con il mio approccio?
Aggiungi settimana circa dopo il primo 'aggiungere'
Accidenti ... ho compilato quelli, solo per dare un'occhiata a che tipo di sporco che returnes, e oh! va bene! ... non posso! ! ... .. AAh Signore ... Una domanda ragionevole (in 99,999 per cento delle situazioni risposta giusta è 'mio', ma ... qui ...) - whos è questo difetto? La mia o Vss?
Altri suggerimenti
Poiché non v'è alcun controllo del valore di ritorno di put (), esso potrebbe essere c'è un errore che ha impedito l'aggiornamento. La documentazione indica un bel po ' condtions errore:
Si è quasi sicuramente non suppone di lanciare 'get' direttamente a un utente. Invece, estrarre i dati memorizzati e poi gettato quello. Non possiamo sapere con certezza a meno che non si condivide con noi la definizione di Dbt. Fare una supposizione, basata su ciò che possono vedi:
datab->get(txn, &key, &get, 0);
void* data = get.get_data();
User g = *((User*)data);
Dicci di più su Dbt e possiamo probabilmente aiutare di più.
vorrei fare qualcosa di simile a questo:
User user;
std::stringstream dbStotrStream;
dbStoreStream << user; // Serialize user
std::string dbStore(bdStoreStream.str());
value.set_data(dbStore.c_str());
value.set_size(dbStore.lenght());
//// Put in DB
Quindi l'estrazione sarebbe simile a questa:
//// Get from DB
std::string dbStore(get.get_data(),get.get_date() + get.get_size());
std::stringstream dbStoreStream(dbStore);
User outUser;
dbStoreStream >> outUSer;