Есть ли способ сгруппировать переменные, например group.variable, как в Java/Delphi?
Я пишу скетч, который выполняет некоторые вычисления по измеряемым переменным, и он основан на похожей программе, написанной на Java, например c = A.Ux + B.Uz; Где A&B имеют различные параметры Ux, Uy, Uz и т. д. В Delphi эта нотация может использоваться как для параметров классов, так и для переменных в группе. Похоже, что-то похожее есть и в Java. Это удобный способ организации и управления переменными, когда их много, а также для их перемещения между методами без необходимости использования большого количества аргументов.
Есть ли способ сделать это на языке Arduino Wiring? В интернете я ничего не нашёл, но, возможно, я неправильно сформулировал вопрос. Заранее спасибо, Брайан
@Hamish_Fernsby, 👍0
Обсуждение1 ответ
Лучший ответ:
То, что вы ищете, — это структура:
struct foo {
uint8_t Ux;
uint8_t Uy;
uint8_t Yz;
};
Затем:
struct foo A;
struct foo B;
И:
A.Ux = 3;
B.Uz = 48;
int c = A.Ux + B.Uz;
При вызове функции следует использовать либо передачу как указатель, либо передачу как ссылку, чтобы избежать ненужного копирования:
// По ссылке
int normal(struct foo &arg) {
return (arg.Ux + arg.Uy + arg.Uz) / 3;
}
int avg = normal(A);
Или:
// По указателю
int normal(struct foo *arg) {
return (arg->Ux + arg->Uy + arg->Uz) / 3;
}
int avg = normal(&A);
Подробнее о структурах можно прочитать здесь.
Обратите внимание, что передача как константная ссылка часто является лучшей альтернативой передаче как значению., @Edgar Bonet
@EdgarBonet Если только вы не хотите изменить значения, но отбросить их. Возможно, вы выполняете какие-то вычисления и возвращаете результат, но хотите (по какой-то причине) изменить сами значения в процессе вычислений (возможно, вы работаете со значениями итеративно и хотите накапливать изменения, не знаю...)., @Majenko
Конечно, есть множество конкретных ситуаций! Но я не об этом. Я говорю о том, что если вы хотите оптимизировать код, который бездумно передаёт большую структуру по значению, вы знаете, что копия структуры, вызывающая функция, _не должна_ изменяться вызываемой функцией. Поэтому лучше всего попытаться передать её по константной ссылке. Если компилируется, всё хорошо. Если нет, это потому, что вызываемая функция изменяет свою собственную копию, и вы понимаете, что хотя бы _некоторое_ копирование необходимо., @Edgar Bonet
@EdgarBonet Конечно. Но если всё становится настолько сложно, возможно, пора задуматься о переходе на классы... ;), @Majenko
Ах, структура! Отлично, спасибо! Я искал «record», так это называется в Delphi..., @Hamish_Fernsby
- Как работают массивы?
- Защита переменных и функций в библиотеке, не имеющей класса
- Как объявить массив переменного размера (глобально)
- Как получить тип данных переменной?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: "недопустимое использование нестатической функции-члена" при вызове функции из моего собственного класса-метода
- Преобразование long в массив символов и обратно
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
Wiring— это платформа разработки, а не язык. Мы пишем наши скетчи на C/C++. Вы имеете в видуstructили члены класса в C++? (https://www.tutorialspoint.com/cplusplus/cpp_classes_objects.htm), @Maximilian Gerhardt