Сокращение кода

IgorU
Offline
Зарегистрирован: 03.12.2014

Коллеги, как корректно подставить значение "data" в функцию вывода комбинации сегментов на семисегментный индикатор. Этот код работает, но хотелось бы одной строкой и значение напрямую без переменной.

uint8_t data[] = {0x54}; 
displayLed.setSegments (data); 

 

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

IgorU пишет:

Коллеги, как корректно подставить значение "data" в функцию вывода комбинации сегментов на семисегментный индикатор. Этот код работает, но хотелось бы одной строкой и значение напрямую без переменной.

uint8_t data[] = {0x54}; 
displayLed.setSegments (data); 

Не знаю, что это за библиотека, но судя по коду, функция setSegment требует указателя (на кой-то хрен). Поэтому совсем уж без переменной не получится. Думаю, будет работать, например, так

const uint8_t data = 0x54; 
displayLed.setSegments (& data); 

 

IgorU
Offline
Зарегистрирован: 03.12.2014

БиблиотекаTM1637Display. Когда прописываешь непосредственно переменную или константу, на дисплее другой символ(другие сегменты) отображаются... Может формат или тип этого значения нужно изменить, чтобы напрямую задавать??? Значений много, хотелось бы уменьшить количество строк кода, если это возможно.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

может так displayLed.setSegments (b0110110);

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

IgorU пишет:

БиблиотекаTM1637Display. 

Ну, если Вы ещё и ссылку дадите, то я посмотрю что там. Пока же я вижу, что В передаёте на само значение, а указатель на него. А если так, то значение должно быть где-то в памяти. Возможно, там есть перегруженные методы, давайте ссылку.

IgorU
Offline
Зарегистрирован: 03.12.2014

https://github.com/avishorp/TM1637.

Наверно значение в двоичном коде библиотека проглотит... (Как предложил Калапуций). В шеснадцатиричном не хочет, зажигает не те сегменты индикатора...

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

IgorU пишет:

Наверно значение в двоичном коде библиотека проглотит

Щасс!

С чего бы она глотала, если там явно требуется массив, а не одиночное значение?

Более того, Вы что имеете в виду под вот такой конструкцией?

uint8_t data[] = {0x54}; 
displayLed.setSegments (data); 

Сколько знаков Вы желаете установить? Если все 4, то где три остальные значения? Если один, то где указание какой именно?

Если оно в таком виде и работает, то это случайность - благодаря тому, что после массива в памяти нули сидят.

Вот же она - Ваша функция

//! Display arbitrary data on the module
  //!
  //! This function receives raw segment values as input and displays them. The segment data
  //! is given as a byte array, each byte corresponding to a single digit. Within each byte,
  //! bit 0 is segment A, bit 1 is segment B etc.
  //! The function may either set the entire display or any desirable part on its own. The first
  //! digit is given by the @ref pos argument with 0 being the leftmost digit. The @ref length
  //! argument is the number of digits to be set. Other digits are not affected.
  //!
  //! @param segments An array of size @ref length containing the raw segment values
  //! @param length The number of digits to be modified
  //! @param pos The position from which to start the modification (0 - leftmost, 3 - rightmost)
  void setSegments(const uint8_t segments[], uint8_t length = 4, uint8_t pos = 0);

Всё понятно. А так как Вы делаете - нельзя.

Другое дело, что это Вы там такое выводите, что Вам эта функция нужна? Если Вам нужно выводить что-то особое, то, конечно, а если просто числа, то там же есть вот такая:

  //! Displayes a decimal number
  //!
  //! Dispalyes the given argument as a decimal number
  //!
  //! @param num The number to be shown
  //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are
  //!        blank
  //! @param length The number of digits to set. The user must ensure that the number to be shown
  //!        fits to the number of digits requested (for example, if two digits are to be displayed,
  //!        the number must be between 0 to 99)
  //! @param pos The position least significant digit (0 - leftmost, 3 - rightmost)
  void showNumberDec(int num, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0);

 

Logik
Offline
Зарегистрирован: 05.08.2014

Угу. Нужен указатель на данные. Без данных его тяжело получить ;)  И есть ощущение, что Вы чегото не того деланте. И зачем код  сокращать он и так компактный?  Ану колитесь! Код сюда, и по быстрому;) Ща научим как его писать.. 

