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);
}
}
答案 0 :(得分:2)
好像是
totalBytesReceived[context.at(10)] += p->GetSize();
抛出异常,因为10
位置context
处的字符超出范围。由于您使用它来索引矢量,因此它必须在0
到3
的范围内。
查看您发布的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'
。