函数不断返回相同的值
Functions keeps returning the same value
我的函数遇到了非常奇怪的问题。我正在尝试使用一种由x
和y
构建的结构vector<address>
遍历向量。大小始终是已知的,没有任何东西被删除。我正在尝试做的是使用给定的x
,y
函数应该向我返回存储这些值的向量元素的索引。
struct address {
unsigned int x;
unsigned int y;
unsigned int n;
address(int ax, int ay, int an): x(ax), y(ay), n(an) {}
};
查找索引的函数如下所示:
int find_box(vector<address> v, int x, int y, int j) {
int xc = x;
int yc = y;
if(v[j].x == xc && v[j].y == yc) {
return j;
}
}
这就是我调用函数的方式:
for(int j = 0; j<vectorBoxes.size(); j++) {
jot = find_box(temp->box,temp->player->x + MX[i],temp->player->y + MY[i], j);
}
在循环之前,我知道temp->player->x + MX[i]
= 4 和 temp->player->y + MY[i]
= 3。我也知道temp->box
的第一个元素 [0] 等于:x = 2
和 y = 3
。我也知道元素第三元素 [2] 的值为 x = 4
和 y = 3
。所以该函数应该返回我 2...
为什么该函数在第一个循环中返回 0
如果 find_box 函数在索引 j 处找不到元素,它将返回零。这意味着当您循环访问地址时,jot 将始终设置为零,除非最后一个地址恰好是您正在寻找的地址。
若要修复此问题,可以检测何时未找到匹配项,并返回指示此值的值,例如 -1。例如,这样的事情应该有效:
int find_box(vector<address> v, int x, int y, int j) {
if(v[j].x == x && v[j].y == y) {
return j;
}
return -1;
}
for(int j = 0; j<vectorBoxes.size(); j++) {
int tmp_jot = find_box(temp->box,temp->player->x + MX[i],temp->player->y + MY[i], j);
if (tmp_jot >= 0) {
jot = tmp_jot;
break;
}
}
break 语句只是为了提高效率,一旦找到匹配项,它就会停止 for 循环。没有它,它将工作。这段代码可以做得更整洁,但我不想完全改变你的逻辑。
再举一个例子,可以将find_box函数更改为实际执行搜索并返回索引:
int find_box(vector<address> v, int x, int y) {
for(int j = 0; j<v.size(); j++) {
if(v[j].x == x && v[j].y == y) {
return j;
}
}
return -1;
}
jot = find_box(vectorBoxes, temp->player->x + MX[i], temp->player->y + MY[i]);
目前,即使你可能找到了你想要的东西,你也会继续调用这个 find 函数。其次,当 if 语句不为 true 时,find_box
将返回垃圾,因为您尚未指定它应该返回的内容。
我建议(注意:作为对此的简单修复)从该函数返回一个bool
而不是您已经知道的值。无论如何,您应该始终显式返回一些内容,目前您只会在if
计算结果为 true 时返回一个合理的值,例如
bool find_box(vector<address> v, int x, int y, int j) {
int xc = x;
int yc = y;
if(v[j].x == xc && v[j].y == yc) {
return true;
}
return false;
}
找到您要查找的内容后,您还应该停止搜索,例如:
bool found = false;
for(int j = 0; j<vectorBoxes.size() && !found; j++) {
if(find_box(temp->box,temp->player->x + MX[i],temp->player->y + MY[i], j)) {
jot = j;
found = true;
}
}
添加默认返回值以检查它是否失败
int find_box(vector<address> v, int x, int y, int j) {
int xc = x;
int yc = y;
if(v[j].x == xc && v[j].y == yc) {
return j;
}
return -1; // a value which you can check and ignore
}
你的 problam 是 vectorBoxes.size() 可以大于 3。因此,即使您在下一次迭代中找到值 2,您的函数也会返回 void,这是您不想要的。
myrealvalue = 0;
for(int j = 0; j<vectorBoxes.size(); j++) {
jot = find_box(temp->box,temp->player->x + MX[i],temp->player->y + MY[i], j);
if(jot == -1)
continue;
else{
myrealvalue = jot;
break;
}
}
//access real value
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数