error: Vector下标超出范围错误
error : Vector subscript out of range error
我在c++中有这个代码,我使用向量,但我得到了这个错误:
在这个问题上有人能帮我吗?error: Vector下标超出范围错误。
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);
}
}
看起来
totalBytesReceived[context.at(10)] += p->GetSize();
抛出异常,因为context
的位置10
的字符超出了范围。因为你用它来索引向量,它必须在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'并使用其ASCII值作为向量的索引,而不是预期的整数值1。
这种越界访问是未定义的行为,在你的情况下会导致异常。
以下不是原因,留作参考:异常可能来自以下表达式:
context.at(10)
这是实际执行边界检查的唯一操作(*)。向量operator[]
不会这样做,C数组也不会检查它的边界。
那么:你确定字符串上下文不短于11个字符吗?
(*)访问超出边界的向量是未定义的行为,抛出异常是可能的结果。这要感谢β -胡萝卜素和本杰明·林德利。
这是真正的东西:
还要注意,当使用operator[]
访问出界索引时,vector不像map那样调整大小,所以除非你能保证字符串中的字符在0到3之间,否则这将是你的下一个问题。
这是指(size_t)0
和(size_t)3
,而不是字符'0'
和'3'
。
相关文章:
- "myClock"未在此范围错误中声明
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- Visual C:命名空间范围错误或晦涩功能?
- 在遍历字符串时,为什么我没有超出范围错误,即使我已经超出了它的长度?
- 此范围错误中未声明如何修复
- 尝试声明函数的局部变量,但得到范围错误
- c ++ to_string未在此范围错误 [Windows + Devcpp 环境] 中声明
- 将文件读取到向量的向量,超出范围错误
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- Eratosthenes C 的筛子 - 内存处的范围错误
- 向量:内存处的范围错误
- 测试完美哈希函数时超出范围错误
- 为什么此代码会给出 Vector 超出范围错误
- 在填充 Arduino 草图时出现范围错误
- 如何修复C++中矢量的"下标超出范围"错误?
- CPP-模板范围错误
- 在此范围错误中未声明函数错误
- C 表达式:向量下标出范围错误线:1733
- 无法在好友函数中实例化类?我没有得到在范围错误中声明
- 带有类的嵌套结构.范围错误