函数不断返回相同的值

Functions keeps returning the same value

本文关键字:返回 函数      更新时间:2023-10-16

我的函数遇到了非常奇怪的问题。我正在尝试使用一种由xy构建的结构vector<address>遍历向量。大小始终是已知的,没有任何东西被删除。我正在尝试做的是使用给定的xy函数应该向我返回存储这些值的向量元素的索引。

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 = 2y = 3 。我也知道元素第三元素 [2] 的值为 x = 4y = 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