Дана 24-битная строка, включенная в три 8-битных регистра, скажем: массив [0], массив [1], массив [2], где первый бит массива [0] — старший бит, а последний бит массива [2] — младший бит. . Моя цель - преобразовать эту строку в целочисленное значение.
Для этой цели я написал следующий код:
uint32_t bin2Int(uint8_t array[]) {
uint8_t arr0[3];
uint8_t mask = 0x80;
uint8_t outputData[24];
uint8_t s;
uint8_t k = 23;
uint32_t IntResult = 0;
for (s=0; s<3; s++) {
arr0[s] = *array[s];
while (mask > 0) {
outputData[k] = arr0[s] & mask;
mask >>= 1;
k--;
}
mask = 0x80;
}
for (s=0; s<24; s++) {
if(outputData[s] != 0)
IntResult += pow(2, s);
}
return IntResult;
}
Эта функция реализована в STM32CubeIde, когда я собираю проект, компилятор возвращает следующую ошибку: «недопустимый аргумент типа унарного '*' (есть 'int')». Прежде чем добавить этот код в свой проект, я протестировал его в DevC ide, и он отлично работает, но когда я пробую его на STM32CubeIde, он возвращает эту ошибку. Что не так в моем коде? Большое спасибо.
2 ответа
В этом заявлении
arr0[s] = *array[s];
Правостороннее выражение имеет тип указателя uint8_t *
, а левостороннее выражение имеет тип uint8_t
.
Кажется ты имеешь ввиду
arr0[s] = array[s];
И функция должна быть объявлена как минимум
uint32_t bin2Int( const uint8_t array[]);
И это плохая идея использовать магическое число 3
. Вы должны добавить еще один параметр, который будет указывать количество элементов в переданном массиве, например
uint32_t bin2Int( const uint8_t array[], size_t n );
И используйте переменную n
вместо магического числа 3
.
В принципе, эта функция ужасна.
Поскольку вы используете STMCubeIDE, я предполагаю, что это для STM32 uC.
MSB находится в индексе 0:
uint32_t bin24ToInt(const uint8_t *array)
{
return ((uint32_t)array[0] << 16) | ((uint32_t)array[1] << 8) | array[2];
}
Если биты расположены в порядке, противоположном обычному: (используя встроенные функции ARM CMSIS.
uint32_t bin24ToIntReverseBitOrder(const uint8_t *array)
{
return (__RBIT(array[0]) >> 8) | (__RBIT(array[1]) >> 16) | (__RBIT(array[2]) >> 24);
}
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
array[s]
является целым числом, почему вы пытаетесь разыменовать его с помощью*array[s]
?uint32_t bin2Int(uint8_t array[]) { uint32_t ret = 0; for (int s = 0; s < 3; ++s) { ret <<= 8; ret |= array[s]; } return ret; }