Чем заменить кучу операторов IF

junior_developer
Offline
Зарегистрирован: 27.11.2017
Есть два массива
int pass[4] = {3, 6, 1, 8}; // заданный заранее
int in[4];   // считанный с клавы
Считывается он простейшим способом,
in[0] = KB.getNum;
...
...
in[3] = KB.getNum;
сравнение массивов тоже идет без цикла
if (in[0] == pass[0]) {
    if (in[1] == pass[1]) {
      if (in[2] == pass[2]) {
        if (in[3] == pass[3]) {
          /*  выполняющийся код */
        }
      }
    }
  }
 Хорошо, что там только 4 элемента, а если бы 10 или 20. Поэтому и задумался, как написать покороче.
for(int i=0; i < sizeof(in)/sizeof int; i++) {

	 in[i] = KB.getNum;
 }

А вот как заменить эту кучу IF, пока не разобрался. Можно ли тоже использовать цикл например FOR или WHILE? Например так

for(int i=0; i < sizeof(in)/sizeof(in[0]); i++){
  if (!(in[i] == pass[i])) return; // если нет совпадения, выйти из цикла!
  }

Скетч, который я нашел здесь Код полностью:

#include <iarduino_KB.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
iarduino_KB KB(9, 8, 7, 6, 5, 4, 3, 2);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo;
int pass[4] = {3, 6, 1, 8};
int in[4];
int r = 11;
int g = 12;
void setup() {
  KB.begin(KB1);
  pinMode(r, OUTPUT);
  pinMode(g, OUTPUT);
  lcd.init();
  lcd.backlight();
  digitalWrite(g, LOW);
  digitalWrite(r, HIGH);
  servo.attach(10);
  servo.write(0);
  lcd.setCursor(0, 0);
}
void loop() {
  lcd.clear();
  lcd.print("Enter code.");
  while (!KB.check(KEY_DOWN)) {
    delay(1);
  }
  in[0] = KB.getNum;
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print('*');
  while (!KB.check(KEY_DOWN)) {
    delay(1);
  }
  in[1] = KB.getNum;
  lcd.print('*');
  while (!KB.check(KEY_DOWN)) {
    delay(1);
  }
  in[2] = KB.getNum;
  lcd.print('*');
  while (!KB.check(KEY_DOWN)) {
    delay(1);
  }
  in[3] = KB.getNum;
  lcd.print('*');
  if (in[0] == pass[0]) {
    if (in[1] == pass[1]) {
      if (in[2] == pass[2]) {
        if (in[3] == pass[3]) {
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Open.");
          tone(13, 400, 750);
          servo.write(180);
          digitalWrite(r, LOW);
          digitalWrite(g, HIGH);
          delay(3000);
          lcd.clear();
          lcd.setCursor(0, 0);
          lcd.print("Close.");
          tone(13, 300, 700);
          servo.write(0);
          digitalWrite(g, LOW);
          digitalWrite(r, HIGH);
          delay(1000);
        }
      }
    }
  }
}

Помогите пожалуйста разобраться с кучей IF, чтобы упростить его! Заранее спасибо!

 

negavoid
Offline
Зарегистрирован: 09.07.2016
bool compareArrays(int a[], int b[])
{
  for(int i = 0; i < 4; i++)
  {
    if (a[i] != b[i]) return false;
  }
  return true;
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

memcmp((uint8_t*) pass, (uint8_t*) in, sizeof(pass))

negavoid
Offline
Зарегистрирован: 09.07.2016

#2 лучше

junior_developer
Offline
Зарегистрирован: 27.11.2017

а если использовать не FOR а например WHILE, то получается так
 

bool compareArrays(int a[], int b[])
{
  int i = 0;
  while( i < 4) // если в массиве 4 элемента
  {
    if (a[i] != b[i]) return false; // нет совпадения, вернуть false и выйти
	i++;  // а иначе перейти к следующему сравнению
  }
  return true;
}

Посмотрите пожалуйста, правильно ли я написал!

negavoid
Offline
Зарегистрирован: 09.07.2016

Да, правильно. Но лучше используйте сравнение памяти из #2.

#include <string.h>

if ( memcmp((uint8_t*) pass, (uint8_t*) in, sizeof(pass)) == 0 )
{
    // pass = in, do something
}