Условие не работает с отрицательными значениями. Что делать

maxet
Offline
Зарегистрирован: 30.06.2018

У меня в коде был примерно вот такой элемент (я раскрыл переменные для ясности).

if (-100 < 500) {
 // какой-то код
}

но условие не возвращает истину. Что делать в таком случае?

leks
Offline
Зарегистрирован: 22.10.2017

Ради интереса глянул проект у Гайвера, где он пишет такое ? - int time [0]=millis();

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

maxet пишет:

У меня в коде был примерно вот такой элемент (я раскрыл переменные для ясности).

if (-100 < 500) {
 // какой-то код
}

но условие не возвращает истину. Что делать в таком случае?

А так?

if ((-100) < 500) {
 // какой-то код
}

Хотя мы не знаем, чего там за переменные - может Вы взяли беззнаковые - с Вас станется...

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

mykaida пишет:

А так?

if ((-100) < 500) {
 // какой-то код
}

Без толку. Приоритет унарного минуса значительно выше. Это просто ТС обкурился чуток.

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

maxet пишет:

У меня в коде был примерно вот такой элемент (я раскрыл переменные для ясности).

if (-100 < 500) {
 // какой-то код
}

но условие не возвращает истину. Что делать в таком случае?

Для ясности - это бред.

Запустите, прямо так с константами и убедитесь, что всё работает нормально (ну, или Вы станете первым в галактике, у кого не работает). А что уж там у Вас за переменные и что Вы там раскрыли или закрыли - того мы не знаем, ибо тайна сия велика есть.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ЕвгенийП пишет:

Без толку. Приоритет унарного минуса значительно выше. Это просто ТС обкурился чуток.

[/quote]

Где-то - может в фокспро или еще в каком раритете было не так и после этого я стал добавлять скобки для верности и наглядности. Привычка :)

vlad072
Offline
Зарегистрирован: 01.08.2017

Конкретно так как выложили пробовали, без переменных? Думаю дело в типах этих самых переменных, они у Вас беззнаковые. Попробуйте явно привести

if ( (int)x < (int)y )...

Logik
Offline
Зарегистрирован: 05.08.2014

Нерешаемо при современном уровне развития циффилизации, вот ИИ сделают, тогда может он что поймет в темных скетчах ТС.

SLKH
Offline
Зарегистрирован: 17.08.2015

Logik пишет:

Нерешаемо при современном уровне развития циффилизации, вот ИИ сделают, тогда может он что поймет в темных скетчах ТС.

Если он интеллект - пошлет и не станет разбираться. Это как с разумными инопланетянами.

Logik
Offline
Зарегистрирован: 05.08.2014

Как пошлет?! Он и слов нужных не найдет. Эти слова изучают не в классах школы, а в коридорах. ИИ такого знать не может. Кстати забавно, ограничение для ИИ выходит. Матюкатся не должен уметь. И по этому факту его от естественного можна отличить )))

maxet
Offline
Зарегистрирован: 30.06.2018
boolean flag1 = 0;
int last_time[6] = {0, 0, 0, 0, 0, 0};                     // создаю 5 переменных, запоминающих време после включения (миллис)
boolean flag = 0;
void setup() {
  // put your setup code here, to run once:
     randomSeed(analogRead(0));                      // беру рандомное значение с аналогового пина 0
     Serial.begin(9600); 
     pinMode(3, INPUT_PULLUP); // подключаю кнопку

}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(8, LOW);
  digitalWrite(9, LOW);
  while(digitalRead(3)) { 
}
delay(2000);
  
  int tim[4] = {random(200, 1000), random(200, 1000), random(200, 1000), random(200, 1000)};   
// создаю 4 рандомных промежутка между нажатиями
  for (int i = 0; i < 5; i++) {                                // пищалка пищит 5 раз
    tone(5, 1000, 70);
    if (i != 4) {delay(tim[i]); }     // делаю промежутки после сигналов кроме последнего(после него не нужно)
  }
  while(digitalRead(3)) {                                 //жду первое нажатие
        last_time[0] = millis();                                // запоминаю время, когда произошло первое нажатие
                                                   // во избежании дребезга 100 милисекунд жду    
  }
  Serial.println("Есть."); 
  delay(70);  
  
  for (int i = 0; i < 4; i++) { // четыре раза жду нажатий
    while(1) {
      
      if (!digitalRead(3)) { 
      Serial.println("Кнопка нажата.");
      Serial.println("tim[i] - 500");
      Serial.println(tim[i] - 500); 
      Serial.println("millis() - last_time[i]");
      Serial.println(millis() - last_time[i]);
      Serial.println("tim[i] + 500"); 
      Serial.println(tim[i] + 500);   
                      if (tim[i] - 500 < millis() - last_time[i]) {
                       if(millis() - last_time[i] < tim[i] + 500){
                    Serial.println("Условие выполненно."); 
                    last_time[i + 1] = millis();   
                                             delay(100);                           
                                             break;
                                    } else {
                                      Serial.println("Слишком медленно.");
                        flag = 1;
                       delay(70);
                        break;
                                    }
                      } else {
                        
                        Serial.println("Слишком быстро.");
                        flag = 1;
                       delay(70);
                        break;
                      }
      delay(70);
      }
  
    }

      }
      delay(500);    
    
  if (flag == 1) {

     tone(5, 500, 500); 
  } else {

     tone(5, 5000, 500);  
  }
                     // звук победы
}

