Функция для битового массива

AKOTb
Offline
Зарегистрирован: 24.01.2017

Всем доброго времени суток, обнаружил в своем коде большое количество повторяющихся обращений к битовому массиву,

            digitalWrite(DAT, bitRead(SO[fn], j) != 0 ? HIGH : LOW);
            digitalWrite(CLK, HIGH);
            digitalWrite(CLK, LOW);
            digitalWrite(DAT, bitRead(SO[fn], j) != 0 ? HIGH : LOW);
            digitalWrite(CLK, HIGH);
            digitalWrite(CLK, LOW);
          

решил вывести эти повторяющиеся участки в отдельную функцию, казалось бы все просто, указываю тип данных переменной как битовый массив Symb.

void prin (unsigned byte Symb[]) {
            digitalWrite(DAT, bitRead(Symb[fn], j) != 0 ? HIGH : LOW);
            digitalWrite(CLK, HIGH);
            digitalWrite(CLK, LOW);
            digitalWrite(DAT, bitRead(Symb[fn], j) != 0 ? HIGH : LOW);
            digitalWrite(CLK, HIGH);
            digitalWrite(CLK, LOW);
}

Но компилятор ругается на такую формулировку задачи. Возможно ли вообще подкидывать битовые массивы в функцию таким образом?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А где у Вас битовый массив? byte - это вообще-то байт, а не бит.

AKOTb
Offline
Зарегистрирован: 24.01.2017

Опечатка. Массив действительно байтовый.

b707
Offline
Зарегистрирован: 26.05.2017

AKOTb пишет:

void prin (unsigned byte Symb[]) {

Но компилятор ругается на такую формулировку задачи. Возможно ли вообще подкидывать битовые массивы в функцию таким образом?

В функцию нельзя передавать массив неопределенного размера - это когда в квадратных скобках ничего нет. Либо укахите размер, либо, что общепринято - передавайте массив по ссылке.

fogary
Offline
Зарегистрирован: 05.03.2016

AKOTb пишет:

            bitRead(SO[fn], j) != 0 ? HIGH : LOW)

Я сильно извеняюсь, а для чего такие навороты? Не в смысле, что значит эта запись, а из каких соображений Вы ее применяете.

AKOTb
Offline
Зарегистрирован: 24.01.2017

fogary пишет:
<а для чего такие навороты? Не в смысле, что значит эта запись, а из каких соображений Вы ее применяете.


Я дергаю ногой термопринтера определяя какие из точек термоголовки будут горячими а какие холодными. Принцип как у сдвигового регистра.
Мне вот не ясно как передать массив по ссылке?

1
void prin (unsigned byte *Symb[]) {

Так?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

fogary пишет:

соображений Вы ее применяете.

https://docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/operat...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AKOTb пишет:
fogary пишет:
<а для чего такие навороты? Не в смысле, что значит эта запись, а из каких соображений Вы ее применяете.

 

Я дергаю ногой термопринтера определяя какие из точек термоголовки будут горячими а какие холодными. Принцип как у сдвигового регистра. Мне вот не ясно как передать массив по ссылке? 1 void prin (unsigned byte *Symb[]) { Так?

Не так.

Просто имя массива является указателем на его начало.

Почитайте Кернигана и Ритчи. Пока не сделаете этого, будете за каждой ерундой на форум бегать.

fogary
Offline
Зарегистрирован: 05.03.2016

brokly пишет:

Я разве спрашивал как это работает?

Очевидно же, что функция bitRead() возвращает либо 0, либо 1. Зачем было вводить дополнительную проверку?

AKOTb
Offline
Зарегистрирован: 24.01.2017

b707 пишет:

В функцию нельзя передавать массив неопределенного размера - это когда в квадратных скобках ничего нет. Либо укахите размер, либо, что общепринято - передавайте массив по ссылке.

 

ЕвгенийП пишет:

Не так.

Просто имя массива является указателем на его начало.

Почитайте Кернигана и Ритчи. Пока не сделаете этого, будете за каждой ерундой на форум бегать.

 

Я кажется понял где тут неясность. Сейчас постараюсь пояснить. Дело в том, что у меня несколько Байтовых массивов, а массива Symb, используемого в процедуре как такового не существует. Я хочу обращаясь к процедуре подкидывать на место Symb один из моих массивов. Если я обращусь напрямую к любому из них в процедуре, то их нельзя будет поменять при вызове проуедуры. 

Мой вопрос изначально был: возможно ли так оформить процедуру, чтобы я мог обращаясь к ней выбирать нужный байтовый массив из нескольких?

Т.е. имеется функция Prin

void prin (unsigned byte Symb[]) {
            digitalWrite(DAT, bitRead(Symb[fn], j) != 0 ? HIGH : LOW);
            digitalWrite(CLK, HIGH);
            digitalWrite(CLK, LOW);
            digitalWrite(DAT, bitRead(Symb[fn], j) != 0 ? HIGH : LOW);
            digitalWrite(CLK, HIGH);
            digitalWrite(CLK, LOW);
}

она не работает, но пока что это опустим. При обращении к этой функции я ввожу

prin (BM1);
prin(BM2);
prin(BM3);

Таким образом три байтовых массива BM1[], BM2[], BM3[] мне хотелось бы подсунуть на место Symb в процедуру.

Возможно ли это? 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Упрямо не хотим изучать языки Си и Си++

/**/
//--------------------
void viev(int *masiv) {
  Serial.print(masiv[0]);
  Serial.print("  ");
  Serial.print(masiv[1]);
  Serial.print("  ");
  Serial.print(masiv[2]);
  Serial.println();
}
//------Компановка--------------
int masiv1[3] = {1, 2, 3};
int masiv2[3] = {4, 5, 6};
int masiv3[3] = {7, 8, 9};
//---------main-----------
void setup() {
  Serial.begin(9600);
  viev(masiv1);
  viev(masiv2);
  viev(masiv3);
}

void loop() {

}
/*Скетч использует 1846 байт (5%) памяти устройства. Всего доступно 32256 байт.
  Глобальные переменные используют 206 байт (10%) динамической памяти, оставляя 1842 байт для локальных переменных. Максимум: 2048 байт.
*/

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AKOTb пишет:

Мой вопрос изначально был: возможно ли так оформить процедуру, чтобы я мог обращаясь к ней выбирать нужный байтовый массив из нескольких?

Возможно ли это? 

Мой ответ изначально был:

ЕвгенийП пишет:

Почитайте Кернигана и Ритчи. Пока не сделаете этого, будете за каждой ерундой на форум бегать.

 

AKOTb
Offline
Зарегистрирован: 24.01.2017

Огромное спасибо всем. Я ставил этот ансигнед и ничего не получалось. Книжку обязательно изучу. Сейчас все заработало отлично!