为何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
相关产品推荐
相关产品推荐

