两种方式遍历INT数组

| 以两种方式遍历INT数组是一个机器人有趣的代码(用C语言编写)。 我有一个这样的职位数组:
int pos[] = {0, 45, 90, 135, 180, 135, 90, 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;
    .......
    .......
}
这将随机选择位置,直到遇到障碍物为止,并且也无需重置它,因为在遇到障碍物时循环会自动中断。     

要回复问题请先登录注册