以两种方式遍历INT数组是一个机器人有趣的代码(在C中)。
我有一系列这样的职位:int pos[] = {0, 45, 90, 135, 180, 135, 90, 45};
这些位置用于移动伺服电机。
45 90 135
\ | /
\ | /
\ | /
0 ----------- 180
在主loop()
中,我检查距离障碍物的距离,如果它是< xx Cm
,我的伺服必须旋转到下一步(下一个阵列位置),直到它找到一个自由的方式(> 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
位置,我发现了一个障碍。我想从左到右循环数组,反过来控制每一步的距离。如果我找不到高速公路,print("ko")
其他print("ok")
。
如何修复此代码才能正常工作?
答案 0 :(得分:3)
你真的想要i < sizeof(pos) / sizeof(*pos)
而不是i < sizeof(pos)
。数组的大小不是其元素的数量,而是它在内存中占用的总字节数。
sizeof(pos)
会产生8 * sizeof(int)
。如果int
是4个字节,则循环32次而不是8次。
此外,i == sizeof(pos)
在循环体中永远不会成为真,因为for
语句的条件将i
限制为sizeof(pos) - 1
。
答案 1 :(得分:1)
如果我正确理解你的问题,你需要伺服从左到右,然后从右到左进行扫描。测量到每个角度可以在机器人前面的物体的距离。如果在机器人前面有一个自由的方法,则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'变量。检测开头(i == 0)或'pos'数组的末尾(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;
...
干杯, 约翰
答案 2 :(得分:0)
不要忘记使用
初始化你的rand功能/* initialize random seed: */
srand ( time(NULL) );
distance = rand() % 7;
答案 3 :(得分:0)
尝试使用while
循环而不是for
循环。在没有障碍物时增加值,在找到障碍物时中断:
{
......
......
i = rand()%7;
move( pos[i]);
if (i<5)
break;
else
continue;
.......
.......
}
这将随机选择位置直到你遇到一个障碍物,并且不需要重置它,因为当遇到障碍物时环路会自动断开。
答案 4 :(得分:0)
这可能是一个很好的做法:
#define POSLENGTH 8
然后使用i<POSLENGTH
进行迭代:正如其他人指出的那样使用sizeof(pos)
可能无法正常工作。
此外,C中的数组基于0:元素为0,1,2,3,... n-1。 所以,你需要说:
if (i==POSLENGTH-1) i=0;