在运行时开始填充两个大向量

时间:2019-06-07 15:31:24

标签: c++ vector data-structures

我正在建立虚拟游戏经济体系,我的程序的首要任务是用从数据库中检索到的项目填充两个结构向量。我的两个结构在下面列出。

为数据库中的一组有限项目创建了项目对象; PItem保存数据库中的所有项目。 PItem的目的是经常修剪数据库。将它们一次加载到向量中就消除了在运行时进行后续读取操作的需要。

我遇到的问题是依次运行两个方法。如果我在程序启动后调用了两个函数,则Name值将填充为乱码。如果仅调用其中一个函数(任一函数),则可以很好地填充矢量,并且可以遍历所有结构并正确打印名称。我很好奇这是否是由于向量的动态分配。也许我有某种比赛条件。有趣的是,如果我同时运行两个函数,则所有整数值均会成功填充,但除非我仅调用一个函数,否则绝不会const 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 :(得分:0)

最后,由于某种原因,我无法隐瞒std :: string。仍在找出原因。但是,出于我的目的,我将const char * Name更改为char [20] Name并使用了strcpy。在那之后就像魅力一样。