Я написал проект Arduino для своего сына и в процессе узнал о C. Все работает нормально, но после разделения кода на десять файлов и группировки переменных в структуры в каждом файле я не могу решить одно желание для ясности. Нам нужно эмпирически определить наилучший размер массива для хранения и усреднения чтения портов, поэтому это то, что я хочу:
struct Alarms {
// Configurable parameters
const unsigned int number_of_reads = 24;
// State variables
int reads[number_of_reads]; // Error: invalid use of non-static data member 'Alarms::num_of_reads'
};
Это просто, но не работает. Я пробовал гибкие элементы массива, пока не обнаружил, что эта функция не поддерживается в C++. Ардуино компилируется на С++. Я пробовал много примеров «взлома структуры», но все они возвращали ошибки, подобные этой:
struct Alarms {
// Configurable parameters
int number_of_reads = 24;
// State variables
int reads[];
} ar;
void setup_alarm() {
ar.reads = malloc(sizeof(int) * ar.number_of_reads); // Error: incompatible types in assignment of 'void*' to 'int [0]'
}
Это выглядело многообещающе, но я подозреваю, что мое невежество ярко светится. Большинство примеров взлома структуры требуют объявления структуры и последующей инициализации переменных структуры. Я надеюсь не дублировать структуру.
Я подумал о разделении структуры, но это было бы подвержено ошибкам и, ну, еще одна ошибка компиляции:
struct Alarms2 {
int reads[ar.num_of_reads]; // Error: array bound is not an integer constant before ']' token
} ar2;
Альтернативой является размер массива и получение размера позже, но это требует объяснения:
struct Alarms {
// Configurable parameters
int reads[ 24 ]; // Put number of reads to average between brackets
// State variables
int number_of_reads;
};
void setup_alarm() {
ar.number_of_reads = sizeof(ar.reads) / sizeof(ar.reads[0]); // this works
}
Есть ли способ взломать структуру или какое-то подобное решение в Arduino, чтобы получить первый пример?