有没有办法将数组转换为整数,我有以下方法,但它似乎不起作用:
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中创建一个程序,它是一个模拟器软件,每毫秒采样一个PS输入(接近传感器系统),即18位数字输入。输入由位于端口2上的拨动开关0-17(18位)表示。输入需要在0-9999之间标准化。
主要问题是(我在之前发布的问题中提到过)我一次只能访问一个引脚,而不是一次读取整个端口。我已经尝试了很多方法来读取引脚并将它们组合成一个变量,将其转换为自然数,然后对输入进行标准化。最后,我认为最好的方法是将每个引脚读入array[18]
,然后将其转换为变量,然后将其标准化。
答案 0 :(得分:3)
您永远不会初始化您的变量,因此阅读它是明显的未定义的行为。你应该说:
int32_t numb = 0;
您还应该决定是否需要i
或j
作为循环变量。
(每次计算功率也是浪费;相反,你应该保持一个运行的乘数,并在每一步加倍。)
答案 1 :(得分: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
。
答案 2 :(得分:0)
正如其他人提到的那样,你的问题是你没有说服麻木,导致程序未定义的行为。
此外,您的循环计数器需要更改为i
而不是j
!
我只是想为你的程序添加另一个修改,这就是你如何计算最终结果。这个怎么样 ?得到答案需要更少的操作:
numb = 0;
for (int8_t i=LEN;i>0;i--)
numb = numb*2 + x_array[i-1];