内構造を埋めようと、私は構造体を次のようしている。sqlite3の - コールバック
static int callback(void* data, int argc, char** argv, char** colName) {
Highscore* highscore = (Highscore*)data;
highscore->username = argv[0];
highscore->score = argv[1];
return 0;
}
とデータベースのオーケストレーションは、構造体と、ここで使用されている:以下のようにそれを使用して
typedef struct {
char *username;
char *score;
} Highscore;
を
Highscore* getHighscore()
{
sqlite3* db_handle;
int rc;
char* zErrMsg;
Highscore* highscore = malloc(sizeof(Highscore));
/* highscore->username = malloc(sizeof(100)); */
/* highscore->score = malloc(sizeof(100)); */
//Datenbankverbindung oeffnen
rc = sqlite3_open(DATABASE_FILE, &db_handle);
char* sSqlString = sqlite3_mprintf
("select U.Username, H.Punkte from Highscore H join User U on U.B_ID = H.B_ID order by Punkte desc limit 10");
//SQL Statement ausfuehren
rc = sqlite3_exec(db_handle, sSqlString, callback, highscore, &zErrMsg);
//Datenverbindung schliessen und Speicher leeren
sqlite3_free(sSqlString);
rc = sqlite3_close(db_handle);
return highscore;
}
問題は、コールバックスコープ内でHighscore構造体がフィールドを割り当てていることです"username"と "score"はそれがすべきである方法です。私はその位置でデバッグし、すべてうまくいきました。
しかし、 "getHighscore"のスコープに戻ったとき、Highscore構造体のフィールドには任意の値があります。私は何が起こっているのか分かりません?私は "malloc"でコールバックに与える前に、構造体を割り当てました。コールバックの後で同じアドレスかどうかを確認しました。なぜ値が壊れているのですか?
_every_行を取得するために 'callback'が呼び出されます。あなたが正しいことをしたとしても、 'argv'文字列を複製することによって、同じ構造体に対して反復可能な踏み違えを引き起こし、' highscore'は最終行の値しか保持しません。 – Oka