C ++: coulée d'annuler * et retour
-
21-09-2019 - |
Question
* --- Edit - maintenant toute sourse *
Quand je debug sur la fin, « get » et « valeur » ont des valeurs différentes! Probablement, je convertir en void * et retour à l'utilisateur dans le mauvais sens?
#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();
}
solution
créer une sorte de « serializator » ce qui convertirait de tous les POD dans le vide de * et unira ces pièces
PS Ou je serais réécrivent l'utilisateur dans le type POD et tout ira bien, je l'espère.
Ajouter
Il est étrange, mais ... Je jette un defenetly objet non-pod pour annuler * et le dos (il a std :: string à l'intérieur) et il est tout droit (sans l'envoyer à la db et retour). Comment est-ce possible? Et après que je CAST et envoie « creux » db objet defenetly pod (aucune méthode supplémentaire, tous les membres sont pod, il est un simple struct {int a, int b, ...}) je reviens dirted un. Quel est le problème avec mon approche?
Ajouter environ une semaine après la première 'ajouter'
Merde ... Je l'ai compilé les, juste pour jeter un oeil à quel genre de saleté il returnes, et oh! il est bien! ... Je ne peux pas! ! ... .. AAh Seigneur ... Une question raisonnable (à 99,999 pour cent des situations bonne réponse est « mon », mais ... ici ...) - Whos est ce défaut? Mon ou VSs?
Autres conseils
Comme il n'y a pas de contrôle de la valeur de retour de vente (), il pourrait bien être il y a une erreur qui a empêché la mise à jour. La documentation indique un certain nombre condtions d'erreur:
Vous êtes presque certainement pas censé jeter « get » à un utilisateur. Au lieu de cela, extraire les données stockées, puis jeté ça. Nous ne pouvons pas savoir à coup sûr, à moins que vous partagez avec nous la définition de Debt. Faire une estimation, basée sur ce que nous peut voir:
datab->get(txn, &key, &get, 0);
void* data = get.get_data();
User g = *((User*)data);
Dites-nous plus d'informations Debt et nous pouvons probablement vous aider à en savoir plus.
Je ferais quelque chose comme ceci:
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
Ensuite, l'extraire ressemblerait à ceci:
//// Get from DB
std::string dbStore(get.get_data(),get.get_date() + get.get_size());
std::stringstream dbStoreStream(dbStore);
User outUser;
dbStoreStream >> outUSer;