私は以下のコードを貼り付けました。これは、sqlite3_get_table()でsegフォルトを与えます。私はテーブルの行の数を取得し、それを返すしたい。行数が0より大きい場合、プログラムはすべての行を読み取る必要があります。sqlite3プログラム受信信号SIGSEGV、sqlite3_get_table()内のセグメンテーションフォールト
int型countRowsInTable(){
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char const *sql;
char ***pazResult;
int *pnRow; /* Number of result rows written here */
int *pnColumn; /* Number of result columns written here */
rc = sqlite3_open("DeviceDetails.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}
else
{
fprintf(stderr, "Opened database successfully\n");
}
/* Create SQL statement */
sql = "select * from Device_Details";
/* Execute SQL statement */
// rc = sqlite3_exec(db, sql, 0/*callback*/, 0/*(void*)data*/, &zErrMsg);
rc = sqlite3_get_table(db, sql, pazResult, pnRow, pnColumn, &zErrMsg);
void sqlite3_free_table(char **result);
if(rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
fprintf(stdout, "Operation done successfully\n");
cout<<"rows="<<pnRow<<endl;
sleep(10);
}
sqlite3_close(db);
cout<<"num rows =" << *pnRow <<endl;
}
あなたの提案を読んだ後、私は自分のコードを変更しました。ここでselect count(*)を使用しますが、(which)変数は行数を保持します。私は、sqlite3_execでコールバック関数を実装する必要があります。また、行数がゼロより大きい場合はデータを取得する必要があります。コールバック関数でデータを取得した場合、それをテーブルのcountRowsを呼び出す関数に渡す方法は?私はグローバル変数を保持することができます。コールバックが実行されるとすぐに、それは条件変数を介して呼び出し関数を通知します。だから私は新しいスレッドでcountRowsInTable関数を維持する必要があります。私はもっと簡単なアプローチがありますか?
int countRowsInTable()
{
sqlite3 *db;
char *zErrMsg = new char[64];
int rc;
char const *sql;
char ***pazResult;
int *pnRow = new int; /* Number of result rows written here */
int *pnColumn = new int; /* Number of result columns written here */
//*pnRow = 0;
**pazResult = new char[20480];
rc = sqlite3_open("DeviceDetails.db", &db);
if(rc)
{
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return(0);
}
else
{
fprintf(stderr, "Opened database successfully\n");
}
/* Create SQL statement */
sql = "select count(*) from Device_Details";
/* Execute SQL statement */
rc = sqlite3_exec(db, sql, 0/*callback*/, 0/*(void*)data*/, &zErrMsg);
//rc = sqlite3_get_table(db, sql, pazResult, pnRow, pnColumn, &zErrMsg);
//void sqlite3_free_table(char **result);
if(rc != SQLITE_OK)
{
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
else
{
fprintf(stdout, "Operation done successfully\n");
}
}
char * zErrMsg = 0;を変更してみてください。 char ** zErrmsgに; – Ihdina
常に警告を有効にしてコードをコンパイルしてください。 –
これは役に立ちません –