• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Как упростить скетч

Demonstrius

New member
Как упростить скетч, чтобы не плодить 50 одинаковых функций? Чтобы в зависимости от значения переменной count к переменным var и song прибавлялся порядковый номер. То есть если count = 1, то var1 и song1. Если count = 2, то var2 и song2 и т.д. Заранее спасибо.

if ((count == 1) && (var1 == 1))
{
play_rtttl(song1);
var1 = 0;
}
if ((count == 2) && (var2 == 1))
{
play_rtttl(song2);
var2 = 0;
}
if ((count == 3) && (var3 == 1))
{
play_rtttl(song3);
var3 = 0;
}
if ((count == 4) && (var4 == 1))
{
play_rtttl(song4);
var4 = 0;
}
if ((count == 5) && (var5 == 1))
{
play_rtttl(song5);
var5 = 0;
}
 

Юрий Ботов

Moderator
Команда форума
Может массивы указателей? Что то в таком духе:
(тип) var0,...var5;
(тип) song0,...song5;
(тип**) varx = [&var0,&var1,&var2,&var3,&var4,&var5];
(тип**) songx = [&song0,&song1,&song2,&song3,&song4,&song5];

count = ...

if( *varx[count] == 1) { playrtttl(*songx[count]); *varx[count] = 0; }

В зависимости от типов переменных синтаксис может немного поменяться...
 

Demonstrius

New member
Может массивы указателей? Что то в таком духе:
(тип) var0,...var5;
(тип) song0,...song5;
(тип**) varx = [&var0,&var1,&var2,&var3,&var4,&var5];
(тип**) songx = [&song0,&song1,&song2,&song3,&song4,&song5];

count = ...

if( *varx[count] == 1) { playrtttl(*songx[count]); *varx[count] = 0; }

В зависимости от типов переменных синтаксис может немного поменяться...
Спасибо вам за помощь.
 

Demonstrius

New member
" ... вы про существование массивов слышали?",

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

Сергей_Ф

Moderator
Команда форума
@Demonstrius т.е. про массивы вы не слышали? Что мешает погуглить или пояндексить? Вам вообще не нужно ничего, возможно, из того что вы спрашиваете. Если вам помог @Юрий Ботов, то хорошо. Но по моему это совсем не оптимальный путь. А помочь можно только зная что нужно.
Функции на то и существуют, что бы им передать параметры и получить результат. Зачем их плодить, если у вас она одна?
 

CodeNameHawk

Moderator
Команда форума
Примерно так
Код:
if ((count == 1) && (var[count] == 1))
{
play_rtttl(count);
var[count] = 0;
}
 

CodeNameHawk

Moderator
Команда форума
Возможно и такой код, если условия, как в шапке
Код:
igrat_trek_nomer(void)
{
   if (var[count] == 1)
  {
     play_rtttl(count);
     var[count] = 0;
  }
}
 

Сергей_Ф

Moderator
Команда форума
Проблема не решена, но все равно всем огромное спасибо за помощь.
Трудно помочь, когда непонятно что вы хотите сделать и каков ваш уровень подготовки. На вопросы вы не отвечаете, так что уточнить ничего нельзя. Что вы хотите в результате получить - тоже непонятно.
Вам предложили уже три варианта, но... Что вам не подошло?
 

Сергей_Ф

Moderator
Команда форума
Код:
int igrat_trek_nomer(uint8_t c)
{
     play_rtttl(song[c]);
     return 0;
}
вызывать
count = igrat_trek_nomer(count);
по индексу 0 хранить пустой трэк. Чем не вариант?
не нужна переменная var и всё работает также.
 

Demonstrius

New member
Трудно помочь, когда непонятно что вы хотите сделать и каков ваш уровень подготовки. На вопросы вы не отвечаете, так что уточнить ничего нельзя. Что вы хотите в результате получить - тоже непонятно.
Вам предложили уже три варианта, но... Что вам не подошло?
Что я хочу сделать - я объяснил в самом начале.
Уровень моей подготовки я бы оценил начальный , хотя своими силами и с помощью добрых людей осилил написание скетчей для матричных wi-fi часов с датчиками и охранной сигнализацией и передачей этих данных на сервер, а также термоконтроль с сервоприводом для котла и автоматическое управление жалюзи. Но все равно уровень я оцениваю как начальный.
В предложенных вариантах в скетче возникает ошибка:
var[count] = 0; --> invalid types 'int[int]' for array subscript
Судя по вашим ответам понимаю что отвлекаю вас от других дел, поэтому не хочу никого напрягать.
"Что вы хотите в результате получить" - хотел не прописывать 50 раз почти одинаковый кусок кода и спросил совета можно ли это как-то оптимизировать. Самому это сделать не хватает опыта.
Вроде все.
 

Сергей_Ф

Moderator
Команда форума
"Что вы хотите в результате получить" - хотел не прописывать 50 раз почти одинаковый кусок кода и спросил совета можно ли это как-то оптимизировать.
чтобы оптимизировать - надо понимать что программа должна делать. Из вашего куска кода это не ясно. Там только то как вы себе что то придумали, а для чего это - не понятно. Объясните задачу простыми человеческими словами. К чему там count, куча var и song. Что это и для чего?
 

Demonstrius

New member
чтобы оптимизировать - надо понимать что программа должна делать. Из вашего куска кода это не ясно. Там только то как вы себе что то придумали, а для чего это - не понятно. Объясните задачу простыми человеческими словами. К чему там count, куча var и song. Что это и для чего?
Вам можно сбросить весь скетч в архиве?
 

Сергей_Ф

Moderator
Команда форума
@Demonstrius скетч в архиве кидайте сюда, но от описания того что нужно вам на человеческом языке это не освобождает. В любом случае посмотрите курсы по C++ на предмет массивов и функций. Без базовых знаний у вас вряд ли что то получится склеить из чужих скетчей. Всегда будут ошибки, которые поставят в тупик, хотя их решение элементарно.
Начните хотя бы отсюда
 

Demonstrius

New member
@Demonstrius скетч в архиве кидайте сюда, но от описания того что нужно вам на человеческом языке это не освобождает. В любом случае посмотрите курсы по C++ на предмет массивов и функций. Без базовых знаний у вас вряд ли что то получится склеить из чужих скетчей. Всегда будут ошибки, которые поставят в тупик, хотя их решение элементарно.
Начните хотя бы отсюда
"Без базовых знаний у вас вряд ли что то получится " - поверьте что я это пытаюсь делать, но как вам сказать правильно ... возраст... зараза.
Вот весь скетч:
 

Вложения

Сергей_Ф

Moderator
Команда форума
@Demonstrius глянул мельком, назначение var# не понял. Но дырку во флэш вы протрете очень скоро, судя по коду.
Вечером посмотрю подробнее если время будет.
 
Сверху Снизу