问题描述
|
以两种方式遍历INT数组是一个机器人有趣的代码(用C语言编写)。
我有一个这样的职位数组:
int pos[] = {0,45,90,135,180,45};
这些位置用于移动伺服电机。
45 90 135
\\ | /
\\ | /
\\ | /
0 ----------- 180
在主菜单ѭ2中,我检查到障碍物的距离,如果距离为ѭ3,则我的伺服必须旋转到下一个步骤(下一个数组位置),直到找到自由路径(> xx Cm
)为止。
我的主要方法很简单:
int main (int argc,const char * argv[]) { for (;;) find(); }
而我的核心功能(查找)是这样的:
void find() {
for ( i=0; i<sizeof(pos); i++ ) // Traversing position array
{
distance = rand() % 7; // Simulate obstacle distance
move( pos[i] ); // Simulate movements
if (i==sizeof(pos)) { i=1; } // Try to reset the \"i\" counter. PROBLEM!
if ( distance<=5 ) continue; // Is there an obstacle?
sleep(2); // Debug sleep
find(); // Similar recursion
}
}
我不知道这段代码有什么问题,但是我需要移动伺服直到没有障碍。
例:
在位置90
,我发现一个障碍。我想从左到右循环数组,反之亦然,每一步都控制距离。如果我找不到高速公路,way8ѭ,否则print(\"ok\")
。
如何解决此代码以使其正常工作?
解决方法
如果我正确理解了您的问题,则希望伺服器从左到右进行一次横扫,然后再从右到左进行一次横扫。测量每个角度下到机器人前方物体的距离。如果机器人前方有自由路,则find方法返回。
int pos[] = {0,45,90,135,180,-1};
void find()
{
int i = 0;
int direction = 1;
do {
move(pos[i]);
i += direction;
if (pos[i+direction] == -1) direction = -1;
if (i==0) direction = 1;
} while(measure_distance() <= 5);
}
除了递归,还有一个while循环,仅当距离大于5时才退出。
\'pos \'数组的末尾(-1)有一个前哨。这是一个无效的角度,可用于查找数组的末端。无需计算元素数量。
左右,左右移动来自使用\'direction \'变量。很容易检测\'pos \'数组的开始(i == 0)或结尾(pos [i + 1] == -1),这时我们反转了方向。
也无需在180度后重复角度。我们得到的顺序是:
0 45 90 135 180 135 90 45 0 45 90 ...
我们甚至可以减少一行代码。
...
if (pos[i+direction] == -1 || i == 0) direction *= -1;
...
干杯,
约翰
, 您真正想要的是i < sizeof(pos) / sizeof(*pos)
而不是i < sizeof(pos)
。数组的大小不是其元素的数量,而是它在内存中占用的总字节数。
sizeof(pos)
得到8 * sizeof(int)
。如果int
是4个字节,则循环32次而不是8次。
另外,由于for
语句的条件将i
限制为sizeof(pos) - 1
,因此i == sizeof(pos)
在循环体内永远不会成立。
, 不要忘记使用初始化rand函数
/* initialize random seed: */
srand ( time(NULL) );
distance = rand() % 7;
, 最好说一下:
#define POSLENGTH 8
然后使用i<POSLENGTH
进行迭代:正如其他人指出的那样,使用sizeof(pos)
可能行不通。
同样,C语言中的数组基于0:元素变为0、1、2、3,... n-1。
因此,您需要说:
if (i==POSLENGTH-1) i=0;
, 尝试使用while
循环而不是for
循环。在没有障碍物的情况下增加该值,在发现障碍物时中断该值:
{
......
......
i = rand()%7;
move( pos[i]);
if (i<5)
break;
else
continue;
.......
.......
}
这将随机选择位置,直到遇到障碍物为止,并且也无需重置它,因为在遇到障碍物时循环会自动中断。