Массив массивов структур - как-то так

Maka
Offline
Зарегистрирован: 24.10.2015

Совсем я запутался, помогите пожалуйста - есть, предположим, девять каналов лед-свед. Каждый управляется четырьмя тайметами,с одинаковыми атрибутами. Я написал так:

struct timer {    //таймер
  long start;
  long stop;
  byte level;
};
struct ch {
  byte timers;
  timer Timer[4];   //четыре таймера на канал
};
ch Channel[9];      // девять каналов по четыре таймера

Сдается, что-то я неправильно делаю, потому что при заполнении - чтении выходит каша. Не могу понять, массив структур Timer[4]  в структуре Channel[0] тот же что и в Channel[1] - [...] или нет (как хотелось)? Заполняю так : 

Channel[1].Timer[0].start = 34800; 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
struct timer {    //таймер
  long start;
  long stop;
  byte level;
};
struct ch {
  byte timers;
  struct timer Timer[4];   //четыре таймера на канал
};
struct ch Channel[9];      // девять каналов по четыре таймера
//-----main()-------------
void setup() {
  Channel[2].Timer[3].start = 34800;
}

void loop() {
}
/*Скетч использует 468 байт (1%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 342 байт (16%) динамической памяти, оставляя 1706 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Maka
Offline
Зарегистрирован: 24.10.2015

Дык компилируеся оно,понятно! А если структуру заполнить и зеписать в еепром, а потом прочитать?

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

Maka пишет:

Дык компилируеся оно,понятно! А если структуру заполнить и зеписать в еепром, а потом прочитать?

так вы про указатели что-то знаете?

b707
Offline
Зарегистрирован: 26.05.2017

Maka пишет:

Дык компилируеся оно,понятно! А если структуру заполнить и зеписать в еепром, а потом прочитать?

если правильно записать и правильно прочитать... все будет ОК.

Опишите структуру как union с байтовым массивом и потом побайтно читайте - пишите.

Maka
Offline
Зарегистрирован: 24.10.2015

Я пишу - читаю с помощью EEPROM2 она побайтно ,как мне кажется, и работает.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
struct timer {    //таймер
  long start;
  long stop;
  byte level;
};
struct ch {
  byte timers;
  struct timer Timer[4];   //четыре таймера на канал
};
struct ch Channel[9];      // девять каналов по четыре таймера
byte (*pStart)=(byte *)Channel;// указатель на начало структуры.
unsigned int len=sizeof(struct ch)*9;// размер массива структуры Channel[9]

//-----main()-------------
void setup() {
  Channel[2].Timer[3].start = 34800;
}

void loop() {
}
/*Скетч использует 468 байт (1%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 342 байт (16%) динамической памяти, оставляя 1706 байт для локальных переменных. Максимум: 2048 байт.
*/

 

Maka
Offline
Зарегистрирован: 24.10.2015

Да, доступ к элепентам структуры происходит  по указателю, так написано. Покажите на примере как получить значение Channel[2].Timer[3].start. Прошу прощение за тупость!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Maka пишет:

Я пишу - читаю с помощью EEPROM2 она побайтно ,как мне кажется, и работает.

1. Хотелось бы на это посмотреть.

2. нафига искать сложностей? В шаттной (из коробки) библиотеке есот замечательные функции EEPROM.put EEPROM.get - там достаоточно написать 

EEPROM.put(<адрес>, Channel)

И всё! Отлично запишется! Нахрена придумывать себе сложности, а потом геройски преодолевать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

Опишите структуру как union с байтовым массивом и потом побайтно читайте - пишите.

Всё уже написано до нас - https://www.arduino.cc/en/Reference/EEPROMPut

(собсна пишет любой тип от начала и размеров в его sizeof) есть такая же для чтения.

Maka
Offline
Зарегистрирован: 24.10.2015

Еще вчера понял, EEPROM.put , EEPROM.get. Но таки Serial.print(Channel[2].Timer[3].start) пишет не то что туда записано

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Maka пишет:

Еще вчера понял, EEPROM.put , EEPROM.get. Но таки Serial.print(Channel[2].Timer[3].start) пишет не то что туда записано

ну, давайте код. Как пишете, как читаете. Где-то лажанулись.

Maka
Offline
Зарегистрирован: 24.10.2015

ЕвгенийП пишет:

Maka пишет:

Еще вчера понял, EEPROM.put , EEPROM.get. Но таки Serial.print(Channel[2].Timer[3].start) пишет не то что туда записано

ну, давайте код. Как пишете, как читаете. Где-то лажанулись.

Да, и причем глупо. EEPROM.put писал со 139 адреса, а EEPROM.get читал с 0.  Все работает (пока). Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И слава Богу! С Победой!