#include <Arduino.h>
#include <string.h> // Для memcmp и memcpy
struct stDSData {
uint8_t dsAddr[4][8]; // Двумерный массив 4x8
uint8_t nLamp[4]; // Номер светильника
bool isUpdated; // Флаг обновления
};
// Инициализация структур
stDSData gstDSFind = {
{ { 40, 11, 11, 11, 11, 11, 11, 11 }, { 0 }, { 40, 33, 33, 33, 33, 33, 33, 33 }, { 0 } }, // dsAddr
{ 0 }, // nLamp
false // isUpdated
};
stDSData gstDSSave = {
{ { 40, 11, 11, 11, 11, 11, 11, 11 }, { 40, 22, 22, 33, 33, 33, 33, 33 }, { 0 }, { 40, 33, 33, 33, 33, 33, 33, 33 } }, // dsAddr
{ 4, 0, 3, 0 }, // nLamp
false // isUpdated
};
// Основная функция обработки
void processDSData(stDSData& find, stDSData& save) {
// Сбрасываем флаг isUpdated
find.isUpdated = false;
// Перебор всех строк в gstDSFind
for (int i = 0; i < 4; i++) {
bool found = false;
// Поиск строки в gstDSSave
for (int j = 0; j < 4; j++) {
// Сравнение строк (подмассивов) с помощью memcmp
if (memcmp(find.dsAddr[i], save.dsAddr[j], 8 * sizeof(uint8_t)) == 0) {
// Если строка найдена, присваиваем nLamp из gstDSSave
find.nLamp[i] = save.nLamp[j];
found = true;
break;
}
}
// Если строка не найдена в gstDSSave, устанавливаем флаг isUpdated в true и продолжаем обработку до конца
if (!found) {
find.isUpdated = true;
}
}
// Если isUpdated равен true, копируем gstDSFind в gstDSSave
if (find.isUpdated) {
memcpy(&save, &find, sizeof(stDSData));
Serial.println("Массив обновлен");
} else {
Serial.println("Массив идентичен");
}
}
void setup() {
Serial.begin(9600);
// Обработка данных
processDSData(gstDSFind, gstDSSave);
// Вывод результата
Serial.println("Результат (gstDSFind):");
for (int i = 0; i < 4; i++) {
Serial.print("dsAddr[");
Serial.print(i);
Serial.print("]: ");
for (int j = 0; j < 8; j++) {
Serial.print(gstDSFind.dsAddr[i][j]);
Serial.print(" ");
}
Serial.print(" | nLamp: ");
Serial.println(gstDSFind.nLamp[i]);
}
Serial.println("\nРезультат (gstDSSave):");
for (int i = 0; i < 4; i++) {
Serial.print("dsAddr[");
Serial.print(i);
Serial.print("]: ");
for (int j = 0; j < 8; j++) {
Serial.print(gstDSSave.dsAddr[i][j]);
Serial.print(" ");
}
Serial.print(" | nLamp: ");
Serial.println(gstDSSave.nLamp[i]);
}
Serial.print("\nisUpdated в gstDSFind: ");
Serial.println(gstDSFind.isUpdated ? "true" : "false");
}
void loop() {
// Пустой цикл
}