2013-08-28 58 views
2

當我使用C++中的函數來初始化sqlite3時,當它出來的函數句柄是空的。任何想法可能會導致這種情況?我只需將指針作爲參數傳遞即可。如果我把開放的主要功能,它工作正常。這會導致什麼?是隱藏和超出範圍的東西?空指針sqlite3後處理後傳遞給函數調用

#include <iostream> 
#include "sqlite3.h" 

using namespace std; 

int init_table(sqlite3 *dbH, string db_name) 
{ 
    if (sqlite3_open(db_name.c_str(), &dbH) != SQLITE_OK) 
    { 
     cout << "Failed to open DB : " << sqlite3_errmsg(dbH) << endl; 
     abort(); 
    } 
    else 
    { 
     cout << "Opened database: " << db_name << endl; 
    } 

    if (sqlite3_exec(dbH, "PRAGMA synchronous = OFF", NULL, NULL, NULL) != SQLITE_OK) 
    { 
     cout << "Failed to set synchronous: " << sqlite3_errmsg(dbH) << endl; 
    } 

    if (sqlite3_exec(dbH, "PRAGMA journal_mode = WAL", NULL, NULL, NULL) != SQLITE_OK) 
    { 
     cout << "Failed to set journal mode: " << sqlite3_errmsg(dbH) << endl; 
    } 

    cout << "dbH 2: " << dbH << endl; 

} 

int main() 
{ 
    sqlite3 * dbH; 
    dbH = NULL; 
    cout << "dbH 1: " << dbH << endl; 
    string dbName = "foo1.db"; 
    init_table(dbH, dbName); 

    cout << "dbH 3: " << dbH << endl; 
} 

和運行

$ ./a.out 
dbH 1: 0 
Opened database: foo1.db 
dbH 2: 0x5baa048 
dbH 3: 0 
+0

這種或那種數據庫指針需要是一個引用parm,而不是一個值parm。 (如果你不明白這一點,你應該花更多的時間研究C基礎知識。) –

回答

3

應該是

int init_table(sqlite3 **dbH, string db_name) 

又通指針指針?
可能是sqliter處理沒有問題。它要麼將指針作爲參考傳遞,要麼作爲指針傳遞指針。

當然,在通過時,您需要在修改後將&dbH傳遞給init_table