以两种方式遍历INT数组

时间:2011-06-14 10:51:26

标签: c arrays algorithm loops arduino

以两种方式遍历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")

如何修复此代码才能正常工作?

5 个答案:

答案 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;