Появляется отрицательное значение

a-login
Offline
Зарегистрирован: 01.02.2022

Есть следующий код

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

Собствено не понимаю откуда, может браться отрицательное значение и как это исправить

a-login
Offline
Зарегистрирован: 01.02.2022

Причина та же, что и в предыдущей теме,- типы данных. Сменил int next на long next и всё заработало. В оправдание скажу, что не ожидал, что int на столько мал...

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Собственно, next у тебя это знаковая 16битная переменная которая может принимать значения -32767...32767.
Ну и соответственно после 32767 будет переполнение со всеми вытекающими

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

a-login пишет:

не ожидал, что int на столько мал...

Надо будет выпить за большие int'ы!

Green
Offline
Зарегистрирован: 01.10.2015

А ведь странно, что у 8-битных МК int ну Очень маленький... А у ПК большой. Прям, зверь! Ну, Очень странно...

Kakmyc
Offline
Зарегистрирован: 15.01.2018

int'ы они все такие разные...
Кому то нравиться int16_t, кому то. int32_t, а кто то настолько жаден, что ему int64_t не хватает.

Меня вот в большинстве случаев int16_t устраивает, готов даже порой довольствоваться int8_t.
А вот ТС "маловато будет".
Ничего , сходит за ёлочкой в третий раз, глядишь, разберётся.

Но в любом случае про типы данных вообще и среде Ардуино в частности почитать стоит.
Ну вот не срослось у разработчиков с количеством памяти. А так бы все переменные сделали одного типа , да побольше, чтоб всем хватило . И не было бы такой проблемы

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А uint16_t как? Тоже минус покажет? Пробовал?))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

BOOM пишет:

А uint16_t как? Тоже минус покажет? Пробовал?))

А с каких пор беззнаковые переменные стали минус показывать ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Kakmyc пишет:
Собственно, next у тебя это знаковая 16битная переменная которая может принимать значения -32767...32767. Ну и соответственно после 32767 будет переполнение со всеми вытекающими

-32768...32767

Мелочь, но все-таки...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Kakmyc пишет:
BOOM пишет:

А uint16_t как? Тоже минус покажет? Пробовал?))

А с каких пор беззнаковые переменные стали минус показывать ?

Вопрос к ТС, чего подкалываешь?) (я хотел!) ))

Мошт у него значения до 65535? Тогда нафиг int32_t не нужен....