Подскажите как передовать объекты в функции

Николай Ск

✩✩✩✩✩✩✩
28 Мар 2023
11
2
При работе microLED.h с несколькими лентами на разных пинах у мня появились вопросы.

Основной хотелось бы создать массив (с указателями/ссылками на объекты) к которому я мог-бы обращаться типа stripz[ i ].show(); а i использовать как переменную подскажите как это сделать.

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

А третий если какой-нибудь инструмент компиляции типа цикла, чтобы компилятор сам писал типовые строчки

C++:
/*мне бы хотелось создать массив (с указателями/ссылками на объекты) к которому я мог-бы обращаться типа  (stripz[i].strip).show(); а i использовать как переменную*/
struct strop{
  int8_t STRIP_PIN;    //можно указыать пин как А1 так и 15
  int NUMLEDS;
  //тип? strip          //имя ленты
};
#define col_strip 2
constexpr strop  stripz[col_strip] = {  //constexpr - при компиляции само подсказало я так понмаю что это масив констант."спецификатор типа, который обозначает константные выражения, которые могут быть вычислены во время компиляции кода."
  {A1,  51/*,   strip0*/ },
  {A2,  51/*,   strip1*/ }
};
#define COLOR_DEBTH 3
#include <microLED.h>   // подключаем библу
microLED<stripz[0].NUMLEDS, stripz[0].STRIP_PIN, MLED_NO_CLOCK, LED_WS2815, ORDER_RGB, CLI_AVER> strip0;     //можно ли заменить strip0 на stripz[0].strip?
microLED<stripz[1].NUMLEDS, stripz[1].STRIP_PIN, MLED_NO_CLOCK, LED_WS2815, ORDER_RGB, CLI_AVER> strip1;     //можно ли заменить strip1 на stripz[1].strip?
/*я так понимаю нельзя или нет смысла это только бессмысленая трата памяти но интерсно можно ли?

Я так понимаю, что сам интересующий меня массив (с указателями/ссылками на объекты) придётся создавать после подключения объектов подскажите как?

Еще меня интересует если какой-нибудь инструмент компиляции типа цикла чтобы компилятор сам писал типовые строчки что-то типа такого:
#for (int i = 0; i < col_strip; i++) {
  microLED<stripz[i].NUMLEDS, stripz[i].STRIP_PIN, MLED_NO_CLOCK, LED_WS2815, ORDER_RGB, CLI_AVER> stripz[i].strip;
}
#end_for

*/

#define PHOTO_PIN A0     // пин потенциометра это для наглядности работет ли
uint32_t rez;

void setup() {
  strip0.setBrightness(150);
  strip1.setBrightness(100);
  //stripz[0].NUMLEDS = 25;       // масив нельзя менять "in read-only object"
}

void loop() {
  rez = (analogRead(PHOTO_PIN))>>2;
  strip0.fill(mHSV(rez, 255, 255));
  strip0.show();
  //show(strip0);                  ////подскажите как правильно сделать передачу объекта в функцию
  delay (20);
}
/*//подскажите как правильно сделать передачу объекта в функцию. В интерне я чет туплю, вроде все описано, а у меня чет не получается.
void show(microLED& object){
  object.show();
}
*/
 

asaitov

✩✩✩✩✩✩✩
16 Янв 2024
22
8
microLED<...> - это шаблон класса, а это значит, что для каждого набора параметров, который встречается в программе, компилятор создает отдельный класс. Условно говоря, для microLED<1,2,3,4,5,6> создается class microLED_1_2_3_4_5_6, а для microLED<11,12,13,14,15,16> - class microLED_11_12_13_14_15_16. У этих классов одинаковые названия полей и функций, но между собой они никак не связаны и потенциально могут занимать разный объем памяти. Массивы же в C++ хранят элементы одинакового типа и одинакового размера, поэтому поместить в один массив объекты классов с разными параметрами нельзя.

Так как microLED - это только шаблон класса, то указывать его в качестве параметра функции нельзя
C++:
void show(microLED& object);// так нельзя
void show(microLED<51, A1, MLED_NO_CLOCK, LED_WS2815, ORDER_RGB, CLI_AVER>& object); // так можно
Про типовые строчки не понял, но, возможно, имеются в виду макросы.

Вообще, библиотека microLED не предназначена для работы с набором светодиодных лент как с массивом. Для этих целей лучше написать свою версию, в которой параметры буду указываться не в шаблоне класса, а в конструкторе класса. Тогда класс для разных типов лент будет один.
 
  • Лойс +1
Реакции: Николай Ск

Bruzzer

★★★✩✩✩✩
23 Май 2020
590
176
Старые microled (версии 2.xx) работали без шаблонов. Можно использовать их.

Интересно, сколько макс. у вас может быть лент? Может массивы не сильно сократят код, и усилия не стоят того.
 
  • Лойс +1
Реакции: Николай Ск

Николай Ск

✩✩✩✩✩✩✩
28 Мар 2023
11
2
Оформи код соответствующим тэгом, см. Правила
Спасибо за ответы.
Понял.


