Я строю экономику виртуальной игры, и первая задача моей программы - заполнить два вектора структур элементами, полученными из базы данных.Мои две структуры перечислены ниже.
Объекты предметов создаются для конечного набора предметов в базе данных;В элементах хранятся все элементы из базы данных.Целью PItems является сокращение базы данных очень часто.Загрузка их один раз в вектор исключает необходимость последующих операций чтения во время выполнения.
У меня проблема с запуском обоих методов по очереди.Если я вызываю обе функции после запуска программы, значения Name заполняются символами мусора.Если я вызываю только одну из функций (либо одну), то вектор заполняется нормально, и я могу перебирать все структуры и печатать имена точно.Мне любопытно, если это связано с динамическим распределением векторов.Может быть, у меня какое-то состояние гонки.Интересно, что все целочисленные значения заполняются успешно, если я запускаю обе функции, но никогда не сопоставляю типы данных char *, если только я не вызываю только одну функцию.
В нынешнем виде я могу вызывать только одну функцию или другую, но необа.
Я пытался поместить их в разные потоки и присоединить к ним после завершения, но пока не увенчался успехом.Я также попытался создать структуру, содержащую векторы вместо многомерных векторов, но это также оказалось неудачным.
Структуры элементов
struct Item
{
const char* Name = "";
uint16 ID = 0;
uint32 Price = 0;
uint8 Stack = 0;
};
struct PItem
{
const char* Name = "";
uint16 ID = 0;
};
Процедура загрузки элементов в векторы
extern CData* DB;
extern thread_local sqldata* SQL;
auto LoadBotItems(std::vector<std::vector<Item>> &Items) -> void
{
Message::Status("Loading item lists");
std::vector<Item> Ammo;
std::vector<Item> Armor;
std::vector<Item> Common;
std::vector<Item> Food;
std::vector<Item> Materials;
std::vector<Item> Weapons;
qresult Q = DB->Query(SQL, "SELECT Name, ID, Price, Qty, Cat FROM bot_data;");
if (Q == PASS && DB->NumRows(SQL) != 0)
{
while (DB->NextRow(SQL) == PASS)
{
Item I;
I.Name = (const char*)DB->GetText(SQL, 0);
I.ID = (uint16)DB->GetUInt(SQL, 1);
I.Price = (uint32)DB->GetUInt(SQL, 2);
I.Stack = (uint8 )DB->GetUInt(SQL, 3);
uint8 Cat = (uint8 )DB->GetUInt(SQL, 4);
if (Cat == 1) // Ammo
Ammo.push_back(I);
else if (Cat == 2) // Common
Common.push_back(I);
else if (Cat == 3) // Weapon
Weapons.push_back(I);
else if (Cat == 4) // Armor
Armor.push_back(I);
else if (Cat == 5) // Materials
Materials.push_back(I);
else if (Cat == 6) // Food
Food.push_back(I);
}
}
else
{
Message::Error("Could not load bot items!");
return;
}
Items.push_back(Ammo);
Items.push_back(Armor);
Items.push_back(Common);
Items.push_back(Food);
Items.push_back(Materials);
Items.push_back(Weapons);
Message::Status("Bot items have been loaded.");
}
auto LoadPurgeItems(std::vector<PItem> &PItems) -> void
{
qresult A = DB->Query(SQL, "SELECT ID, Name FROM Items WHERE Cat != 0;");
if (A == PASS && DB->NumRows(SQL) != 0)
{
while (DB->NextRow(SQL) == PASS)
{
PItem I;
I.ID = (uint16)DB->GetUInt(SQL, 0);
I.Name = (const char*)DB->GetText(SQL, 1);
PItems.push_back(I);
}
}
else
{
Message::Error("Could not load purge items!");
return;
}
Message::Status("Purge items have been loaded.");
}
Я пытаюсь заполнить оба вектора при запуске.Я не использую наиболее подходящие структуры данных для этого?Или это ошибка в моей логике их загрузки таким образом?Нужно ли реализовывать потоки и мьютекс?