C ++: صب إلى باطل* والعودة
-
21-09-2019 - |
سؤال
* --- تحرير -الآن المصدر كله*
عندما أقوم بتصحيحها في النهاية ، "Get" و "Value" لها قيم مختلفة! ربما ، أقوم بتحويل إلى void* وأعود إلى المستخدم بطريقة خاطئة؟
#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();
}
المحلول
قم بإنشاء نوع من "Serializator" ما الذي سيحول كل جراب إلى void* ثم سيوحد هذه القطع
ملاحظة أو سأعيد كتابة المستخدم في نوع POD وسيكون كل شيء على ما يرام ، آمل.
يضيف
إنه أمر غريب ، لكن ... لقد ألقيت كائنًا غير بود باطلال على الفراغ* والعودة (يحتوي على Std :: String Inside) وكل شيء على ما يرام (دون إرساله إلى DB والعودة). كيف يمكن أن يكون؟ وبعد أن ألقيت وأرسل "Trough" Defenetly Pod Object (لا توجد طرق إضافية ، جميع الأعضاء هم POD ، إنه بنية بسيطة {int a ؛ int b ؛ ...}) أعود إلى واحدة. ما الخطأ في مقاربي؟
أضف حوالي أسبوع بعد "إضافة" الأول
لعنة ... لقد قمت بتجميعها ، فقط لإلقاء نظرة على أي نوع من الأوساخ يعود ، وأوه! لا بأس! ... لا أستطيع! ... آه! أو VSS؟
نصائح أخرى
نظرًا لعدم وجود فحص لقيمة الإرجاع لـ PUT () ، فقد يكون هناك خطأ يمنع التحديث. وثائق يشير إلى عدد قليل من التوصيلات الخطأ:
من المؤكد أنك من غير المفترض أن تلقي "الحصول" مباشرة على المستخدم. بدلاً من ذلك ، استخرج البيانات التي قمت بتخزينها ثم ألقيت ذلك. لا يمكننا أن نعرف بالتأكيد إلا إذا كنت تشاركنا في تعريف DBT. تخمين ، بناءً على ما نحن تستطيع يرى:
datab->get(txn, &key, &get, 0);
void* data = get.get_data();
User g = *((User*)data);
أخبرنا المزيد عن DBT وربما يمكننا مساعدتك أكثر.
سأفعل شيئًا كهذا:
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
ثم استخراجه سيبدو هكذا:
//// Get from DB
std::string dbStore(get.get_data(),get.get_date() + get.get_size());
std::stringstream dbStoreStream(dbStore);
User outUser;
dbStoreStream >> outUSer;