Шестнадцатеричный массив не складывается, как ожидалось
У меня есть массив шестнадцатеричных значений, как указано ниже.
byte Hexa_Val[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Я хочу увеличить этот массив с самого конца. Как и в, перейдите от {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} до {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, а затем увеличьте значение рядом с ним до {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} и продолжите. Приращение должно идти так, как показано ниже.
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
.
.
.
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00}
.
.
.
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF}
{0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}
.
.
.
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
Код который я придумал таков
byte Hexa_Val[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void setup() {
Serial.begin(115200);
}
void loop() {
Hexa_Val[7] = Hexa_Val[7] + 1;
if(Hexa_Val[7] = 0xFF){
Hexa_Val[6] = Hexa_Val[6] + 1;
Hexa_Val[7] = 0x00;
}
if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF)){
Hexa_Val[5] = Hexa_Val[5] + 1;
Hexa_Val[7] = 0x00;
Hexa_Val[6] = 0x00;
}
if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF)){
Hexa_Val[4] = Hexa_Val[4] + 1;
Hexa_Val[7] = 0x00;
Hexa_Val[6] = 0x00;
Hexa_Val[5] = 0x00;
}
if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF)){
Hexa_Val[3] = Hexa_Val[3] + 1;
Hexa_Val[7] = 0x00;
Hexa_Val[6] = 0x00;
Hexa_Val[5] = 0x00;
Hexa_Val[4] = 0x00;
}
if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF) && (Hexa_Val[3] = 0xFF)){
Hexa_Val[2] = Hexa_Val[2] + 1;
Hexa_Val[7] = 0x00;
Hexa_Val[6] = 0x00;
Hexa_Val[5] = 0x00;
Hexa_Val[4] = 0x00;
Hexa_Val[3] = 0x00;
}
if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF) && (Hexa_Val[3] = 0xFF) && (Hexa_Val[2] = 0xFF)){
Hexa_Val[1] = Hexa_Val[1] + 1;
Hexa_Val[7] = 0x00;
Hexa_Val[6] = 0x00;
Hexa_Val[5] = 0x00;
Hexa_Val[4] = 0x00;
Hexa_Val[3] = 0x00;
Hexa_Val[2] = 0x00;
}
if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF) && (Hexa_Val[3] = 0xFF) && (Hexa_Val[2] = 0xFF) && (Hexa_Val[1] = 0xFF)){
Hexa_Val[0] = Hexa_Val[0] + 1;
Hexa_Val[7] = 0x00;
Hexa_Val[6] = 0x00;
Hexa_Val[5] = 0x00;
Hexa_Val[4] = 0x00;
Hexa_Val[3] = 0x00;
Hexa_Val[2] = 0x00;
Hexa_Val[1] = 0x00;
}
if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF) && (Hexa_Val[5] = 0xFF) && (Hexa_Val[4] = 0xFF) && (Hexa_Val[3] = 0xFF) && (Hexa_Val[2] = 0xFF) && (Hexa_Val[1] = 0xFF) && (Hexa_Val[0] = 0xFF)){
Hexa_Val[7] = 0x00;
Hexa_Val[6] = 0x00;
Hexa_Val[5] = 0x00;
Hexa_Val[4] = 0x00;
Hexa_Val[3] = 0x00;
Hexa_Val[2] = 0x00;
Hexa_Val[1] = 0x00;
Hexa_Val[0] = 0x00;
}
//to find out what I am sending
for( byte a=0; a<8; a++ ) {
Serial.print(Hexa_Val[a], HEX);
}
Serial.println();
delay(500);
}
Но это просто дает мне нули на последовательном мониторе. Если я просто оставлю первые два оператора IF
byte Hexa_Val[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
void setup() {
Serial.begin(115200);
}
void loop() {
Hexa_Val[7] = Hexa_Val[7] + 1;
if(Hexa_Val[7] = 0xFF){
Hexa_Val[6] = Hexa_Val[6] + 1;
Hexa_Val[7] = 0x00;
}
if((Hexa_Val[7] = 0xFF) && (Hexa_Val[6] = 0xFF)){
Hexa_Val[5] = Hexa_Val[5] + 1;
Hexa_Val[7] = 0x00;
Hexa_Val[6] = 0x00;
}
//to find out what I am sending
for( byte a=0; a<8; a++ ) {
Serial.print(Hexa_Val[a], HEX);
}
Serial.println();
delay(500);
}
Приращение будет начинаться с третьего значения справа. Что-то вроде
00000200
00000300
00000400
00000500
00000600
00000700
Как мне заставить его увеличиться, как я уже упоминал в самом начале? Почему код распознает 0xFF
как ноль?
@C Vith, 👍1
Обсуждение1 ответ
Лучший ответ:
Здесь есть несколько проблем:
если(Hexa_Val[7] = 0xFF)
Прежде всего, =
является оператором присваивания. Вы устанавливаете
Hexa_Val[7]
в 0xFF
. Если вы хотите сравнить для равенства, вы должны
использовать ==
.
Вторая проблема-значение 0xff
никогда не будет отображаться, потому что вы
заменяете его нулем. Затем этот байт будет считать 0xfd, 0xfe, 0x00,
пропуская 0xff. Если вы хотите посчитать 0xff, то условие должно быть
Hexa_Val[7] == 0
, т. е. инкремент Hexa_Val[6]
только после
Hexa_Val[7]
переполнен.
Третья проблема, ваша вторая, если
тест приходит слишком поздно. В этот момент
Hexa_Val[7]
уже сброшен. Вы должны проверить Hexa_Val[6]
переполнение только в рамках предыдущего теста.
Со всем этим исправлено:
Hexa_Val[7] = Hexa_Val[7] + 1;
if (Hexa_Val[7] == 0) {
Hexa_Val[6] = Hexa_Val[6] + 1;
if (Hexa_Val[6] == 0) {
Hexa_Val[5] = Hexa_Val[5] + 1;
}
}
Если вы не хотите писать 8 вложенных условий (что довольно громоздко), вы можете вместо этого выполнить цикл по массиву в обратном направлении, увеличивая каждый элемент по очереди, и выйти из цикла, как только приращение не переполнится:
for (int i = 7; i >= 0; i--) {
if (++Hexa_Val[i] != 0) break;
}
Если вы не возражаете, чтобы массив был обратным, вы также можете обрабатывать весь массив как одно 64-битное число и просто увеличивать его, как вы бы увеличивали любое целое число. Но тогда вам придется распечатать массив в обратном порядке, начиная с элемента mast:
union {
uint64_t number;
byte bytes[8];
} Hexa_Val = { .number = 0 };
void loop() {
// Increment the array.
Hexa_Val.number++;
// Print out.
for (int i = 7; i >= 0; i--) {
if (Hexa_Val.bytes[i] < 0x10) Serial.write('0');
Serial.print(Hexa_Val.bytes[i], HEX);
Serial.write(' ');
}
Serial.println();
delay(500);
}
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Объявление и использование массива структур в Arduino
- Поддерживает ли Arduino C++ динамические массивы объектов ?
- Быстрые случайные логические значения
- Почему структура переменного размера не компилируется в Arduino IDE?
- Получена ошибка недопустимого преобразования из 'const char*' в 'const uint8_t*
- Как масштабировать растровое изображение (массив uint8_t) в Arduino?
- Удалить все элементы из массива
Ваше второе (и следующее) "если" сравнивает "Hexa_val[7]" с 0xFF, но первое уже сбросило его до 0., @the busybee
Боже, мне не терпится написать ассемблерный код, который делает это без ветвления., @Kwasmich