gpt4 book ai didi

c++ - 两个 std::vector 的 union 读取访问冲突

转载 作者:行者123 更新时间:2023-11-28 04:28:36 26 4
gpt4 key购买 nike

<分区>

我有两个 std::vectors 的 union ,当我调用 push_back 时,我遇到了读取访问冲突。我对 union 很陌生,所以我敢打赌我对他们做错了什么。知道为什么会这样吗?

struct Row
{
char order_id[30];
char garbage[994];
Row() {}
~Row() {}
};

struct Row_List
{
union
{
std::vector<Row> divided_row;
std::vector<char*> combined_row;
};
Row_List() {}
~Row_List() {}
};

int main(void)
{
Row_List results;

char current_row[1024];

//initialize row to null
for (int i = 0; i < 1024; ++i)
{
current_row[i] = '\0';
}

//error happens here
results.combined_row.push_back(current_row);

return 0;
}

编辑:我的最终总体目标是简化 SQLGetData(在 SQL.h 中)方法,使其将结果写入 Row vector 。目前,您只需给它一个指针,它就会将结果写入该内存位置。我想要一个函数将结果返回到我指定的结构中,但每个 SQL 查询的结果中可能有不同的字段。我以为 union 会让我将结果写入一个字符数组,然后将其作为我指定的结构读取。

我可能会运行一个返回 10 行的 SQL 查询,每行包含一个整数和一个字符数组。我还可能运行一个返回 100 行的查询,每行包含一个 bool 值、一个整数和两个字符数组。

在第一个示例中,我希望在包含一个整数和一个字符数组的结构 vector 中得到结果。在第二个示例中,我想要一个包含 bool 值、整数和两个字符数组的结构 vector 中的结果。

主要问题是我想要一种通用的方式来写入任何结构。不过,我可以传递数据类型大小列表。

执行此操作的示例函数:

bool SQL_Query::write_results(std::vector<std::array<char, 1024> >& results_vector)
{
/*
user makes a union of (a vector of long chars, and a vector of several small chars, ints etc.)
they pass the vector of long chars into this function
*/

//if not connected or if the query isnt successful or if the row structure hasnt been set then do nothing
if (!m_connected || !m_query_successful || !m_row_structure_set)
{
return false;
}

//for each row
while (SQLFetch(m_SQL_statement_handle) == SQL_SUCCESS)
{
//declare a single row
std::array<char, 1024> current_row;

//initialize row to null
for (int i = 0; i < 1024; ++i)
{
current_row[i] = '\0';
}

char* current_location = &current_row[0];

//for each column
for (unsigned int current_col = 1; current_col <= m_memory_size_list.size(); ++current_col)
{
//get next results max memory size
int current_buffer_size = m_memory_size_list.at(current_col - 1);

//write that into current_row at current_location
SQLGetData(m_SQL_statement_handle, current_col, SQL_C_DEFAULT, current_location, current_buffer_size, NULL);

//move to next write location in current_row by adding the current max memory size to
current_location += current_buffer_size;
}

//add single row to results vector
results_vector.push_back(current_row);
}

//return true if everything went right
return true;
}

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com