а тут какая ошибка ? не уж то надо писать “= 6000000” ?
Между тем, достаточно поменять порядок операторов, чтобы значение вычислялось не сложением, а вычитанием - чтобы ошибка исчезла и выражение стало работать правильно и до переполнения, и после, и даже во время. Поэтому ваша запись - это ошибка, так не делают.
А вы попробуйте вывести значение переменной next_millis_10_min в Монитор - обещаю вам, вы удивитесь (уточнение - результат зависит от контроллера. На Уно/Нано/Мега там будет совсем не то, что вы ожидаете)
Serial.println("next_millis_10_min="+ String(next_millis_10_min));
Serial.println(next_millis_10_min);
22:08:38.180 -> next_millis_10_min=600000
22:08:38.180 -> 600000
шесот тыщь
и напрямую и через стринг
не понимаю чему удивляться. Можешь написать почему вы считаете это ошибкой?
а увидел про уню, моя уня улетела в мусор на второй день моего знакомства с ардуиной, 8266 через месяц, щас только esp32
спасибо за советы
какой контроллер?
esp32
потому что выражение
будет вычисляться в типе int, а далеко не в каждом контроллере “шессот тыщ” помещается в этот тип
Чтобы выражение вычислялось правильно всегда, надо писать так:
uint32_t next_millis_10_min = 60*10*1000ul;
и это стоит делать, даже если вы работаете на ЕСП32.
Влад, твои ставки? Как отреагирует? Спасибо скажет или спорить начнет? Я за второе
Если вы про меня. то спасибо уже было в 65 сообщении ![]()
и ещё разок, спасибо
В чем проблема?
Массив адресов функций, индексирующийся по [Print-1].
Ну да, как-то так(просто для разминки))
Спойлер
void timer_1(void);
void timer_2(void);
void timer_3(void);
uint8_t Print = 0;
void (* func[])(void) = { timer_1, timer_2, timer_3};
void timer_1(void)
{
//что-то делаем
Serial.println("Print_1");
}
void timer_2(void)
{
//что-то делаем
Serial.println( "Print_2");
}
void timer_3(void)
{
//что-то делаем
Serial.println( "Print_3");
}
void setup() {
Serial.begin(9600);
}
void loop() {
static uint32_t last_millis = 0;
if (millis() - last_millis >= 5000 )
{
last_millis = millis();
func[Print++]();
if (Print > 2)
Print = 0;
}
}
В неуниверсальности. Представь, что функции будут иметь разный набор аргументов, а некоторые что-то должны возвращать ![]()
Да, сценарный или потоковый счётчик полезен при переходе с delay на millis. Ещё удобен (при увеличении с одного) при объединении разных скетчей на делеях.
Я два десятка лет чужой код на работе читаю, ищу ошибки, исправляю, дописываю. За что руки отрывать несколькими местами чую.
Я знаю, что должен по задумке делать вош код, поэтому догадался без вчитывания. Но глаз очень спотыкался. Технические моменты не затрагиваю.
Но это абсурд.
Приведи пример где бы в конструкции case требовалось вызывать функции с различным количеством аргументов, да при этом чтобы еще часть из них возвращала значение.
А чё так можно было? А в ардуино это тоже сработает? А можно вас иногда спрашивать как написать код, когда я в захожу в тупик?
ну там же полный код выложен, скопируйте да попробуйте
Ссылки на функции тоже можно организовать в массив, как обычные переменные…
//массив функций
typedef void (* TFunction)(void);
TFunction massiv_fun[]={zadanie_1,zadanie_2,zadanie_3};
//
Во!, нашёл, ЕвгенийП подсказал, тока название поправил как помнится, а то или fac или kaka в именах ![]()
Выше уже ответили.
А можно вас иногда спрашивать как написать код, когда я в захожу в тупик?
Спросить то можете, но я тут, наверно, самый слабый по уровню знаний (из постоянных участников), т.к. просто любитель. Спрашивайте - если не я , то кто-нибудь ответит. Но лучше книжки(можно сайты) читайте ИМХО.
А в личке общаться нет времени, извините.
Приведи пример где бы в конструкции case требовалось вызывать функции с различным количеством аргументов, да при этом чтобы еще часть из них возвращала значение
bool bCliped = false;
switch (iPrimitiveType)
{
case ptPoint: DrawPoint(x, y); break;
case ptCircle: bClipped = DrawCircle(x, y, r); break;
case ptRect: bClipped = DrawRect(x, y, w, h); break;
case ptText: bClipped = DrawText(x, y, sText, iTextHeight); break;
default: bClipped = false;
}
return bClipped;
