Впишите сюда текст цитаты
Да, чем меньше - тем выше
Впишите сюда текст цитаты
Да, чем меньше - тем выше
Минутку, проверю кое что…
Вот такую ошибку выдаёт при попытке вынести в функцию:
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
ВОт так согласилась. Спасибо!