【问题标题】:Assertion Failure Error, vector subscript out of range problem in C++断言失败错误,C++ 中的向量下标超出范围问题
【发布时间】:2020-01-05 13:42:48
【问题描述】:

我的目标是将vec 数组设置为intData 数组。我阅读了this question 并将其应用于我的代码。在执行此过程之前,我调整了 intData 的大小。在 C# 中,这个 intData = GetIntArrayFromByteArray(vec); 没有问题,但是当涉及到 C++ 中的数组向量时,我感到很困惑。我在评论中说明了我在哪里得到错误。我尝试调整大小,但没有奏效。有人可以帮帮我吗?

代码说明;

  • buf 收到消息(它不为空我收到来自客户端的消息

  • 我创建了一个向量数组vec,其大小与buf相同

  • GetIntArrayFromCharArray() 将 char 向量数组转换为 int 数组 向量。

        char buf[1550];//message gets here not empty
        vector<uint16_t> intData; //empty int vector
        //char buf ----> vecor<char> vec
    
        int n = sizeof(buf) / sizeof(buf[0]);
        vector<char> vec(buf, buf + n);
        intData.resize(vec.size());//here I resize
    
    
        /*
           irrelevant code piece runs here
        */
    
    
        if (something == 1)// First fragment
        {
            intData = GetIntArrayFromCharArray(vec);//size out of range error here
    
        }
    

这是GetIntArrayFromCharArray() 进行转换

vector<uint16_t> GetIntArrayFromCharArray(vector<char> arr)
{
    // If the number of bytes is not even, put a zero at the end
    if ((arr.size() % 2) == 1)
        arr.resize(arr.size()+1);
    arr.push_back(0);


    vector<uint16_t> intArray;

    for (int i = 0; i < arr.size(); i += 2)
        intArray.push_back((uint16_t)((arr[i] << 8) | arr[i + 1]));

    return intArray;
}

【问题讨论】:

  • intData.resize(..); intData = GetIntArrayFromCharArray(vec); resize 是不需要的。
  • @Jarod42 没有它,仍然给出同样的错误
  • 我没有说是/修复错误,只是可以安全地删除它。
  • @Selen 无需在您的问题上添加 [已解决] 标记,您只需接受您给出的答案即可。

标签: c++ vector


【解决方案1】:
// If the number of bytes is not even, put a zero at the end
if ((arr.size() % 2) == 1)
    arr.resize(arr.size()+1);
arr.push_back(0);

哎呀!

这其实是:

  • "如果字节数不偶数,最后加零"
  • “然后总是在最后加上一个零”

结果是你将总是有奇数个元素。当您尝试读取向量末尾的一个时,这会中断后续循环。

我不认为你打算把 push_back 放在那里,或者你可能打算用它代替 resize 调用。


顺便说一句,正如 Jarod 指出的那样,预先调整 intData 的大小完全是浪费时间,因为接下来你用它做的事情(据我们所见)就是替换整个向量。

【讨论】:

  • 整个代码太复杂了,我试图简化它,但看起来有些步骤是不必要的,实际上并非如此。我应该上传完整的代码吗?
  • 你可以只听我的建议吗?
  • “看起来有些步骤是不必要的,实际上不是” 如果它们与问题无关,您应该将它们抽象出来(阅读:假装他们不存在),因为它们是不相关的。这是构建minimal reproducible example 的一部分。
猜你喜欢
  • 2021-06-29
  • 2016-02-14
  • 2016-05-02
  • 1970-01-01
  • 2017-06-18
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多