2011-06-14 54 views
1

以兩種方式遍歷INT數組是一種機器人有趣代碼(以C爲單位)。以兩種方式遍歷INT數組

我有這樣一個陣列位置: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

您的代碼有幾個問題,這可能會導致您的索引問題。你的'find'沒有原型,非常糟糕。你沒有給我們「我」的聲明。一個全局變量?什麼類型?所有'i','distance','pos'都應該是局部變量或函數的參數。 – 2011-06-14 12:13:47

+0

@Jens,這是一個**模擬,而不是真正的代碼**。很顯然,缺少'雙距離'和'find'的原型,但解決問題並不重要!我手動寫這段代碼! – elp 2011-06-14 12:28:11

回答

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.

在「正」陣列具有在端部(-1)定點退出。這是一個無效的角度,可用於查找數組的結尾。沒有必要計算元素的數量。

左右,左右移動來自使用'方向'變量。檢測開始(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; 
... 

歡呼聲, Johan

+0

正確的答案,因爲我想要! :) – elp 2011-06-16 09:09:31

3

你真的想要i < sizeof(pos)/sizeof(*pos)而不是i < sizeof(pos)。數組的大小不是其元素的數量,而是它在內存中佔用的總字節數。

sizeof(pos)得率8 * sizeof(int)。如果int爲4個字節,你是循環的,而不是8

而且32次,i == sizeof(pos)永遠在循環體是真實的,因爲的for聲明限制條件isizeof(pos) - 1

0

不要忘記使用

/* initialize random seed: */ 
srand (time(NULL)); 

distance = rand() % 7; 
+0

謝謝,但rand()沒有用在真正的proj中。這是一個模擬 – elp 2011-06-14 10:58:33

0

嘗試使用while循環,而不是for環路初始化蘭特功能。增加值時不存在任何障礙,打破當你發現一個障礙:

{ 
    ...... 
    ...... 
    i = rand()%7; 
    move(pos[i]); 

    if (i<5) 
     break; 
    else 
     continue; 
    ....... 
    ....... 
} 

這將隨機選擇的位置,直到你得到一個障礙,也將沒有必要將其重置爲循環將自動中斷遇到障礙。

0

這可能是很好的做法,說: #define POSLENGTH 8 ,然後重複使用i<POSLENGTH:正如其他人指出,使用sizeof(pos)可能是行不通的。

此外,C中的數組基於0:元素爲0,1,2,3,... n-1。 所以,你需要說:

if (i==POSLENGTH-1) i=0;