Посмотри на 44 и 45 строку. Вот что выводит порт :

13:58:31.896 -> Кнопка нажата.
13:58:31.929 -> tim[i] - 500
13:58:31.929 -> -192
13:58:31.963 -> millis() - last_time[i]
13:58:31.963 -> 230
13:58:31.998 -> tim[i] + 500
13:58:31.998 -> 808
13:58:31.998 -> Слишком быстро.
 
-192 < 230 а условие даёт ложь
 
SLKH
Offline
Зарегистрирован: 17.08.2015

Logik пишет:

Как пошлет?! Он и слов нужных не найдет. Эти слова изучают не в классах школы, а в коридорах. ИИ такого знать не может. Кстати забавно, ограничение для ИИ выходит. Матюкатся не должен уметь. И по этому факту его от естественного можна отличить )))

Если интеллект - найдет.  Иначе это не интеллект.

 

- Ты сильная, ты справишься!

- Я умная. Я даже не возьмусь.

 

maxet
Offline
Зарегистрирован: 30.06.2018

Logik пишет:

Как пошлет?! Он и слов нужных не найдет. Эти слова изучают не в классах школы, а в коридорах. ИИ такого знать не может. Кстати забавно, ограничение для ИИ выходит. Матюкатся не должен уметь. И по этому факту его от естественного можна отличить )))

Очень достойно с вашей стороны.

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

Logik пишет:

Как пошлет?! Он и слов нужных не найдет. Эти слова изучают не в классах школы, а в коридорах. ИИ такого знать не может. Кстати забавно, ограничение для ИИ выходит. Матюкатся не должен уметь. И по этому факту его от естественного можна отличить )))

Интеллект - и не умеет?

Какой же он тогда интеллект?

maxet
Offline
Зарегистрирован: 30.06.2018

SLKH пишет:

Logik пишет:

Как пошлет?! Он и слов нужных не найдет. Эти слова изучают не в классах школы, а в коридорах. ИИ такого знать не может. Кстати забавно, ограничение для ИИ выходит. Матюкатся не должен уметь. И по этому факту его от естественного можна отличить )))

Если интеллект - найдет.  Иначе это не интеллект.

 

- Ты сильная, ты справишься!

- Я умная. Я даже не возьмусь.

 

Молодцы!! Так держать!! Пришли на форум по ардуино и строите из себя участниц Дома 2. С таким успехом идите в любую соц. сеть и сидите там. Унижайте остальных. Умные люди здесь помогают новичкам, ну а если нет, то кто в будующем вам хлеб с водой вам подаст.

P.S Да, действительно, не одного слова матного не употребил)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

maxet пишет:

                      if (tim[i] - 500 < millis() - last_time[i]) {
                       if(millis() - last_time[i] < tim[i] + 500){
Посмотри на 44 и 45 строку. Вот что выводит порт :
13:58:31.896 -> Кнопка нажата.
13:58:31.929 -> tim[i] - 500
13:58:31.929 -> -192
13:58:31.963 -> millis() - last_time[i]
13:58:31.963 -> 230
13:58:31.998 -> tim[i] + 500
13:58:31.998 -> 808
13:58:31.998 -> Слишком быстро.
 
-192 < 230 а условие даёт ложь
 

Из-за недостатка теоретических знаний у Вас все перепуталось в голове - int, long

Напишите 44 строку так: if (tim[i] < (millis() - last_time[i]+500)) - и она заработает.

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

maxet пишет:

Посмотри на 44 и 45 строку. Вот что выводит порт :

13:58:31.896 -> Кнопка нажата.
13:58:31.929 -> tim[i] - 500
13:58:31.929 -> -192
13:58:31.963 -> millis() - last_time[i]
13:58:31.963 -> 230
13:58:31.998 -> tim[i] + 500
13:58:31.998 -> 808
13:58:31.998 -> Слишком быстро.
 
-192 < 230 а условие даёт ложь
 

Помните анекдот, как НР кричал едва не попавшему по колёса пешеходу: "Для Вас, Козлов, переходов понаделали!"

Вот так и у Вас. Вам компилятор как человеку подсказывает, что Вы ошиблись,

xxx.ino:20:23: warning: narrowing conversion of 'random(200l, 1000l)' from 'long int' to 'int' inside { } [-Wnarrowing]
xxx.ino:20:42: warning: narrowing conversion of 'random(200l, 1000l)' from 'long int' to 'int' inside { } [-Wnarrowing]
xxx.ino:20:61: warning: narrowing conversion of 'random(200l, 1000l)' from 'long int' to 'int' inside { } [-Wnarrowing]
xxx.ino:20:80: warning: narrowing conversion of 'random(200l, 1000l)' from 'long int' to 'int' inside { } [-Wnarrowing]
xxx.ino:44:40: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
xxx.ino:45:51: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

но Вам плевать на его подсказки - Вы уверены, что накосячил он, а не Вы :)

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

maxet пишет:
Умные люди здесь помогают новичкам
Мне казалось, что Вы давно заметили, что это не так. Нет?

Умные люди здесь общаются между собой. В том числе, и с умными новичками. А придуркам здесь никто не помоагет - это ж технический форум, а не конгрегация Матери Терезы.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

ЕвгенийП пишет:

Умные люди здесь общаются между собой. В том числе, и с умными новичками. А придуркам здесь никто не помоагет - это ж технический форум, а не конгрегация Матери Терезы.

Волшебно ! Очень понравилось :)