向量更改值意外
Posted
技术标签:
【中文标题】向量更改值意外【英文标题】:Vector changes value unexpected 【发布时间】:2014-04-02 19:40:09 【问题描述】:我正在制作一个小游戏(只是控制台),但我的向量并没有像我认为的那样表现。向量的一个值只是改变了,我不知道为什么。下面显示的代码是此错误的来源,我删除了这两个向量出现的其余代码,但错误仍然出现,我不知道为什么! 这部分代码负责让 Enemy 向随机方向扩散。
/**in this part the first value of the 2 vectors are created
(only once, I've tested it)**/
if(moves == 0)
int randomNum1 = (rand() % HEIGHT)+1;
int randomNum2 = (rand() % WIDTH)+1;
_EnemysY.push_back(randomNum1);
_EnemysX.push_back(randomNum2);
/**_Enemy vectors have normal values. For instance: _EnemysX[0]
is 23 and _EnemysY[0] is 12**/
/**In this part, the Enemy spreads in a random direction**/
if (moves > 3)
//save Enemys at the border here (those who can move)
std::vector<int> topX;
std::vector<int> topY;
std::vector<int> botX;
std::vector<int> botY;
std::vector<int> rigX;
std::vector<int> rigY;
std::vector<int> lefX;
std::vector<int> lefY;
/**here, I wanna save all Fields of the Enemy where it can spread to:**/
for (Uint it = 0; it < _EnemysY.size(); it++)
/**_EnemysY is still normal, but _EnemysX is like: 86BF163E0**/
if (_map[_EnemysY[it]-1][_EnemysX[it]] == _Grenade || _map[_EnemysY[it]-1][_EnemysX[it]] == _Field)
topY.push_back(_EnemysY[it]);
topX.push_back(_EnemysX[it]);
if (_map[_EnemysY[it]+1][_EnemysX[it]] == _Grenade || _map[_EnemysY[it]+1][_EnemysX[it]] == _Field)
botY.push_back(_EnemysY[it]);
botX.push_back(_EnemysX[it]);
if (_map[_EnemysY[it]][_EnemysX[it]-1] == _Grenade || _map[_EnemysY[it]][_EnemysX[it]-1] == _Field)
lefX.push_back(_EnemysX[it]);
lefY.push_back(_EnemysY[it]);
if (_map[_EnemysY[it]][_EnemysX[it]+1] == _Grenade || _map[_EnemysY[it]][_EnemysX[it]+1] == _Field)
rigX.push_back(_EnemysX[it]);
rigY.push_back(_EnemysY[it]);
/**and here is a random direction created and the programm
chooses which Field it will spread to: **/
for (;;)
int ranDir = (rand() % 4)+1;
if (ranDir == 1 && !topY.empty())
int temp = (rand() % topY.size())+1;
_EnemysY.push_back(topY[temp]);
_EnemysX.push_back(topX[temp]);
return true;
if (ranDir == 2 && !botY.empty())
int temp = (rand() % botY.size())+1;
_EnemysY.push_back(botY[temp]);
_EnemysX.push_back(botX[temp]);
return true;
if (ranDir == 3 && !lefY.empty())
int temp = (rand() % lefY.size())+1;
_EnemysY.push_back(lefY[temp]);
_EnemysX.push_back(lefX[temp]);
return true;
if (ranDir == 4 && !rigY.empty())
int temp = (rand() % rigY.size())+1;
_EnemysY.push_back(rigY[temp]);
_EnemysX.push_back(rigX[temp]);
return true;
【问题讨论】:
无处检查向量索引是否在界限内。我建议暂时改为调用 at() 而不是使用 []。这将验证您是否超出范围(如果索引超出范围,at() 函数将引发异常)。 cplusplus.com/reference/vector/vector/at/http://… @PaulMcKenzie 不,这不是问题所在,它只是在进入 for 循环时更改了 _EnemysX 的值:(_map
的类型是什么?
@Aemmel - 每当值“自行”更改时,通常意味着数据或缓冲区溢出。由于显示的代码不使用指针但确实使用了向量,并且使用了vector::operator[],因此使用at() 来查看所有值是否都在边界内的建议是有效的。
@PaulMcKenzie 好的,我试过了,但没用,你可以在上面的代码中看到 cmets 中值的变化。奇怪的是,之前在我的代码中使用了相同的技术:/
【参考方案1】:
首先,为什么不用struct
描述“敌人”,包括其位置(通过两个字段X
和Y
)?它将稍微改进代码并避免需要两个如果分开就没有意义的向量。
主题:
int temp = (rand() % rigY.size())+1;
_EnemysY.push_back(rigY[temp]);
rand() % rigY.size()
会给你一个区间 [0, rigY.size()
) 中的数字。然后在两边加 1,这样 temp
就会在区间 [1, rigY.size()
] 中。
但是rigY[rigY.size()]
不是向量中的有效元素...
【讨论】:
另外,你确定你的两个向量有相同的大小吗?同样,这个问题可以通过使用描述实体的结构或类来解决。 好的,谢谢,我会尝试,但它仍然没有真正回答我的问题:“为什么一个向量只是将它的值从例如 23 更改为 86BF163E0?”我就是想不通。 (我有这个问题1周了>. @Aemmel 索引it
从 0 变为 _EnemysY.size()
,但您也可以使用它来遍历 _EnemysX
。您确定该值已初始化吗?如果是这样,您可以添加数据断点并查看值更改的位置。
是的,_EnemysX 已初始化,我之前也在这个程序中使用过这种技术(也是向量),它工作得很好。顺便说一句:什么是数据断点? (我现在才编程5个月^^)
@Aemmel 然后在改变的元素上添加数据断点,看看哪行代码改变了它。无论如何,“工作得很好”并不能保证任何事情。您的代码不符合标准:您正在访问数组边界之外的元素(请参阅我的回答),并且您还使用了保留标识符(以下划线后跟大写字母开头并保留的标识符用于 C++ 实现)。【参考方案2】:
首先:感谢 Andrei 和 PaulMcKenzie 的宝贵时间,您的回答并没有解决问题,但它们仍然有用。 :)
现在回答问题:
好的!我是个十足的混蛋!因为我没有在上面的代码中打印,是我的变量的 std::cout ,我不小心写了:“std::cout
【讨论】:
以上是关于向量更改值意外的主要内容,如果未能解决你的问题,请参考以下文章