Передача 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() {
}
Подскажите как правильно реализовать такой подход.
Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?
Ты не структуру передаешь, а массив.
/**/ //.h---------------------------- struct data_t { byte a; }; class aaa { public: data_t data; aaa(data_t* pointer); }; //.cpp---------------------------- aaa::aaa(data_t* pointer) { data.a = pointer->a; } //---------------------------- data_t ddd = {14}; aaa a(&ddd); void setup() { Serial.begin(9600); Serial.println(a.data.a); } void loop() { }Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?
В конструкторе нужно присвоить масив структур переменой чтобы можна было этот масив использовать в класе
У меня от квоновских конструкций сразу опрокидывание мозга случается... Такое впечатление, что какое бы блюдо он не готовил, получается одно и то же оливье. Только ингридиенты кидаются в разном порядке.
Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?
В конструкторе нужно присвоить масив структур переменой чтобы можна было этот масив использовать в класе
Массив структур не может быть присвоен. Он может быть скопирован целиком в точно такой же или быть доступным по указателю , переменной - члену класса.
/**/ //.h---------------------------- struct data_t { byte a; }; #define num 3 class aaa { public: data_t data[num]; aaa(data_t* pointer); }; //.cpp---------------------------- aaa::aaa(data_t* pointer) { for (int i = 0; i < num; i++) data[i].a = pointer[i].a; } //---------------------------- data_t ddd[] = { {2}, {7}, {9} }; aaa a(&ddd[0]); void setup() { Serial.begin(9600); for (int i = 0; i < num; i++) Serial.println(a.data[i].a); } void loop() { }А можно по указателю использовать переданую структуру в класе, без переприсваивания?
А можно по указателю использовать переданую структуру в класе, без переприсваивания?
Можно. Заведите указатель на структуру и просто присвойте ему то, что сейчас объявлено аргументом конструктора. Вроде как это должно сработать: struct SENSORS *extPIR; ... extPIR = PIR; ...
Ну, или если просто один раз в конструкторе использовать массив, то можно член класса не объявлять. Только помните, что используете массив структур и индексируйте указатель, чтобы попасть на нужный элемент массива.
Чтото запутался с этими указателями. Сделал вот так:
/**/ //.h---------------------------- struct SENSORS{ uint8_t pir; char *loc; uint8_t count; }; class myclass{ public: SENSORS data[]; myclass(SENSORS* pointer); //.cpp---------------------------- myclass::myclass(SENSORS* pointer){ data[] = pointer[]; }; //---------------------------- SENSORS PIR[]={ {6,"sensor1",0}, {7,"sensor2",0}, {8,"sensor3",0} }; void setup() { Serial.begin(9600); myclass test(&PIR[]); Serial.println(test.data[3].pir); } void loop() { }Выдает ошибку:
error: flexible array member 'myclass::data' in an otherwise empty 'class myclass'
когда прописываю на всех масивах [3] ошибки нет, но в результате выдает цыфры вовсе левые нежели записаны в структуре, я так понимаю это адреса.
Оставаясь в Вашей концепции:
struct SENSORS { uint8_t pin; char *loc; uint8_t count; }; class myclass { public: myclass(struct SENSORS *PIR); report(); private: struct SENSORS *extPIR; }; myclass::myclass(struct SENSORS *PIR) { extPIR = PIR; Serial.println(PIR->loc); Serial.println((PIR + 1)->loc); }; myclass::report() { Serial.println((extPIR + 1)->loc); Serial.println((extPIR + 2)->loc); }; void setup() { Serial.begin(115200); SENSORS PIR[] = { {6, "sensor1", 0}, {7, "sensor2", 0}, {8, "sensor3", 0} }; Serial.println("--- 1 ---"); myclass test(PIR); Serial.println("--- 2 ---"); test.report(); } void loop() {}Сделал вот так:
/**/ //.h---------------------------- struct SENSORS{ uint8_t pir; char *loc; uint8_t count; }; class myclass{ public: SENSORS *data; myclass(SENSORS *pointer); //.cpp---------------------------- myclass::myclass(SENSORS *pointer){ data = pointer; }; //---------------------------- SENSORS PIR[]={ {6,"sensor1",0}, {7,"sensor2",0}, {8,"sensor3",0} }; void setup() { Serial.begin(9600); myclass test(PIR); Serial.println(test.data[1].pir); } void loop() { }Вроде как работает, вот только непойму, в myclass test(PIR); передается структура а в самом конструкторе принимается указатель на структуру myclass(SENSORS *pointer); этот момент немогу понять
В результате проведения компилятором всяких ахалаев-махалаев (неявного приведения типа) имя массива зачастую является указателем на первый (нулевой) элемент массива.
И, ещё раз: передаётся не структура, а указатель на первый элемент массива структур.
Я так понял передача PIR равнозначно &PIR[0] ?
Выходит, что так.
Спасибо за помощь!