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

Впишите сюда текст цитаты

Да, чем меньше - тем выше

Минутку, проверю кое что…

Вот такую ошибку выдаёт при попытке вынести в функцию:

no match for 'operator[]' (operand types are 'commandLine' and 'int')

Зачем здесь слово struct?

Читал, экспериментировал. По крайней мере, на эту строчку ругаться перестала))

Массив объявлен в setup(), стало быть за пределами сетапа он будет недоступен. Так и задумано?

Потому что он typedef не использует )

Нет, само получилось. Сейчас поправлю

Да без разницы.

Ну компильни.

Переместил выше. Функции не полегчало…

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(Formovka);
}


void loop()
{
 
}


void sortArr(struct commandLine Formovka){
  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");
}

И пытаться не буду. Бестолково сделано потому что )))

И не полегчает. Вот так попробуйте

void sortArr(commandLine Formovka[])

Или вообще без аргумента - раз уж у вас массив объявлен глобально

void sortArr()

Собственно, так будет правильнее

Ты чего??? Уж ты то “тертый калач”, а о том, что передавать размер массива в функцию забыл??? ))

Мне сегодня думать лень, поэтому если просто “надо”, то так:

void sortArr(struct commandLine Formovka, int arrayLength)

Пытался скомпилировать ваш код изначальный, куча варнингов и ошибок. Но мне то что, главное чтобы у вас работало.
Передавайте размер массива в функцию и будет вам счастье.

Да, но оно и не мне надо. Компилятор, кстати, об этом предупреждает ))

Но передавать в функцию объявленный глобально массив вообще не нужно

Так то да… Но изначально он его не глобально объявлял.

Ошибка проектирования. Он ему как раз глобальный нужен ))

Интересно, как оно у него вообще работало, если просто компиляция изначального кода (я раскомментировал функцию и закомментировал ее код в сетап):

arduino_modified_sketch_481271\sketch_aug29c.ino: In function 'void setup()':
sketch_aug29c:52:19: error: could not convert '(commandLine*)(& Formovka)' from 'commandLine*' to 'commandLine'
   sortArr(Formovka);
                   ^
arduino_modified_sketch_481271\sketch_aug29c.ino:32:7: warning: unused variable 'arrayLength' [-Wunused-variable]
   int arrayLength = sizeof(Formovka) / sizeof(Formovka[0]);
       ^~~~~~~~~~~
arduino_modified_sketch_481271\sketch_aug29c.ino: In function 'void sortArr(commandLine)':
sketch_aug29c:63:55: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
   int arrayLength = sizeof(Formovka) / sizeof(Formovka[0]);
                                                       ^
sketch_aug29c:67:18: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
       if(Formovka[x].timeFromStart && Formovka[z].timeFromStart){
                  ^
sketch_aug29c:67:47: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
       if(Formovka[x].timeFromStart && Formovka[z].timeFromStart){
                                               ^
sketch_aug29c:68:20: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
         if(Formovka[z].timeFromStart > Formovka[x].timeFromStart) {
                    ^
sketch_aug29c:68:48: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
         if(Formovka[z].timeFromStart > Formovka[x].timeFromStart) {
                                                ^
sketch_aug29c:69:17: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
         Formovka[arrayLength-1] = Formovka[z];
                 ^
sketch_aug29c:69:43: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
         Formovka[arrayLength-1] = Formovka[z];
                                           ^
sketch_aug29c:70:17: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
         Formovka[z] = Formovka[x];
                 ^
sketch_aug29c:70:31: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
         Formovka[z] = Formovka[x];
                               ^
sketch_aug29c:71:17: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
         Formovka[x] = Formovka[arrayLength-1];
                 ^
sketch_aug29c:71:31: error: no match for 'operator[]' (operand types are 'commandLine' and 'int')
         Formovka[x] = Formovka[arrayLength-1];
                               ^
exit status 1
could not convert '(commandLine*)(& Formovka)' from 'commandLine*' to 'commandLine'

Код:

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

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(Formovka);
}


void loop()
{

}


void sortArr(struct commandLine Formovka) {
  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");
}

Может это была первоначальная “жалоба”, а мы (я) как всегда на выдумывали себе? ))))

кстати, на его код из #31

/tmp/.arduinoIDE-unsaved2024729-77951-ghm8cu.7lkhh/sketch_aug29a/sketch_aug29a.ino:1:1: warning: 'typedef' was ignored in this declaration
 typedef struct commandLine{
 ^~~~~~~

Не нужен там typedef

ВОт так согласилась. Спасибо!