Да, видимо, где-то вы с алгоритмом накосячили. Но тут вы не многомерный массив инициализируете, а массив структур, соответственно, и тип данных перед самими данными указывать нужно
Пропустил вопрос. Я имею ввиду, при такой записи читает с первой по предпоследнюю строку. Если строк пять - читает четыре. Добавляешь ещё - читает всё равно минус одну. То есть, дело не в данных, а в синтаксисе, видимо.
Ну, и поскольку есть способ задать массив так, что все строки читаются -то дело не в алгоритме, так понимаю
Да. Это всё баба Маша, её проделки…
Вот опять я вижу, что не понимаете. Читайте
И пробуйте
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++
Интересно, а эта строка зачем?
Я ж говорю - накосячил он с алгоритмом ))
Проверить наличие значения. Чтобы пустые поля игнорировать.
Я правильно понял, что этот код не строки сортирует, а только первые элементы массива? То есть, первый элемент и остальные оказываются в разных строках?
ну а голова-то вам зачем дана? Переделайте код, чтобы записи сортировались целиком.
Вам дали эту ссылку, чтобы вы посмотрели алгоритм, а не чтобы вы код скопировали.
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");
}
Голова после ночной плохо варит ))
одну строчку забыл, вот так надо
Я понял - всем пора отдохнуть))
Спасибо за помощь!!
Поправил ))
Оно работает! Ура!)