DXライブラリを用いてVS2017でゲームを制作している初心者です。
sqlite3を以下のサイトを参考にしてVS2017に実装しようとしています。
https://bit.ly/3lxG6Mj
ですが必ず決まった所(あ)でエラーが発生してしまいます。
調べてみると、ItemCallback関数のdata[2]の値が整数を表現していない事が分かりました。
data[0],data[1]までは正しい値が入っていたのですが、data[2],data[3],data[4]は0という値にしかなりません。
ItemCallback関数の中でどういう処理がされているのか僕には分からないので、どなたか分かる方がいましたらアドバイス頂けると助かります。
以下のプログラムはメインプログラムの一部です。
全てを載せると何千行となってしまうので一部だけ載せていますが、sqlite3に用いている部分はここしかなく、また他の部分は何度も確認してエラーが起こらなかったので、間違いがあるなら以下のプログラムの中にしかないと思います。
(追記)
すみませんエラーメッセージを載せるのを忘れていました。
正確にはエラーメッセージではなく、例外処理なのですがそれも載せておきます。
「ハンドルされない例外が 0x00E29026 (game.exe) で発生しました: 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。」
C++
1//「アイテムの仕様」のクラス 2class ITEM_SPEC { 3public: 4 int id = -1;//ID 5 string name = "";//名前 6 int i_type = -1;//アイテムの種類 7 int price = -1;//買値 8 int selling = -1;//売値 9}; 10 11vector<ITEM_SPEC> vitem_s; 12 13//sqlite3に用いる関数 14int CountCallback(void* pOutCount, int size, char **rec, char **ColName) { 15 int *count = (int*)pOutCount; 16 *count = atoi(*rec); 17 return 0; 18} 19 20//sqlite3に用いる関数 21int ItemCallback(void* iteminfo, int size, char **data, char **ColName) { 22 vector<ITEM_SPEC> *vitem = (vector<ITEM_SPEC>*)iteminfo; 23 ITEM_SPEC item; 24 25 item.id = atoi(data[0]); 26 item.name = data[1]; 27 item.i_type = atoi(data[2]);//・・・(あ)ここで例外処理が起こる。 28 item.price = atoi(data[3]); 29 item.selling = atoi(data[4]); 30 31 vitem->push_back(item); 32 33 return 0; 34} 35 36//sqlite3のブロック 37 { //sqlite3を用いでデータベースからデータを取得する 38 char *errMsg = 0; 39 40 sqlite3 *ItemDB = 0; 41 int rc = sqlite3_open("Item.db", &ItemDB); 42 if (rc != SQLITE_OK) { 43 return; 44 } 45 46 char Create_SQL[] = "create table ItemTable (" 47 "ID integer primary key," 48 "名前 text not null unique," 49 "道具の種類 integer not null," 50 "買値 integer not null," 51 "売値 integer not null" 52 ")"; 53 54 sqlite3_exec(ItemDB, Create_SQL, 0, 0, &errMsg); 55 56 char Insert_SQL[] = "insert into ItemTable(ID,名前,道具の種類,買値,売値)" 57 "values(%d,'%s',%d,%d,%d)"; 58 59 FILE *fp; 60 if ((fp = fopen(database_file02.txt, "r")) == NULL) { 61 printfDx("%sが開けません\n", database_file02.txt); 62 sqlite3_close(ItemDB); 63 return; 64 } 65 66 char dummy[1000], name[100], InsertSQL[1000]; 67 int iCount 68 int id = 0;//ID 69 //string name = ""; 70 int i_type = -1;//アイテムの種類 71 int price = -1;//買値 72 int selling = -1;//売値 73 74 fgets(dummy, 1000, fp);//列名無視 75 76 int r = 0; 77 78 79 while (1) { 80 fscanf(fp, "%d%s%d%d%d", &id,name,&i_type,&price,&selling); 81 82 if (feof(fp)) 83 break; 84 85 sprintf(InsertSQL, Insert_SQL, id, name, i_type, price, selling); 86 sqlite3_exec(ItemDB, InsertSQL, 0, 0, &errMsg); 87 } 88 89 char Select1_SQL[] = "select count(*) from ItemTable"; 90 91 sqlite3_exec(ItemDB, Select1_SQL, CountCallback, &iCount, &errMsg); 92 93 char Select2_SQL[] = "select * from ItemTable"; 94 95 //この関数のItemCallbackでエラーが起きている。 96 sqlite3_exec(ItemDB, Select2_SQL, ItemCallback, &vitem_s, &errMsg); 97 98 99 sqlite3_close(ItemDB); 100 }
回答1件
あなたの回答
tips
プレビュー