2012-08-30 82 views
0

有沒有辦法到一個數組轉換爲整數,我有如下方法,但它似乎不工作:轉換數組到一個整數

int8_t x_array[18] = {0,1,1,0,1,0,1,0,1,0,1,0,0,0,0,0,1,1}; 
int32_t numb; 

for (int8_t j=0;j<19;j++) 
{ 
    numb = numb + pow(2, i)*x_array[i]; 
} 

是否有一個原因?

PS:這是從以前的問題,我已經貼 Joining outputs from switches 我已經編輯了問題,說爲什麼建議的方法是不工作的後續問題。

實際上我想要做的是在模擬器軟件RAPIDILITTE中創建一個程序,以每毫秒爲18位數字輸入採樣一個PS輸入(接近傳感器系統)。輸入由位於端口2上的切換開關0-17(18位)表示。輸入需要在0-9999之間標準化)

主要問題是(我在前面提到過發佈問題)我一次只能訪問一個引腳,而不是一次讀取整個端口。我已經嘗試了很多方法來讀取引腳並將它們合併爲一個變量,將其轉換爲自然數,然後對輸入進行歸一化。最後,我相信最好的方法是將每個引腳讀入array[18],然後將其轉換爲變量,然後對其進行歸一化。

+1

順便說一下,它應該是'j <18'而不是'j <19'。 – Naveen

+0

在這個問題中的幾個問題:'''*不*'聲明,'for'循環迭代超出數組極限[應該是'j <18']。正確和轉貼... – Curious

+0

是的,我看到這個問題真的很抱歉,因爲你可以看到我發佈這個問題,像6am我是大部分的夜晚試圖找出它 – user1175889

回答

1

numb永遠不會初始化。你也迭代了數組中的最後一個元素(j < 19應該是j< 18)。此外,你從未宣稱i ......看起來你的意思是j

我相信你正試圖將位數組轉換成一個單一的int32_t。推測陣列按重要性升序排列,即從最低位到最高位。

int8_t x_array[18] = { 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1 }; 
int32_t numb = 0; 
for (int8_t j = 0; j < 18; ++j) { 
    numb |= x_array[j] << j; 
} 

你並不需要在這裏使用pow,因爲pow(2, j)相當於1 << j

+0

你已經在循環中「超出範圍」 – fasked

+0

@fasked是我糾正了這一點;這是原代碼中的一個問題。 – oldrinb

+0

當然這只是個例子,但我們需要避免使用宏或以下構造的幻數:'unsigned int size = sizeof(x_array)/ sizeof(array [0]);' 如果數組的大小將超過32:'assert(size <= sizeof(numb)* CHAR_BIT)'。 – fasked

3

你永遠不會初始化你的變量,所以閱讀它是明確的未定義的行爲。你應該說:

int32_t numb = 0; 

你也應該決定是否要ij作爲循環變量。

(計算功率,每次也是浪費;相反,你應該保持一個正在運行的乘數,在每一步加倍。)

+0

Hehehe ...整個代碼是計算能力浪費自己! (只是在開玩笑!)代碼寫得很好sooooooo unoptimized(即,代碼,演示事情如何從根本上工作) –

0

正如其他人提到的,你的問題是你沒有啓動麻木,並導致你的程序undefined bahaviour。
此外,你的循環計數器需要更改爲i而不是j

我只是想給你的程序添加一個其他修改,這就是你如何計算最終結果。這個怎麼樣 ?它需要更少的操作才能得到答案:

numb = 0; 
for (int8_t i=LEN;i>0;i--) 
    numb = numb*2 + x_array[i-1];