error : Vector subscript out of range error

时间:2015-07-10 20:34:17

标签: c++ vector

I have this code in c++ and I used vectors but I got this error:

error: Vector subscript out of range error.

Can some help me in this issue.

int const TN = 4;
vector <uint32_t> totalBytesReceived(TN);

void ReceivePacket(string context, Ptr <const Packet> p)
{
    totalBytesReceived[context.at(10)] += p->GetSize();
}

void CalculateThroughput()
{
    double mbs[TN];
    for (int f = 0; f<TN; f++)
    {
        // mbs = ((totalBytesReceived*8.0)/100000);
        mbs[f] = ((totalBytesReceived[f] * 8.0) / 100000);

        //totalBytesReceived =0;
        rdTrace << Simulator::Now().GetSeconds() << "\t" << mbs[f] << "\n";
        Simulator::Schedule(Seconds(0.1), &CalculateThroughput);
    }
}

2 个答案:

答案 0 :(得分:2)

好像是

totalBytesReceived[context.at(10)] += p->GetSize();

抛出异常,因为10位置context处的字符超出范围。由于您使用它来索引矢量,因此它必须在03的范围内。

查看您发布的context的内容:

"/NodeList/" 1 "/DeviceList/*/$ns3::WifiNetDevice/Mac/MacRx"
 ^         ^ ^
 0        10 12

如果要提取1并将其用作索引,则需要使用:

char c = context.at(12); // Extract the char.
int index = c - '0'; // Convert the character '1' to the integer 1.

这是因为ASCII标准决定了字符如何存储为数字。

答案 1 :(得分:0)

可能真正的问题是你得到了角色&#39; 1&#39;并使用其ASCII值作为向量的索引,而不是预期的整数值1。

这个越界访问是未定义的行为,在您的情况下会导致异常。

以下不是原因,请将其作为参考: 例外可能来自这个表达式:

context.at(10)

这是唯一涉及实际执行边界检查的(*)操作。 vector operator[]没有这样做,C数组也没有检查它的界限。

所以:你确定字符串上下文永远不会短于11个字符吗?

(*)访问超出范围的向量是未定义的行为,抛出异常是在可能的结果范围内。感谢Beta Carotin和Benjamin Lindley。

这是真实的事情:

另请注意,使用operator[]访问越界索引时,矢量不会像map那样调整大小,因此除非您可以保证字符串中的字符介于0和3之间(包括0和3),否则这将是你的下一期。

这意味着(size_t)0(size_t)3,而不是字符'0''3'