Появляется отрицательное значение
- Войдите на сайт для отправки комментариев
Пт, 11/03/2022 - 15:30
Есть следующий код
const int rmin = 500; const int rmax = 4000; class vi { public: int pin; bool onof; vi(int gpin, bool gonof){ pin=gpin; onof=gonof; }; int next; void go(){ pinMode(pin, OUTPUT); //next = abs(millis()+random(rmin, rmax)); if (onof){ onof=false; digitalWrite(pin,LOW); }else{ onof=true; digitalWrite(pin,HIGH); } } private: }; //define ports vi led(LED_BUILTIN,false); void setup() { // put your setup code here, to run once: Serial.begin(9600); } int ar; void loop() { // put your main code here, to run repeatedly: if (abs(led.next)<millis()){ led.go(); ar=random(rmin, rmax); Serial.print("r "); Serial.println(ar); led.next=abs(millis()+ar); Serial.print("led "); Serial.println(led.next); if (led.next<0){ Serial.println("меньше"); Serial.println(abs(led.next)); led.next=millis(); } } Serial.println(millis()); delay(500); }
Который работает как задумывалось, но в течении тридцати секунд, затем led.next становится отрицательным. Вот вывод сериала:
14:27:05.531 -> 26018 14:27:06.051 -> r 2992 14:27:06.051 -> led 29511 14:27:06.051 -> 26519 14:27:06.531 -> 27020 14:27:07.051 -> 27520 14:27:07.531 -> 28020 14:27:08.051 -> 28520 14:27:08.531 -> 29021 14:27:09.051 -> r 1542 14:27:09.051 -> led 31063 14:27:09.051 -> 29521 14:27:09.531 -> 30022 14:27:10.051 -> 30522 14:27:10.531 -> 31023 14:27:11.051 -> r 1487 14:27:11.051 -> led -32526 14:27:11.051 -> меньше 14:27:11.091 -> 32526 14:27:11.091 -> 31523 14:27:11.531 -> r 2003 14:27:11.531 -> led -31509 14:27:11.531 -> меньше 14:27:11.571 -> 31509
Собствено не понимаю откуда, может браться отрицательное значение и как это исправить
Причина та же, что и в предыдущей теме,- типы данных. Сменил int next на long next и всё заработало. В оправдание скажу, что не ожидал, что int на столько мал...
Собственно, next у тебя это знаковая 16битная переменная которая может принимать значения -32767...32767.
Ну и соответственно после 32767 будет переполнение со всеми вытекающими
не ожидал, что int на столько мал...
Надо будет выпить за большие int'ы!
А ведь странно, что у 8-битных МК int ну Очень маленький... А у ПК большой. Прям, зверь! Ну, Очень странно...
int'ы они все такие разные...
Кому то нравиться int16_t, кому то. int32_t, а кто то настолько жаден, что ему int64_t не хватает.
Меня вот в большинстве случаев int16_t устраивает, готов даже порой довольствоваться int8_t.
А вот ТС "маловато будет".
Ничего , сходит за ёлочкой в третий раз, глядишь, разберётся.
Но в любом случае про типы данных вообще и среде Ардуино в частности почитать стоит.
Ну вот не срослось у разработчиков с количеством памяти. А так бы все переменные сделали одного типа , да побольше, чтоб всем хватило . И не было бы такой проблемы
А uint16_t как? Тоже минус покажет? Пробовал?))
А uint16_t как? Тоже минус покажет? Пробовал?))
А с каких пор беззнаковые переменные стали минус показывать ?
-32768...32767
Мелочь, но все-таки...
А uint16_t как? Тоже минус покажет? Пробовал?))
Вопрос к ТС, чего подкалываешь?) (я хотел!) ))
Мошт у него значения до 65535? Тогда нафиг int32_t не нужен....