Заполнение двух больших векторов при запуске - PullRequest
0 голосов
/ 07 июня 2019

Я строю экономику виртуальной игры, и первая задача моей программы - заполнить два вектора структур элементами, полученными из базы данных.Мои две структуры перечислены ниже.

Объекты предметов создаются для конечного набора предметов в базе данных;В элементах хранятся все элементы из базы данных.Целью 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.");
}

Я пытаюсь заполнить оба вектора при запуске.Я не использую наиболее подходящие структуры данных для этого?Или это ошибка в моей логике их загрузки таким образом?Нужно ли реализовывать потоки и мьютекс?

1 Ответ

0 голосов
/ 08 июня 2019

В конце концов, по какой-то причине я не смог преобразовать в std :: string. Все еще выясняю почему. Однако для своих целей я изменил const char * Name на char [20] Name и использовал strcpy. После этого работал как шарм.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...