Функция сортировки структуры

Да, видимо, где-то вы с алгоритмом накосячили. Но тут вы не многомерный массив инициализируете, а массив структур, соответственно, и тип данных перед самими данными указывать нужно

Пропустил вопрос. Я имею ввиду, при такой записи читает с первой по предпоследнюю строку. Если строк пять - читает четыре. Добавляешь ещё - читает всё равно минус одну. То есть, дело не в данных, а в синтаксисе, видимо.
Ну, и поскольку есть способ задать массив так, что все строки читаются -то дело не в алгоритме, так понимаю

Да. Это всё баба Маша, её проделки…

Вот опять я вижу, что не понимаете. Читайте

И пробуйте

struct commandLine {
  uint16_t timeFromStart;
  uint8_t deviceName;
  boolean onDevice;
  uint16_t timeDeviceOn;
};

commandLine Formovka[] = {
  (commandLine){ 17, 2, 1, 170 },
  (commandLine){ 8, 3, 1, 88 },
  (commandLine){ 5, 2, 1, 55 },
  (commandLine){ 10, 3, 1, 100 },
  (commandLine){ 21, 2, 1, 210 },
  (commandLine){ 13, 3, 1, 130 }
};

void setup() {
  Serial.begin(9600);

  sortArr();

  for (int i = 0; i < sizeof(Formovka) / sizeof(Formovka[0]); i++) {
    Serial.print(Formovka[i].timeFromStart);
    Serial.print(" - ");
    Serial.println(i);
  }
}


void loop() {
}


void sortArr() {
  int arrayLength = sizeof(Formovka) / sizeof(Formovka[0]);
  int tmp = 0;
  for (int i = 0; i < arrayLength; i++) {
    for (int j = (arrayLength - 1); j >= (i + 1); j--) {
      if (Formovka[j].timeFromStart < Formovka[j - 1].timeFromStart) {
        tmp = Formovka[j].timeFromStart;
        Formovka[j].timeFromStart = Formovka[j - 1].timeFromStart;
        Formovka[j - 1].timeFromStart = tmp;
        Serial.println("Replace");
      }
    }
  }
  Serial.println(" End Of The Sort");
}
Replace
Replace
Replace
Replace
Replace
Replace
 End Of The Sort
5 - 0
8 - 1
10 - 2
13 - 3
17 - 4
21 - 5

Попытайтесь вот это присобачить: qsort | Программирование на C и C++

Интересно, а эта строка зачем?

Я ж говорю - накосячил он с алгоритмом ))

Проверить наличие значения. Чтобы пустые поля игнорировать.

1 лайк

Я правильно понял, что этот код не строки сортирует, а только первые элементы массива? То есть, первый элемент и остальные оказываются в разных строках?

ну а голова-то вам зачем дана? Переделайте код, чтобы записи сортировались целиком.

Вам дали эту ссылку, чтобы вы посмотрели алгоритм, а не чтобы вы код скопировали.

Replace
Replace
Replace
Replace
Replace
 End Of The Sort
5 - 2 - 1 - 170 - 0
8 - 3 - 1 - 88 - 1
10 - 2 - 1 - 55 - 2
13 - 3 - 1 - 100 - 3
17 - 2 - 1 - 210 - 4
21 - 3 - 1 - 130 - 5

Развалились данные

Я адаптировал этот код к вашему массиву. И результат сортировки привел. Смотрите внимательно.

ЗЫ: а если интересно, почему ваш код не захватывал последнюю строку, могу посоветовать взять листок бумаги, карандаш и пройтись по вашему массиву вручную. В конце концов косяк найдете (меня не спрашивайте, мне копаться там было лень))

Да ешкин же кот

Где оно развалилось?

ЗЫ: похоже, пора вам отдохнуть, утро вечера мудренее ))

@Vlad_J прав, развалилось.
В своем коде, строки 40-42, когда ты переставляешь значения в таблице - ты переставляешь только поля .timeFromStart . а не записи целиком

Было:

commandLine Formovka[] = {
  (commandLine){ 17, 2, 1, 170 },
  (commandLine){ 8, 3, 1, 88 },
  (commandLine){ 5, 2, 1, 55 },
  (commandLine){ 10, 3, 1, 100 },
  (commandLine){ 21, 2, 1, 210 },
  (commandLine){ 13, 3, 1, 130 }
};

Стало:

5 - 2 - 1 - 170 - 0
8 - 3 - 1 - 88 - 1
10 - 2 - 1 - 55 - 2
13 - 3 - 1 - 100 - 3
17 - 2 - 1 - 210 - 4
21 - 3 - 1 - 130 - 5

Данные в строках перемешаны. У меня машина построчно читает

Да, да, извиняюсь, сейчас поправлю

void sortArr() {
  int arrayLength = sizeof(Formovka) / sizeof(Formovka[0]);
  commandLine tmp;
  for (int i = 0; i < arrayLength; i++) {
    for (int j = (arrayLength - 1); j >= (i + 1); j--) {
      if (Formovka[j].timeFromStart < Formovka[j - 1].timeFromStart) {
        tmp = Formovka[j];
        Formovka[j] = Formovka[j - 1];
        Formovka[j - 1] = tmp;
        Serial.println("Replace");
      }
    }
  }
  Serial.println(" End Of The Sort");
}

Голова после ночной плохо варит ))

одну строчку забыл, вот так надо

1 лайк

Я понял - всем пора отдохнуть))
Спасибо за помощь!!

Поправил ))

Оно работает! Ура!)