You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何numMarkers变量仅递减一次?机器人寻标程序异常求助

问题分析与修复方案

你的核心问题是numMarkers变量无法持续递减,每次循环后恢复为初始值4,导致程序陷入无限循环。结合代码和描述,主要排查方向和修复方法如下:

1. 确认numMarkers的作用域

如果numMarkers是局部变量(比如在findMarkers函数内部定义),你修改的只是变量副本,全局的标记物数量不会被持久化更新。请确保numMarkers是全局变量,或者通过指针/引用传递到函数中,让修改能作用到外部的实际变量。

2. 检查其他函数是否意外重置numMarkers

排查forward()、right()、left()等你调用的辅助函数,看是否有代码不小心将numMarkers重新赋值为4。这类隐性的变量修改很容易导致数值回滚。

3. 修正标记物移除后的循环逻辑

你的代码在找到标记物后通过break()跳出当前for循环,但存在索引逻辑漏洞:当移除标记物并递减numMarkers后,后续迭代可能因索引移位遗漏标记物。同时建议增加日志跟踪numMarkers的变化路径,确认在哪一步被重置:

// 找到标记物后补充日志,明确数值变化
numMarkers = numMarkers - 1;
printf("Markers left: %d | Current position: (%d, %d)\n", numMarkers, startX, startY);

优化后的标记物检测循环,避免索引混乱:

for (int i = 0; i < numMarkers; ) { // 不自动递增i
    int markerX = markersX[i];
    int markerY = markersY[i];

    if (startX == markerX && startY == markerY) {
        printf("Found a marker at (%d, %d)!\n", startX, startY);

        // 移除标记物
        for (int j = i; j < numMarkers - 1; j++) {
            markersX[j] = markersX[j + 1];
            markersY[j] = markersY[j + 1];
        }

        setColour(white);
        fillRect(markerX, markerY, squareSize, squareSize);

        numMarkers--;
        printf("There are %d left\n", numMarkers);
        // 移除后不递增i,因为下一个元素已移到当前i的位置
    } else {
        i++; // 没找到才递增索引
    }
}

4. 验证机器人位置更新逻辑

确保startX和startY(机器人当前位置)在forward()等移动函数中被正确更新——如果机器人位置未同步更新,会导致重复检测同一个位置,误以为标记物还存在。

内容的提问来源于stack exchange,提问作者Sara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 19:40:53