Есть ли способ сгруппировать переменные, например group.variable, как в Java/Delphi?

Я пишу скетч, который выполняет некоторые вычисления по измеряемым переменным, и он основан на похожей программе, написанной на Java, например c = A.Ux + B.Uz; Где A&B имеют различные параметры Ux, Uy, Uz и т. д. В Delphi эта нотация может использоваться как для параметров классов, так и для переменных в группе. Похоже, что-то похожее есть и в Java. Это удобный способ организации и управления переменными, когда их много, а также для их перемещения между методами без необходимости использования большого количества аргументов.

Есть ли способ сделать это на языке Arduino Wiring? В интернете я ничего не нашёл, но, возможно, я неправильно сформулировал вопрос. Заранее спасибо, Брайан

, 👍0

Обсуждение

Wiring — это платформа разработки, а не язык. Мы пишем наши скетчи на C/C++. Вы имеете в виду struct или члены класса в C++? (https://www.tutorialspoint.com/cplusplus/cpp_classes_objects.htm), @Maximilian Gerhardt


1 ответ


Лучший ответ:

2

То, что вы ищете, — это структура:

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