Использование массивов, двоичных данных и битового чтения

Это мой первый код, набранный вручную. Я уверен, что в нем могут быть некоторые вопиющие «ошибки школьника», поэтому задавался вопросом, могут ли люди дать ему «один раз». В частности, я никогда не использовал массивы C++, сохраняя двоичные данные внутри, а затем пытаясь прочитать их немного по крупицам. В perl намного проще; вы бы просто использовали многомерное что-то вроде этого:

@code1=('10101010', '01010101');
$bit=$code1[0][0] (..through to..) code1[0][7]
$bit=$code1[1][0] ... code1[1][7]

Итак, это мой код Arduino. Приветствуем предложения.

int pinArray[]={2,3,4,5,6,7,8,9};
int code1[]={B10101010, B01010101,B10101010, B01010101,B10101010, B01010101};
int count=0;
int split=0;    // Счетчик для битового цикла
int led;    // Сохраняем битовые данные
byte x;     // Используется для хранения двоичных данных в code1

void setup(){
    for (count=0; count<8; count++){
    pinMode(pinArray[count],OUTPUT); // Устанавливает pinMode в качестве вывода на выводах pinArray
    ]
}

void loop(){
    for (count=0; count<6; count++){
    x=code1[count];
    ledDisplay(x);
    }
}

void ledDisplay(){
    for (split=7; split>=0; split--){
    led=bitRead(x,split);
        if (led == 1){
        digitalWrite(split+2,HIGH);
        }
        else{
        digitalWrite(split+2,LOW);
        }
    }
}

Только что изменил разделение, так как понял, что бит 7 является самой левой цифрой. В разделении я добавляю 2 к значению. Нужно ли заключать это в квадратные скобки, т.е. (split+2)?

, 👍1

Обсуждение

Ваши отступы сбивают с толку. Нажмите Ctrl+Т, @Jot

Когда я пишу свой код в текстовом редакторе, я использую клавишу табуляции для отступа кода, чтобы открывающие/закрывающие скобки «для» и т. д. находились в одном столбце (который, кажется, правильно отображается в моем настольном браузере — возможно, возможно, неправильно на телефон - поэтому в будущем при публикации буду использовать CRTL+t (я знаю, что CODE1 не следует тому же соглашению, но затем я стараюсь держать открытым/закрытым на той же строке, чтобы он не «натыкался» на следующий массив, имея в виду, что у меня будет 14 таких массивов) Это не должно быть «неприятным» для вас, поскольку я ценю, что вы нашли время, чтобы быть полезным, просто демонстрируя мое личное «соглашение об именах», @Cristofayre

Ctrl-T — это просто быстрый способ получить код с правильным отступом в любом стиле IDE по умолчанию. Вы не должны использовать его, хотя. Вы можете использовать любой [стиль отступа](https://en.wikipedia.org/wiki/Indentation_style), который вам нравится, если вы обрабатываете его вручную. Кроме того, вы можете [настроить IDE для своего любимого стиля](https://github.com/arduino/Arduino/wiki/Arduino-IDE-Auto-Format-configuration). Просто убедитесь, что вы выбрали один стиль отступа и применяете его последовательно., @Edgar Bonet


1 ответ


2

Я могу заметить только две ошибки в вашей программе:

  1. Блок кода должен быть заключен в фигурные скобки:

    for (count=0; count<8; count++){
        pinMode(pinArray[count],OUTPUT);
    }  // ← '}' вместо ']'
    
  2. Если функция ожидает передачи аргументов, они должны быть объявлены как параметры в прототипе функции:

    void ledDisplay(byte x){  // ← обратите внимание на «byte x»
        // ...
    }
    

Кроме этого, вот несколько советов по улучшению внешнего вида кода, и надеюсь, более удобным в обслуживании:

  • последовательный отступ
  • используйте const для уточнения констант
  • используйте именованные константы вместо магических чисел
  • по возможности сохраняйте переменные локальными
  • обратите внимание, что int, равный 0 или 1, эквивалентен логическому типу
  • используйте pinArray[] для доступа к контактам

Применяя эти предложения, я получаю следующее:

const int PIN_COUNT = 8;
const int pinArray[PIN_COUNT] = { 2, 3, 4, 5, 6, 7, 8, 9 };
const int CODE_COUNT = 6;
const int code1[CODE_COUNT] = {
    B10101010, B01010101, B10101010, B01010101, B10101010, B01010101
};

void setup() {
    for (int count = 0; count < PIN_COUNT; count++) {
        pinMode(pinArray[count], OUTPUT);
    }
}

void loop() {
    for (int count = 0; count < CODE_COUNT; count++) {
        ledDisplay(code1[count]);
    }
}

void ledDisplay(byte x) {
    for (int split = 7; split >= 0; split--) {
        if (bitRead(x, split)) {
            digitalWrite(pinArray[split], HIGH);
        } else {
            digitalWrite(pinArray[split], LOW);
        }
    }
}
,

На этот раз я искренне хотел бы иметь возможность проголосовать за ответ. Вы дали мне очень конструктивный совет, а не просто указку здесь и там. («]» была просто опечаткой, но спасибо, что указали на это) Мне также нравится логический комментарий, который сэкономит несколько дополнительных байтов. Теперь я буду исследовать "const", чтобы увидеть, что именно он делает... Опять же, я, честно говоря, очень благодарен за ваши подробные отзывы., @Cristofayre