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

Обучи, если не сложно.

Чему? Структура - она сама по себе тип данных

Выше void setup() не сработало. Экземпляр создаётся, но данные не усваивает

Видимо таки нужно так

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}
  };
1 лайк

Видимо я чего-то упускаю. У меня с typedef не нужно было указывать struct везде где использовался экземпляр. А без struct были ошибки.

Ну не знаю, не сталкивался. Или не понял ))

Последнюю строку не видит. Добавляю ещё - видит предыдущую (которая последней была)

Кто? Кот, мыши?

Это как? Код актуальный выложите

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

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

void setup()
{
  Serial.begin(9600);
  
  /*
  commandLine Formovka[100];
  Formovka[0] = (commandLine){17, 2, 1, 170};
  Formovka[1] = (commandLine){8, 3, 1, 88};
  Formovka[2] = (commandLine){5, 2, 1, 55};
  Formovka[3] = (commandLine){10, 3, 1, 100};
  Formovka[4] = (commandLine){21, 2, 1, 210};
  Formovka[5] = (commandLine){13, 3, 1, 130};
  */
  /*
  int arrayLength = sizeof(Formovka) / sizeof(Formovka[0]);
  for(int i = 0; i < arrayLength; i++){
    int z = i;
    for(int x = i+1; x < arrayLength-(i+1); x++){
      if(Formovka[x].timeFromStart && Formovka[z].timeFromStart){
        if(Formovka[z].timeFromStart > Formovka[x].timeFromStart) {
        Formovka[arrayLength-1] = Formovka[z];
        Formovka[z] = Formovka[x];
        Formovka[x] = Formovka[arrayLength-1];
        z = x;
        Serial.println("Replace");
        } 
      }
      
    }
    if(i != z) i--;
  }
  Serial.println(" End Of The Sort");
  */
  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]);
  for(int i = 0; i < arrayLength; i++){
    int z = i;
    for(int x = i+1; x < arrayLength-(i+1); x++){
      if(Formovka[x].timeFromStart && Formovka[z].timeFromStart){
        if(Formovka[z].timeFromStart > Formovka[x].timeFromStart) {
        Formovka[arrayLength-1] = Formovka[z];
        Formovka[z] = Formovka[x];
        Formovka[x] = Formovka[arrayLength-1];
        z = x;
        Serial.println("Replace");
        } 
      }
      
    }
    if(i != z) i--;
  }
  Serial.println(" End Of The Sort");
}

Выдача в Serial:

Replace
Replace
Replace
Replace
 End Of The Sort
5 - 0
8 - 1
10 - 2
17 - 3
21 - 4
8 - 5

Добавляю строку:

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

Теперь видит:

Replace
Replace
Replace
Replace
 End Of The Sort
5 - 0
8 - 1
10 - 2
13 - 3
21 - 4
17 - 5
8 - 6

Я уже запятую пробовал в последней строке добавлять - без изменений

В сторону готовой, доступной в системе, отлично работающей функции qsort и выхода из колхоза.

Это сортировка косячит

Если набивать массив так:

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

То не косячит, почему-то

Уверены?

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


void setup()
{
  Serial.begin(9600);
    
  commandLine Formovka[6];
  Formovka[0] = (commandLine){17, 2, 1, 170};
  Formovka[1] = (commandLine){8, 3, 1, 88};
  Formovka[2] = (commandLine){5, 2, 1, 55};
  Formovka[3] = (commandLine){10, 3, 1, 100};
  Formovka[4] = (commandLine){21, 2, 1, 210};
  Formovka[5] = (commandLine){13, 3, 1, 130};
  

  int arrayLength = sizeof(Formovka) / sizeof(Formovka[0]);
  for(int i = 0; i < arrayLength; i++){
    int z = i;
    for(int x = i+1; x < arrayLength-(i+1); x++){
      if(Formovka[x].timeFromStart && Formovka[z].timeFromStart){
        if(Formovka[z].timeFromStart > Formovka[x].timeFromStart) {
        Formovka[arrayLength-1] = Formovka[z];
        Formovka[z] = Formovka[x];
        Formovka[x] = Formovka[arrayLength-1];
        z = x;
        Serial.println("Replace");
        } 
      }
      
    }
    if(i != z) i--;
  }
  Serial.println(" End Of The Sort");

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

void loop()
{
 
}


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

Ну и где оно видит?

Вы точно понимаете, что делаете? Посмотрите внимательно и найдите отличие от вашего кода

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},
    commandLine{1, 2, 1, 210},
  };

Мошт до завтра? Завтра пятница… ))

1 лайк

Если бы точно понимал - не отвлекал бы уважаемых людей от подготовки к пятнице)
Я так пробовал. Нет, так тоже последняя строка не впитывается