ПС. Клапауций 234, я тож люблю поприкалыватся, но не так же плоско.

IgorU
Offline
Зарегистрирован: 03.12.2014

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

Если оно в таком виде и работает, то это случайность - благодаря тому, что после массива в памяти нули сидят.

  //! @param segments An array of size @ref length containing the raw segment values
  //! @param length The number of digits to be modified
  //! @param pos The position from which to start the modification (0 - leftmost, 3 - rightmost)
  void setSegments(const uint8_t segments[], uint8_t length = 4, uint8_t pos = 0); 

Пожалуй вы правы, похоже я обьявил безразмерный массив и первым в нем шеснацатиричное значение, остальные члены массива нули... Значит короткая запись без дополнительного объявления константы, должна быть такой?

displayLed.setSegments (0х54,1,0)

 

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

IgorU пишет:

Значит короткая запись без дополнительного объявления константы, должна быть такой?

displayLed.setSegments (0х54,1,0)

Нет, конечно. Вы код смотрели?

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

Сколько разрядов Вы хотите менять? Один? Какой именно? Или два? Какие именно? Или три ... Или все четыре сразу? От этого зависит какие у Вас будут параметры.

В любом случае первым идёт указатель!

IgorU
Offline
Зарегистрирован: 03.12.2014

Я уже говорил, нужно изменить в первом разряде символ, зажечь нужные мне сегменты.

Если в функцию передаются непосредственно значения, для чего нужен указатель, ведь мы не объявляем константу, в памяти не резервируется для нее место. Функция должна отработать неважно как к ней передаются данные, непосредственно или через переменную(константу)

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

IgorU пишет:

Функция должна

Кому это она так задолжала? Вам?

Игорь, в программировании всё тупо - по-военному. Если написано "из того же материала", значит "из того же материала", если сказано "люминь", значит "люминь".

Так вот в описании функции написано "указатель", значит "указатель".

И фукнция Вам ничего не должна кроме как отработать ТОЧНО так, как написано, а не как подсказывает Ваша фантазия о её долге.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

IgorU пишет:

в памяти не резервируется для нее место

та, да - значение переменной святой дух контроллеру сообщает

*как это чюдо должно, согласно религиозным догмам называться? - материализация невещественных объектов.

IgorU
Offline
Зарегистрирован: 03.12.2014

ОК, задача начинающих - прислушаться к профи и учиться.

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

Кстати, Вам никто не мешает переписать эту библиотечную функцию (вернее, добавить в класс новую) так, как Вам нравится. Это, слава Богу, несложно.  И тогда, ради Бога передавайте что хотите.

IgorU
Offline
Зарегистрирован: 03.12.2014

С библиотекой наверно рановато, опыта маловато, тут бы разобраться. 

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

IgorU пишет:

С библиотекой наверно рановато, опыта маловато, тут бы разобраться. 

А чего там разбираться? Вам же уже всё объяснили. Вам осталось только не спорить с теми, кто этим десятки лет занимается и принять к сведению, что говорят.

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

Ну допишите свою функцию. Открываете .h файл, ищете там строку

void setSegments(const uint8_t segments[], uint8_t length = 4, uint8_t pos = 0); 

И прямо перед ней дописываете

void setOneSegment(const uint8_t sg, uint8_t pos = 0) {
    setSegments(& sg, 1, pos);
}

И всего делов. Теперь, если Вы напишете по старому - с тремя параметрами, то первым должен быть указатель. А если напишете по-новому - с двумя параметрами, то первым идёт непосредственное значение, а вторым - номер сегмента. Второй параметр можно опускать, тогда он будет 0.

setOneSegment(0x22, 1);

 

IgorU
Offline
Зарегистрирован: 03.12.2014

Вот так на примере наглядно и понятно, какова должна быть последовательность действий. Это то что нужно, Спасибо!

В этом случае в файле *.срр править ничего не нужно?

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

IgorU пишет:

понятно

...

В этом случае в файле *.срр править ничего не нужно?

Что-то эти две фразы между собой не стыкуются :)

Нет, не надо.

 

IgorU
Offline
Зарегистрирован: 03.12.2014

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

то-то эти две фразы между собой не стыкуются :)

       :)   :). ;)

Еще раз спасибо за участие и науку!