Типовые сточки я имею в виду типа как эти:
C++:
microLED<stripz[0].NUMLEDS, stripz[0].STRIP_PIN, MLED_NO_CLOCK, LED_WS2815, ORDER_RGB, CLI_AVER> strip0;
microLED<stripz[1].NUMLEDS, stripz[1].STRIP_PIN, MLED_NO_CLOCK, LED_WS2815, ORDER_RGB, CLI_AVER> strip1;
заменить каким небудь цыклом который на этапе компеляции сам напишет строчки типа:
for (int i = 0; i < 2; i++) {
  microLED<stripz[I].NUMLEDS, stripz[I].STRIP_PIN, MLED_NO_CLOCK, LED_WS2815, ORDER_RGB, CLI_AVER> strip[I];
}
[/I][/I][/I]

я понимаю это отсебятина, но вдруг есть.

где бы я хотел применять этот инструмент, к примеру при написании скетча без циклов, я сталкиваюсь с тем, что пишу вот такую крабызяку 19 раз
(причем при изменениях количества нужно дописывать или удалять строчку вручную)
C++:
 if(Step_rab[0].fl_col == 1&&Step_rab[0].fl_zap == nubf1) func4(0,nubf1);
  if(Step_rab[1].fl_col == 1&&Step_rab[1].fl_zap == nubf1) func4(1,nubf1);
  if(Step_rab[2].fl_col == 1&&Step_rab[2].fl_zap == nubf1) func4(2,nubf1);
  if(Step_rab[3].fl_col == 1&&Step_rab[3].fl_zap == nubf1) func4(3,nubf1);
  if(Step_rab[4].fl_col == 1&&Step_rab[4].fl_zap == nubf1) func4(4,nubf1);
  if(Step_rab[5].fl_col == 1&&Step_rab[5].fl_zap == nubf1) func4(5,nubf1);
  if(Step_rab[6].fl_col == 1&&Step_rab[6].fl_zap == nubf1) func4(6,nubf1);
  if(Step_rab[7].fl_col == 1&&Step_rab[7].fl_zap == nubf1) func4(7,nubf1);
  if(Step_rab[8].fl_col == 1&&Step_rab[8].fl_zap == nubf1) func4(8,nubf1);
  if(Step_rab[9].fl_col == 1&&Step_rab[9].fl_zap == nubf1) func4(9,nubf1);
  if(Step_rab[10].fl_col == 1&&Step_rab[10].fl_zap == nubf1) func4(10,nubf1);
  if(Step_rab[11].fl_col == 1&&Step_rab[11].fl_zap == nubf1) func4(11,nubf1);
  if(Step_rab[12].fl_col == 1&&Step_rab[12].fl_zap == nubf1) func4(12,nubf1);
  if(Step_rab[13].fl_col == 1&&Step_rab[13].fl_zap == nubf1) func4(13,nubf1);
  if(Step_rab[14].fl_col == 1&&Step_rab[14].fl_zap == nubf1) func4(14,nubf1);
  if(Step_rab[15].fl_col == 1&&Step_rab[15].fl_zap == nubf1) func4(15,nubf1);
  if(Step_rab[16].fl_col == 1&&Step_rab[16].fl_zap == nubf1) func4(16,nubf1);
  if(Step_rab[17].fl_col == 1&&Step_rab[17].fl_zap == nubf1) func4(17,nubf1);
  if(Step_rab[18].fl_col == 1&&Step_rab[18].fl_zap == nubf1) func4(18,nubf1);
(это проверка двух условий и вход в функцию для 19 отдельных типовых задач)

Мне бы хотелось написать шапку для компилятора типа:
C++:
for (int i = 0; i <19; i++) {
if(Step_rab [ i ] .fl_col == 1&&Step_rab [ i ]  .fl_zap == nubf1) func4( i ,nubf1);
}[I][I][I]
[/I][/I][/I]
А он сам бы при компиляции написал эти сточки указанное количество раз
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
590
176
к примеру при написании скетча без циклов ....
Не понятно, зачем намеренно писать скетч без циклов.

По теме. Я слабо разбираюсь с макросах и препроцессорах, несколько раз пробовал понять, можно ли реализовать похожие задумки. Для себя понял, что в принципе можно, но надо написать много малопонятного кода, и проще или красивее в результате не станет. (Примеры и обсуждения в инете есть).
 

Kir

★✩✩✩✩✩✩
28 Мар 2020
71
17
@Николай Ск, unroll loop - это одна из оптимизаций компилятора. Разворачиваются как правило короткие циклы. 19 итерации компилятор скорее всего не развернёт. В целом если удобнее написать цикл, делайте цикл. Подобные ручные оптимизации производительности сильно не добавяет, а может даже и ухудшает.
 
  • Лойс +1
Реакции: Николай Ск

Николай Ск

✩✩✩✩✩✩✩
28 Мар 2023
11
2
@Kir, спасибо за ответ я задал в поисковике unroll loop единственное что понял, что это пока не моего уровня знания.

Ответ на свой вопрос я нашёл в библиотеке FOR_MACRO
Создал на форуме другую тему поскольку по этой библиотеке тоже есть вопросы.

А в данной теме все мои вопросы в принципе исчерпаны всем спасибо.