2

私はプログラミングの初心者で、cocos2dx と sqlite を使ってゲームを作りたいと思っています。しかし、例やその方法が見つからないこの問題に遭遇しました。

最初にやりたいことは、範囲でフィルター処理されたテーブルから行をランダムに選択することです。たとえば、100 行のテーブルがあります。列 D の値 1 ~ 10 の間でフィルター処理すると、20 行になりました。これらの 20 からランダムに 1 つを選択します。

次に、そのランダムに選択された行について、5 つの異なる値を収集したいのですが、これまでのところ、それらを収集する方法に関する実際の例を見つけることができませんでした。

これが私が思いついたコードですが、機能していません:

  • クエリ
int MinColumnD = 1;
int Max ColumnD = 10;
int Dice =  ( rand() % 19 ) + 1;
char sql_query[100];
sprintf(sql_query, "SELECT A, B, C, D, E FROM SQList WHERE (ColumnD BETWEEN %d AND %d) ORDER BY RANDOM() LIMIT 1", MinColumnD, MaxColumnD);
std::list<INFO> details;
sqlite3_exec(DB, sql_query, CallBack, &details, &errorMessage);

* CL のコメントのおかげで、上記のクエリを更新して order by random() Limit 1 を含めました。ただし、実行してセクションに到達すると、xcode で次のエラーが発生します。

 Thread 1
 0 sqlite3_exec
 0x54cbd8: movl 60(%ebx), %eax   < Thread 1: EXC_BAD_ACCESS (code=1, address=0x444e418e)

これは、クエリの一部として「ORDER BY RANDOM()」を含めた場合にのみ発生するようです

  • 折り返し電話
int CallBack( void * pOutCount, int argc, char ** argv, char **azColName ){

std::list<Class::INFO> *pList = (std::list<Class::INFO >*)pOutCount;
Class::INFO items;
items._A = argv[0];
items._B = atoi(argv[1]);
items._C = atoi(argv[2]);
items._D = atoi(argv[3]);
items._E = atoi(argv[4]);
pList->push_back( items );
return 0;

}
  • 構造体
struct Class::INFO {

std::string _A;
int _B;
int _C;
int _D;
int _E;

};

*おそらく、sqlite クエリが不完全なため、結果が正しく得られませんが、std::list から返された値のリストをどのように正確に取得できるかわかりません。クエリの後、リスト内のコンポーネントを呼び出すだけで、次のような値を取得できると考えるのは正しいですか。

std::string A = details._A;
int B = details._B;
int C = details._C;
int D = details._D;
int E = details._E;

助けてください!

4

1 に答える 1

0

rowidどのがフィルタリングされた結果になるかわからないため、それらを使用することはできません。

フィルタリングされた結果からランダムなレコードを取得するには、最初に random を並べ替えてから、その最初のレコードを取得します。

SELECT A, B, C, D, E
FROM SQList
WHERE ColumnD BETWEEN ? AND ?
ORDER BY RANDOM()
LIMIT 1
于 2012-11-21T17:41:39.110 に答える