Поиск совпадения в двухмерном массиве

junior_developer
Offline
Зарегистрирован: 27.11.2017
Подскажите пожалуйста, есть ли какая-то готовая функция поиска символов в двухмерном массиве?
То есть проверки совпадения последовательности, например из 4 символов.
char input_number[] {"6390"}; // последовательность символов для поиска
char stored_numbers [][4]{ // массив char по 4-ре символа
	"1234",
	"5678",
	"4567",
	"7801",
	"6390",
	"7524"
	// ... и так далее
};

bool find_number() {
...
return true; // совпадение есть
return false; // нет
}

int find_number_index() {
...
return ... ; // номер совпавшей ячейки массива 
}

Как это можно реализовать проще всего? Подскажите пожалуйста!

 

b707
Offline
Зарегистрирован: 26.05.2017

проще реализовать - последовательным просмотром. А эффективнее сначала отсортировать исходный массив

rkit
Offline
Зарегистрирован: 23.11.2016

Для настоящего двухмерного массива - цикл с memcmp. Тут ты какую-то чушь написал.

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

junior_developer пишет:

функция поиска символов в двухмерном массиве?

А что она должна выдавать?

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

самый простой вариант: true или false, то есть найдено совпадение или нет

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

Ага, т.е. Вам не интересует позиция, Вам важно только найдено или нет?

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

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

Спасибо всем, кто помог! Наконец-то разобрался с функцией memcmp  Мой вариант кода:
 

char input_number[] {"7328"}; // последовательность символов для поиска
char stored_numbers [][4] { // массив char по 4-ре символа
  "1234",
  "5678",
  "4567",
  "7801",
  "6390",
  "7524",
  "7328",
  "2304"
  // ... и так далее
};

int numCount = sizeof(stored_numbers) / sizeof(stored_numbers[0]); // вычисление размера

bool find_number() {
  for (int i = 0; i < numCount; i++) { //  numCount количество элементов
    if (memcmp(input_number, stored_numbers[i], 4) == 0) {
      //Serial.print("Match found!");
      return true;
    }
  }
  //Serial.print("Not found!!!");
  return false;
}

int find_number_index() {
  for (int i = 0; i < numCount; i++) { //  numCount количество элементов
    // Serial.println(i);
    if (memcmp(input_number, stored_numbers[i], 4) == 0) {
      Serial.print("Finded! ");
      //Serial.println(i);
      return i;
    }
  }
  Serial.println("Not found!!!");
  return 0;
}

void setup() {
  Serial.begin(115200);
  Serial.print("numCount = ");
  Serial.println(numCount);
}

void loop() {
  int result = find_number_index();
  if (result)Serial.println(result);
  if (find_number()) Serial.println("Correct!!!");
  delay(5000);
}

Может, кто-то знает, как написать ещё проще?

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

Я с memcmp не работал и не знаю верно ли с ней реализация у вас, однако ж в 37 строке у вас ошибка - нулевой элемент массива у вас совпадает с признаком - не найдено.

Ну а лично я (для себя) не стал бы "код раздувать", а сделал бы вот так:

char input_number[] {"7328"};       // последовательность символов для поиска
char stored_numbers [][4] {         // массив char по 4-ре символа
  "1234",
  "5678",
  "4567",
  "7801",
  "6390",
  "7524",
  "7328",
  "2304"
  // ... и так далее
};

int numCount = sizeof(stored_numbers) / sizeof(stored_numbers[0]); // вычисление размера

int find_number () {
  for (int i = 0; i < numCount; i++) { //  numCount количество элементов
    if (memcmp(input_number, stored_numbers[i], 4) == 0) {
       return i;
    }
  }
  return -1;
}

void setup() {
  Serial.begin(115200);
  Serial.print("numCount = ");
  Serial.println(numCount);
}

void loop() {
  int result = find_number();
  if (result != -1) {
    Serial.print("Found, index = ");
    Serial.println(result);
  } else {
    Serial.println("Not found!");
  } 
  delay(5000);
}

Ну и если количество элементов массива заведомо всегда меньше 127, то для экономии памяти еще вот так (не проверял и за работоспособность не могу отвечать):

char input_number[] {"7328"};       // последовательность символов для поиска
char stored_numbers [][4] {         // массив char по 4-ре символа
  "1234",
  "5678",
  "4567",
  "7801",
  "6390",
  "7524",
  "7328",
  "2304"
  // ... и так далее
};

int8_t numCount = sizeof(stored_numbers) / sizeof(stored_numbers[0]); // вычисление размера

int8_t find_number () {
  for (int8_t i = 0; i < numCount; i++) { //  numCount количество элементов
    if (memcmp(input_number, stored_numbers[i], 4) == 0) {
       return i;
    }
  }
  return -1;
}

void setup() {
  Serial.begin(115200);
  Serial.print("numCount = ");
  Serial.println(numCount);
}

void loop() {
  int8_t result = find_number();
  if (result != -1) {
    Serial.print("Found, index = ");
    Serial.println(result);
  } else {
    Serial.println("Not found!");
  } 
  delay(5000);
}

 

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

Да, про возможное совпадение с нулевым элементом массива я не подумал! Большое спасибо, что указали на ошибку! Теперь я понимаю, почему из функции при отсутствии совпадений нужно возвращать не 0, а -1!
А если использовать uint8_t (беззнаковый тип), тогда количество элементом может быть 256, то есть от 0 до 255?

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

Но тогда ты не сможешь вернуть из функции «-1», понимашшшш куды клоню?). А вообще это все от задачи зависит, то есть если у тебя заведомо больше 127 элементов массива, то никто не заставляет экономить байты на этом - используй int16_t просто и все ))).