Передача struct в конструктор класа

sound
Offline
Зарегистрирован: 12.07.2018

Доброе время суток.

Есть некая структура масивов

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() { 

}

Подскажите как правильно реализовать такой подход.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

sound пишет:
Подскажите как правильно реализовать такой подход.

Можно через указатель, а можно через указатель копировать внутрь.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?

rkit
Offline
Зарегистрирован: 23.11.2016

Ты не структуру передаешь, а массив.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
//.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() {


}

 

sound
Offline
Зарегистрирован: 12.07.2018

sadman41 пишет:

Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?

В конструкторе нужно присвоить масив структур переменой чтобы можна было этот масив использовать в класе

sadman41
Онлайн
Зарегистрирован: 19.10.2016

У меня от квоновских конструкций сразу опрокидывание мозга случается... Такое впечатление, что какое бы блюдо он не готовил, получается одно и то же оливье. Только ингридиенты кидаются в разном порядке.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

sound пишет:

sadman41 пишет:

Это массив структур, а не структура массивов. В конструкторе структуре присваивается что? Почему так, а не наоборот?

В конструкторе нужно присвоить масив структур переменой чтобы можна было этот масив использовать в класе

Массив структур не может быть присвоен. Он может быть скопирован целиком в точно такой же или быть доступным по указателю , переменной - члену класса.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
//.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() {
}

 

sound
Offline
Зарегистрирован: 12.07.2018

А можно по указателю использовать переданую структуру в класе, без переприсваивания?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

sound пишет:

А можно по указателю использовать переданую структуру в класе, без переприсваивания?

Можно. Заведите указатель на структуру и просто присвойте ему то, что сейчас объявлено аргументом конструктора. Вроде как это должно сработать: struct SENSORS *extPIR;  ... extPIR = PIR; ...

Ну, или если просто один раз в конструкторе использовать массив, то можно член класса не объявлять. Только помните, что используете массив структур и индексируйте указатель, чтобы попасть на нужный элемент массива.

sound
Offline
Зарегистрирован: 12.07.2018

Чтото запутался с этими указателями. Сделал вот так:

/**/
//.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] ошибки нет, но в результате выдает цыфры вовсе левые нежели  записаны в структуре, я так понимаю это адреса.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Оставаясь в Вашей концепции:

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() {}

 

sound
Offline
Зарегистрирован: 12.07.2018

Сделал вот так:

/**/
//.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); этот момент немогу понять

sadman41
Онлайн
Зарегистрирован: 19.10.2016

В результате проведения компилятором всяких ахалаев-махалаев (неявного приведения типа) имя массива зачастую является указателем на первый (нулевой) элемент массива.

И, ещё раз: передаётся не структура, а указатель на первый элемент массива структур.

sound
Offline
Зарегистрирован: 12.07.2018

Я так понял передача PIR  равнозначно &PIR[0] ?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Выходит, что так.

sound
Offline
Зарегистрирован: 12.07.2018

Спасибо за помощь!