Передача struct в конструктор класа
- Войдите на сайт для отправки комментариев
Ср, 25/12/2019 - 19:33
Доброе время суток.
Есть некая структура масивов
struct SENSORS{ uint8_t pir; char *loc; uint8_t count; }; SENSORS PIR[]={ {6,"sensor1",0}, {7,"sensor2",0}, {8,"sensor3",0} };
Нужно както эту структуру передать в конструктор класа и использовать внутри класа даную структуру.
Делал таким методом:
Файл myclass.h
class myclass{ public: myclass(struct SENSORS *PIR); }
Файл myclass.cpp
myclass::myclass(struct SENSORS *PIR){ struct PIR = *PIR; };
Файл app.ino
#include "myclass.h" struct SENSORS{ uint8_t pin; char *loc; uint8_t count; }; void setup() { SENSORS PIR[]={ {6,"sensor1",0}, {7,"sensor2",0}, {8,"sensor3",0} }; myclass test(struct SENSORS &PIR); } void loop() { }
Подскажите как правильно реализовать такой подход.
Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?
Ты не структуру передаешь, а массив.
Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?
В конструкторе нужно присвоить масив структур переменой чтобы можна было этот масив использовать в класе
У меня от квоновских конструкций сразу опрокидывание мозга случается... Такое впечатление, что какое бы блюдо он не готовил, получается одно и то же оливье. Только ингридиенты кидаются в разном порядке.
Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?
В конструкторе нужно присвоить масив структур переменой чтобы можна было этот масив использовать в класе
Массив структур не может быть присвоен. Он может быть скопирован целиком в точно такой же или быть доступным по указателю , переменной - члену класса.
А можно по указателю использовать переданую структуру в класе, без переприсваивания?
А можно по указателю использовать переданую структуру в класе, без переприсваивания?
Можно. Заведите указатель на структуру и просто присвойте ему то, что сейчас объявлено аргументом конструктора. Вроде как это должно сработать: struct SENSORS *extPIR; ... extPIR = PIR; ...
Ну, или если просто один раз в конструкторе использовать массив, то можно член класса не объявлять. Только помните, что используете массив структур и индексируйте указатель, чтобы попасть на нужный элемент массива.
Чтото запутался с этими указателями. Сделал вот так:
Выдает ошибку:
error: flexible array member 'myclass::data' in an otherwise empty 'class myclass'
когда прописываю на всех масивах [3] ошибки нет, но в результате выдает цыфры вовсе левые нежели записаны в структуре, я так понимаю это адреса.
Оставаясь в Вашей концепции:
Сделал вот так:
Вроде как работает, вот только непойму, в myclass test(PIR); передается структура а в самом конструкторе принимается указатель на структуру myclass(SENSORS *pointer); этот момент немогу понять
В результате проведения компилятором всяких ахалаев-махалаев (неявного приведения типа) имя массива зачастую является указателем на первый (нулевой) элемент массива.
И, ещё раз: передаётся не структура, а указатель на первый элемент массива структур.
Я так понял передача PIR равнозначно &PIR[0] ?
Выходит, что так.
Спасибо за помощь!