Как правильно синтаксически создать во flash МАССИВ МАССИВА МАССИВОВ

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Всем привет! Вот столкнулся с такой задачей: значения высчитал, теперь эти значения нужно записать во флеш-память, но не знаю как это синтаксически правильно сделать. Итак, есть 5 режимов микрошагов двигателя (А), есть 30 значений скоростей оборотов двигателя (В), есть 50 значений для регистра OCR1A (C). То есть мне нужно описать 3-х мерный массив (ARR_OCR1A[5][30][50]). Как мне это правильно записать в PROGMEM.

Начинаю так, пишу массивы для С типа full, и таких 30 записей (от  OCR1A_full_1 до OCR1A_full_30):

const uint16_t OCR1A_full_1[] PROGMEM = {
 53161,  53286,  53411,  53536,  53661,  53786,  53911,  54036,  54161, 54286,  
 54411,  54536,  54661,  54786,  54911,  55036,  55161,  55286,  55411, 55536,  
 55661,  55786,  55911,  56036,  56161,  56286,  56411,  56536,  56661, 56786,  
 56911,  57036,  57161,  57286,  57411,  57536,  57661,  57786,  57911, 58036,  
 58161,  58286,  58411,  58536,  58661,  58786,  58911,  59036,  59161, 59286};

далее следующие таких-же типа OCR1A_two, ... four, ... eight, ... sixteen по 30 записей. Итого 5 * 30 = 150 массивов.

Далее описываю так называемую по-русски таблицу ссылок (как бы тип В):

const uint16_t* const ARR_OCR1A_full[] PROGMEM = {
OCR1A_full_1,  OCR1A_full_2, .... OCR1A_full_30};
const uint16_t* const ARR_OCR1A_two[] PROGMEM = {
 OCR1A_two_1,  OCR1A_two_2, ... OCR1A_two_30};
const uint16_t* const ARR_OCR1A_four[] PROGMEM = {
 OCR1A_four_1,  OCR1A_four_2, ... OCR1A_four_30};
const uint16_t* const ARR_OCR1A_eight[] PROGMEM = {
 OCR1A_eight_1,  OCR1A_eight_2 ... OCR1A_eight_30};
const uint16_t* const ARR_OCR1A_sixteen[] PROGMEM = {
 OCR1A_sixteen_1,  OCR1A_sixteen_2 ... OCR1A_sixteen_30};

Теперь мне нужно описать массив массива массивов... типа (А),  что-то типа этого (2 ВАРИАНТА):

const uint16_t* const ARR_OCR1A[] PROGMEM = {ARR_OCR1A_full[30][50], 
ARR_OCR1A_two[30][50], ARR_OCR1A_four[30][50], ARR_OCR1A_eight[30][50], 
ARR_OCR1A_sixteen[30][50]};

И ТАК:

const uint16_t* const ARR_OCR1A[] PROGMEM = {ARR_OCR1A_full, 
ARR_OCR1A_two, ARR_OCR1A_four, ARR_OCR1A_eight, 
ARR_OCR1A_sixteen};

Хочу теперь сделать так:

 OCR1A = pgm_read_word(&ARR_OCR1A[data_Dvig.size_step][data_Dvig.rpm][data_Dvig.count_imp]);    

При 1-ом варианте ошибка в определении массива массива массивов, а при 2-ом варианте указывает на ошибку в команде присвоения значения регистра OCR1A

КТО ПОДСКАЖЕТ ПРАВИЛЬНОСТЬ ОФОРМЛЕНИЯ? 

СПАСИБО!

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

А памяти-то хватит?

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

памяти хватает АРДУИНО МЕГА пользуюсь. Подскажите про синтаксис

 

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Пишет типа такого (с первым вариантом определения - const uint16_t* const ARR_OCR1A)

motor:5:91: error: invalid types 'const uint16_t {aka const unsigned int}[uint16_t {aka unsigned int}]' for array subscript

   OCR1A = pgm_read_word(&ARR_OCR1A[data_Dvig.size_step][data_Dvig.rpm][data_Dvig.count_imp]);

 

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Я так понимаю ошибка заключается где-то здесь

const uint16_t* const ARR_OCR1A[] PROGMEM

в первых 3-х словах. Я пока с указателями не профессионал... 

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

Тебе нужно описать массив, но вместо того. чтобы тупо его вбить, ты придумываешь пять страниц какого-то бреда. Зачем?

uint8_t arr[2][2][2] = {{{1,2},{3,4}},{{5,6},{7,8}}};

 

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Идея, попробую. У меня просто два двумерных массивов по такому подобию оформлено, решил также трёхмерный сделать. Не. а кто-нибудь подскажет (так, чтобы знать) как оформить в PROGMEM трёхмерный массив как у меня

Logik
Offline
Зарегистрирован: 05.08.2014
Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

Крайне неудобно будет работать с такими данными.
Я бы все же посоветовал создать три массива.
Заодно и памяти сэкономишь

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Kakmyc пишет:
Крайне неудобно будет работать с такими данными. Я бы все же посоветовал создать три массива. Заодно и памяти сэкономишь
имели ввиду 3-х мерный массив? И как у любителя в программировании вопрос - как память экономится? У меня допустим три  двумерных массива оформлено примерно так:

//***************************************************************************
//----------------------------------------------------------------------------
const uint16_t TCNT1_full[] PROGMEM = {
 53036,  15536,  32203,  40536,  45536,  48869,  51250,  53036,  54425, 55536,  
 56445,  57203,  3998,   8393,   12203,  15536,  18477,  21092,  23431, 25536,  
 27441,  29172,  30753,  32203,  33536,  34767,  35906,  36965,  37950, 38869};  
//----------------------------------------------------------------------------
const uint16_t TCNT1_two[] PROGMEM = {
 15536,  40536,  48869,  53036,  55536,  57203,  8393,   15536,  21092, 25536,  
 29172,  32203,  34767,  36965,  38869,  40536,  42007,  43314,  44483, 45536,  
 46488,  47354,  48145,  48869,  49536,  50151,  50721,  51250,  51743, 52203};  
//----------------------------------------------------------------------------
const uint16_t TCNT1_four[] PROGMEM = {
 40536,  53036,  57203,  15536,  25536,  32203,  36965,  40536,  43314, 45536,  
 47354,  48869,  50151,  51250,  52203,  53036,  53771,  54425,  55010, 55536,  
 56012,  56445,  56840,  57203,  57536,  57844,  58129,  58393,  58639, 58869};  
//----------------------------------------------------------------------------
const uint16_t TCNT1_eight[] PROGMEM = {
 53036,  15536,  32203,  40536,  45536,  48869,  51250,  53036,  54425, 55536,  
 56445,  57203,  57844,  58393,  58869,  59286,  59654,  59980,  60273, 60536,  
 60774,  60991,  61188,  61369,  61536,  61690,  61832,  61965,  62088, 62203};  
//----------------------------------------------------------------------------
const uint16_t TCNT1_sixteen[] PROGMEM = {
 15536,  40536,  48869,  53036,  55536,  57203,  58393,  59286,  59980, 60536,  
 60991,  61369,  61690,  61965,  62203,  62411,  62595,  62758,  62904, 63036,  
 63155,  63263,  63362,  63453,  63536,  63613,  63684,  63750,  63812, 63869}; 

//===========================================================================================================
// МАССИВ МАССИВОВ TCNT1      ТАБЛИЦА ССЫЛОК
const uint16_t* const ARR_TCNT1[] PROGMEM = {TCNT1_full, TCNT1_two, TCNT1_four, TCNT1_eight, TCNT1_sixteen};
//===========================================================================================================

Тут есть различие в занимаемой памяти, если мою эту запись оформит как двумерный массив. Ведь вроде же выглядит почти как двумерный...

Но всё таки изначальный вопрос для меня не закрыт. Просто теперь очень много удалять типа:

const uint16_t OCR1A_sixteen_28[] PROGMEM = {

если оформлять как 3-х мерный массив...

и ещё в скобках ( {} ) не затеряться... Там значений 5 * 30 * 50 = 7500... :-(

 

Logik
Offline
Зарегистрирован: 05.08.2014

Подход из #1 имеет право на жизнь если длины массивов разные. Например описание многостраничного меню. Строка - сама по себе массив символов, но у каждой строки своя длина. Массив ссылок на строки - меню, одна его страница и тоже разное число позиций в каждой. Ну и все страницы многостраничного - массив ссылок на страницу. Тут будет экономия памяти, особенно если озаботится чтоб повторяющиеся в разных местах строки не дублировались. А если все массивы равные то трехмерный массив предпочтительней.

Про удобство - так если кумекаеш что пишешь - все удобно, а если нет так и нет.

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

А вам точно нужен трехмерный массив? Как логически связаны эти три набора данных?

b707
Онлайн
Зарегистрирован: 26.05.2017

AlexBajdin59rus пишет:

и ещё в скобках ( {} ) не затеряться... Там значений 5 * 30 * 50 = 7500... :-(

надеюсь вы не собираетесь набивать массив на 7500 элементов вручную?  Значения откуда берутся - наверно результат работы какой-то программы? - оформите вывод программы в виде .h файла и генерите его автоматом.

Тогда, кстати... не так и важно будет, как вы массив оформите - как кучу одномерных или двумерных... или один трехмерный - набивать все равно программе, а не вам

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Подход из #1 имеет право на жизнь если длины массивов разные. Например описание многостраничного меню. Строка - сама по себе массив символов, но у каждой строки своя длина. Массив ссылок на строки - меню, одна его страница и тоже разное число позиций в каждой. Ну и все страницы многостраничного - массив ссылок на страницу. Тут будет экономия памяти, особенно если озаботится чтоб повторяющиеся в разных местах строки не дублировались. А если все массивы равные то трехмерный массив предпочтительней.

Про удобство - так если кумекаеш что пишешь - все удобно, а если нет так и нет.

ТУТ ПОНЯЛ, ВСЁ ЯСНО.

А вам точно нужен трехмерный массив? Как логически связаны эти три набора данных?

ЛОГИЧЕСКАЯ СВЯЗЬ ТАКОВА: 5 РЕЖИМОВ МИКРОШАГА ДИГАТЕЛЯ, 30 ЗНАЧЕНИЙ ОБОРОТОВ В СЕКУНДУ, 50 ЗНАЧЕНИЙ РЕГИСТРА OCR1A - ИТОГ ARR_OCR1A[5][30][50]

надеюсь вы не собираетесь набивать массив на 7500 элементов вручную?  Значения откуда берутся - наверно результат работы какой-то программы? - оформите вывод программы в виде .h файла и генерите его автоматом.

ДА, ТАК И СДЕЛАНО, ВСЁ ВЫСЧИТЫВАЕТСЯ, ВЫВОДИТСЯ ЧЕРЕЗ МОНИТОР ПОРТА, ОТТУДА КОПИРУЮ УЖЕ В ДРУГОЙ СКЕТЧ. ПРИМЕРНО ТАК:

// МАССИВЫ ЗНАЧЕНИЙ ПРИ ШАГЕ FULL 
//const uint16_t OCR1A_full_1[] PROGMEM = 
{53161,  53286,  53411,  53536,  53661,  53786,  53911,  54036,  54161, 54286,  
 54411,  54536,  54661,  54786,  54911,  55036,  55161,  55286,  55411, 55536,  
 55661,  55786,  55911,  56036,  56161,  56286,  56411,  56536,  56661, 56786,  
 56911,  57036,  57161,  57286,  57411,  57536,  57661,  57786,  57911, 58036,  
 58161,  58286,  58411,  58536,  58661,  58786,  58911,  59036,  59161, 59286};  
 
const uint16_t OCR1A_full_2[] PROGMEM = {
 16036,  16536,  17036,  17536,  18036,  18536,  19036,  19536,  20036, 20536,  
 21036,  21536,  22036,  22536,  23036,  23536,  24036,  24536,  25036, 25536,  
 26036,  26536,  27036,  27536,  28036,  28536,  29036,  29536,  30036, 30536,  
 31036,  31536,  32036,  32536,  33036,  33536,  34036,  34536,  35036, 35536,  
 36036,  36536,  37036,  37536,  38036,  38536,  39036,  39536,  40036, 40536};  
 
const uint16_t OCR1A_full_3[] PROGMEM = {
 32536,  32870,  33203,  33536,  33870,  34203,  34536,  34870,  35203, 35536,  
 35870,  36203,  36536,  36870,  37203,  37536,  37870,  38203,  38536, 38870,  
 39203,  39536,  39870,  40203,  40536,  40870,  41203,  41536,  41870, 42203,  
 42536,  42870,  43203,  43536,  43870,  44203,  44536,  44870,  45203, 45536,  
 45870,  46203,  46536,  46870,  47203,  47536,  47870,  48203,  48536, 48870};  
 
const uint16_t OCR1A_full_4[] PROGMEM = {
 40786,  41036,  41286,  41536,  41786,  42036,  42286,  42536,  42786, 43036,  
 43286,  43536,  43786,  44036,  44286,  44536,  44786,  45036,  45286, 45536,  
 45786,  46036,  46286,  46536,  46786,  47036,  47286,  47536,  47786, 48036,  
 48286,  48536,  48786,  49036,  49286,  49536,  49786,  50036,  50286, 50536,  
 50786,  51036,  51286,  51536,  51786,  52036,  52286,  52536,  52786, 53036};  
 
const uint16_t OCR1A_full_5[] PROGMEM = {
 45736,  45936,  46136,  46336,  46536,  46736,  46936,  47136,  47336, 47536,  
 47736,  47936,  48136,  48336,  48536,  48736,  48936,  49136,  49336, 49536,  
 49736,  49936,  50136,  50336,  50536,  50736,  50936,  51136,  51336, 51536,  
 51736,  51936,  52136,  52336,  52536,  52736,  52936,  53136,  53336, 53536,  
 53736,  53936,  54136,  54336,  54536,  54736,  54936,  55136,  55336, 55536};  
 
const uint16_t OCR1A_full_6[] PROGMEM = {
 49036,  49202,  49369,  49536,  49702,  49869,  50036,  50202,  50369, 50536,  
 50702,  50869,  51036,  51202,  51369,  51536,  51702,  51869,  52036, 52202,  
 52369,  52536,  52702,  52869,  53036,  53202,  53369,  53536,  53702, 53869,  
 54036,  54202,  54369,  54536,  54702,  54869,  55036,  55202,  55369, 55536,  
 55702,  55869,  56036,  56202,  56369,  56536,  56702,  56869,  57036, 57203};  
 
const uint16_t OCR1A_full_7[] PROGMEM = {
 51393,  51536,  51679,  51821,  51964,  52107,  52250,  52393,  52536, 52679,  
 52821,  52964,  53107,  53250,  53393,  53536,  53679,  53821,  53964, 54107,  
 54250,  54393,  54536,  54679,  54822,  54964,  55107,  55250,  55393, 55536,  
 55679,  55822,  55964,  56107,  56250,  56393,  56536,  56679,  56822, 56964,  
 57107,  57250,  57393,  57536,  57679,  57822,  57964,  58107,  58250, 58393};  
 
const uint16_t OCR1A_full_8[] PROGMEM = {
 53161,  53286,  53411,  53536,  53661,  53786,  53911,  54036,  54161, 54286,  
 54411,  54536,  54661,  54786,  54911,  55036,  55161,  55286,  55411, 55536,  
 55661,  55786,  55911,  56036,  56161,  56286,  56411,  56536,  56661, 56786,  
 56911,  57036,  57161,  57286,  57411,  57536,  57661,  57786,  57911, 58036,  
 58161,  58286,  58411,  58536,  58661,  58786,  58911,  59036,  59161, 59286};  
 
const uint16_t OCR1A_full_9[] PROGMEM = {
 54536,  54647,  54758,  54869,  54981,  55092,  55203,  55314,  55425, 55536,  
 55647,  55758,  55869,  55981,  56092,  56203,  56314,  56425,  56536, 56647,  
 56758,  56869,  56981,  57092,  57203,  57314,  57425,  57536,  57647, 57758,  
 57869,  57981,  58092,  58203,  58314,  58425,  58536,  58647,  58758, 58869,  
 58981,  59092,  59203,  59314,  59425,  59536,  59647,  59758,  59869, 59981};  
 
const uint16_t OCR1A_full_10[] PROGMEM = {
 55636,  55736,  55836,  55936,  56036,  56136,  56236,  56336,  56436, 56536,  
 56636,  56736,  56836,  56936,  57036,  57136,  57236,  57336,  57436, 57536,  
 57636,  57736,  57836,  57936,  58036,  58136,  58236,  58336,  58436, 58536,  
 58636,  58736,  58836,  58936,  59036,  59136,  59236,  59336,  59436, 59536,  
 59636,  59736,  59836,  59936,  60036,  60136,  60236,  60336,  60436, 60536};  
 
const uint16_t OCR1A_full_11[] PROGMEM = {
 56536,  56627,  56718,  56809,  56900,  56990,  57081,  57172,  57263, 57354,  
 57445,  57536,  57627,  57718,  57809,  57900,  57990,  58081,  58172, 58263,  
 58354,  58445,  58536,  58627,  58718,  58809,  58900,  58990,  59081, 59172,  
 59263,  59354,  59445,  59536,  59627,  59718,  59809,  59900,  59990, 60081,  
 60172,  60263,  60354,  60445,  60536,  60627,  60718,  60809,  60900, 60991};  
 
const uint16_t OCR1A_full_12[] PROGMEM = {
 57286,  57370,  57453,  57536,  57620,  57703,  57786,  57870,  57953, 58036,  
 58120,  58203,  58286,  58370,  58453,  58536,  58620,  58703,  58786, 58870,  
 58953,  59036,  59120,  59203,  59286,  59370,  59453,  59536,  59620, 59703,  
 59786,  59870,  59953,  60036,  60120,  60203,  60286,  60370,  60453, 60536,  
 60620,  60703,  60786,  60870,  60953,  61036,  61120,  61203,  61286, 61370};  
 
const uint16_t OCR1A_full_13[] PROGMEM = {
 4613,   5229,   5844,   6460,   7075,   7690,   8306,   8921,   9536,  10152,  
 10767,  11383,  11998,  12613,  13229,  13844,  14459,  15075,  15690, 16306,  
 16921,  17536,  18152,  18767,  19383,  19998,  20613,  21229,  21844, 22459,  
 23075,  23690,  24306,  24921,  25536,  26152,  26767,  27382,  27998, 28613,  
 29229,  29844,  30459,  31075,  31690,  32305,  32921,  33536,  34152, 34767};  
 
const uint16_t OCR1A_full_14[] PROGMEM = {
 8964,   9536,   10107,  10679,  11250,  11822,  12393,  12964,  13536, 14107,  
 14679,  15250,  15822,  16393,  16964,  17536,  18107,  18679,  19250, 19822,  
 20393,  20964,  21536,  22107,  22679,  23250,  23822,  24393,  24964, 25536,  
 26107,  26679,  27250,  27822,  28393,  28964,  29536,  30107,  30679, 31250,  
 31822,  32393,  32964,  33536,  34107,  34679,  35250,  35822,  36393, 36965};  
 
const uint16_t OCR1A_full_15[] PROGMEM = {
 12736,  13270,  13803,  14336,  14870,  15403,  15936,  16470,  17003, 17536,  
 18070,  18603,  19136,  19670,  20203,  20736,  21270,  21803,  22336, 22870,  
 23403,  23936,  24470,  25003,  25536,  26070,  26603,  27136,  27670, 28203,  
 28736,  29270,  29803,  30336,  30870,  31403,  31936,  32470,  33003, 33536,  
 34070,  34603,  35136,  35670,  36203,  36736,  37270,  37803,  38336, 38870};  
 
const uint16_t OCR1A_full_16[] PROGMEM = {
 16036,  16536,  17036,  17536,  18036,  18536,  19036,  19536,  20036, 20536,  
 21036,  21536,  22036,  22536,  23036,  23536,  24036,  24536,  25036, 25536,  
 26036,  26536,  27036,  27536,  28036,  28536,  29036,  29536,  30036, 30536,  
 31036,  31536,  32036,  32536,  33036,  33536,  34036,  34536,  35036, 35536,  
 36036,  36536,  37036,  37536,  38036,  38536,  39036,  39536,  40036, 40536};  
 
const uint16_t OCR1A_full_17[] PROGMEM = {
 18948,  19418,  19889,  20359,  20830,  21301,  21771,  22242,  22712, 23183,  
 23653,  24124,  24595,  25065,  25536,  26006,  26477,  26948,  27418, 27889,  
 28359,  28830,  29301,  29771,  30242,  30712,  31183,  31654,  32124, 32595,  
 33065,  33536,  34006,  34477,  34948,  35418,  35889,  36359,  36830, 37301,  
 37771,  38242,  38712,  39183,  39654,  40124,  40595,  41065,  41536, 42007};  
 
const uint16_t OCR1A_full_18[] PROGMEM = {
 21536,  21981,  22425,  22870,  23314,  23759,  24203,  24648,  25092, 25536,  
 25981,  26425,  26870,  27314,  27759,  28203,  28647,  29092,  29536, 29981,  
 30425,  30870,  31314,  31759,  32203,  32647,  33092,  33536,  33981, 34425,  
 34870,  35314,  35759,  36203,  36647,  37092,  37536,  37981,  38425, 38870,  
 39314,  39758,  40203,  40647,  41092,  41536,  41981,  42425,  42870, 43314};  
 
const uint16_t OCR1A_full_19[] PROGMEM = {
 23852,  24273,  24694,  25115,  25536,  25957,  26378,  26799,  27220, 27642,  
 28063,  28484,  28905,  29326,  29747,  30168,  30589,  31010,  31431, 31852,  
 32273,  32694,  33115,  33536,  33957,  34378,  34799,  35220,  35641, 36063,  
 36484,  36905,  37326,  37747,  38168,  38589,  39010,  39431,  39852, 40273,  
 40694,  41115,  41536,  41957,  42378,  42799,  43220,  43641,  44062, 44484};  
 
const uint16_t OCR1A_full_20[] PROGMEM = {
 25936,  26336,  26736,  27136,  27536,  27936,  28336,  28736,  29136, 29536,  
 29936,  30336,  30736,  31136,  31536,  31936,  32336,  32736,  33136, 33536,  
 33936,  34336,  34736,  35136,  35536,  35936,  36336,  36736,  37136, 37536,  
 37936,  38336,  38736,  39136,  39536,  39936,  40336,  40736,  41136, 41536,  
 41936,  42336,  42736,  43136,  43536,  43936,  44336,  44736,  45136, 45536};  
 
const uint16_t OCR1A_full_21[] PROGMEM = {
 27822,  28203,  28584,  28965,  29346,  29727,  30108,  30489,  30870, 31251,  
 31631,  32012,  32393,  32774,  33155,  33536,  33917,  34298,  34679, 35060,  
 35441,  35822,  36203,  36584,  36965,  37346,  37727,  38108,  38489, 38870,  
 39250,  39631,  40012,  40393,  40774,  41155,  41536,  41917,  42298, 42679,  
 43060,  43441,  43822,  44203,  44584,  44965,  45346,  45727,  46108, 46489};  
 
const uint16_t OCR1A_full_22[] PROGMEM = {
 29536,  29899,  30263,  30627,  30990,  31354,  31717,  32081,  32445, 32808,  
 33172,  33536,  33899,  34263,  34627,  34990,  35354,  35718,  36081, 36445,  
 36808,  37172,  37536,  37899,  38263,  38627,  38990,  39354,  39718, 40081,  
 40445,  40808,  41172,  41536,  41899,  42263,  42627,  42990,  43354, 43718,  
 44081,  44445,  44809,  45172,  45536,  45899,  46263,  46627,  46990, 47354};  
 
const uint16_t OCR1A_full_23[] PROGMEM = {
 31101,  31449,  31796,  32144,  32492,  32840,  33188,  33536,  33883, 34231,  
 34579,  34927,  35275,  35623,  35970,  36318,  36666,  37014,  37362, 37710,  
 38057,  38405,  38753,  39101,  39449,  39797,  40144,  40492,  40840, 41188,  
 41536,  41884,  42231,  42579,  42927,  43275,  43623,  43971,  44318, 44666,  
 45014,  45362,  45710,  46058,  46405,  46753,  47101,  47449,  47797, 48145};  
 
const uint16_t OCR1A_full_24[] PROGMEM = {
 32536,  32870,  33203,  33536,  33870,  34203,  34536,  34870,  35203, 35536,  
 35870,  36203,  36536,  36870,  37203,  37536,  37870,  38203,  38536, 38870,  
 39203,  39536,  39870,  40203,  40536,  40870,  41203,  41536,  41870, 42203,  
 42536,  42870,  43203,  43536,  43870,  44203,  44536,  44870,  45203, 45536,  
 45870,  46203,  46536,  46870,  47203,  47536,  47870,  48203,  48536, 48870};  
 
const uint16_t OCR1A_full_25[] PROGMEM = {
 33856,  34176,  34496,  34816,  35136,  35456,  35776,  36096,  36416, 36736,  
 37056,  37376,  37696,  38016,  38336,  38656,  38976,  39296,  39616, 39936,  
 40256,  40576,  40896,  41216,  41536,  41856,  42176,  42496,  42816, 43136,  
 43456,  43776,  44096,  44416,  44736,  45056,  45376,  45696,  46016, 46336,  
 46656,  46976,  47296,  47616,  47936,  48256,  48576,  48896,  49216, 49536};  
 
const uint16_t OCR1A_full_26[] PROGMEM = {
 35075,  35382,  35690,  35998,  36305,  36613,  36921,  37229,  37536, 37844,  
 38152,  38459,  38767,  39075,  39382,  39690,  39998,  40305,  40613, 40921,  
 41228,  41536,  41844,  42152,  42459,  42767,  43075,  43382,  43690, 43998,  
 44305,  44613,  44921,  45228,  45536,  45844,  46152,  46459,  46767, 47075,  
 47382,  47690,  47998,  48305,  48613,  48921,  49228,  49536,  49844, 50152};  
 
const uint16_t OCR1A_full_27[] PROGMEM = {
 36202,  36499,  36795,  37091,  37388,  37684,  37980,  38276,  38573, 38869,  
 39165,  39462,  39758,  40054,  40351,  40647,  40943,  41239,  41536, 41832,  
 42128,  42425,  42721,  43017,  43313,  43610,  43906,  44202,  44499, 44795,  
 45091,  45388,  45684,  45980,  46277,  46573,  46869,  47165,  47462, 47758,  
 48054,  48351,  48647,  48943,  49239,  49536,  49832,  50128,  50425, 50721};  
 
const uint16_t OCR1A_full_28[] PROGMEM = {
 37251,  37536,  37822,  38108,  38394,  38679,  38965,  39251,  39536, 39822,  
 40108,  40394,  40679,  40965,  41251,  41536,  41822,  42108,  42393, 42679,  
 42965,  43251,  43536,  43822,  44108,  44393,  44679,  44965,  45251, 45536,  
 45822,  46108,  46393,  46679,  46965,  47251,  47536,  47822,  48108, 48393,  
 48679,  48965,  49251,  49536,  49822,  50108,  50393,  50679,  50965, 51251};  
 
const uint16_t OCR1A_full_29[] PROGMEM = {
 38226,  38502,  38778,  39053,  39329,  39605,  39881,  40157,  40433, 40709,  
 40984,  41260,  41536,  41812,  42088,  42364,  42640,  42915,  43191, 43467,  
 43743,  44019,  44295,  44571,  44846,  45122,  45398,  45674,  45950, 46226,  
 46502,  46778,  47053,  47329,  47605,  47881,  48157,  48433,  48709, 48984,  
 49260,  49536,  49812,  50088,  50364,  50640,  50915,  51191,  51467, 51743};  
 
const uint16_t OCR1A_full_30[] PROGMEM = {
 39136,  39402,  39669,  39936,  40202,  40469,  40736,  41002,  41269, 41536,  
 41802,  42069,  42336,  42602,  42869,  43136,  43402,  43669,  43936, 44202,  
 44469,  44736,  45002,  45269,  45536,  45802,  46069,  46336,  46602, 46869,  
 47136,  47402,  47669,  47936,  48202,  48469,  48736,  49002,  49269, 49536,  
 49802,  50069,  50336,  50602,  50869,  51136,  51402,  51669,  51936, 52203}; 

И ЭТОГО ДЕЙСТВИТЕЛЬНО ОЧЕНЬ МНОГО ЧТОБ ТЕПЕРЬ ВРУЧНУЮ ИСПРАВИТЬ ПОД ОБЫЧНЫЙ 3-Х МЕРНЫЙ МАССИВ

ЧТОБ ВЫВЕСТИ 3-Х МЕРНЫЙ МАССИВ В МОНИТОР, НУЖНО ПЕРЕПИСЫВАТЬ ПРОГРАММУ... Я И ТАК ЕЁ ДОЛГО ПИСАЛ, ЗАПУТАЕШЬСЯ ТАМ... ВОТ И НУЖНО МНЕ ТО, ЧТО ЧТО Я ЗАДАЛ ИЗНАЧАЛЬНО... ЕСТЬ У КОГО ОПЫТ РЕШЕНИЯ МОЕГО ПЕРВОГО ВОПРОСА?

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

b707 пишет:

оформите вывод программы в виде .h файла и генерите его автоматом.

Значения хранятся в cpp. В .h декларации.

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

ДА, ОНИ У МЕНЯ В .H ФАЙЛЕ

 

b707
Онлайн
Зарегистрирован: 26.05.2017

rkit пишет:

Значения хранятся в cpp. В .h декларации.

Совершенно необязательно. Если .h файл включается строго в одну компилируемую единицу, в нем могут быть и значения.

Пример - шрифты сплошь и рядом храняться в .h файлах, а внутри точно такие же массивы в ПРОГМЕМ.

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

Ну конечно же не обязательно. Если хочется себе сделать жизнь сложнее - делай как хочешь.

Logik
Offline
Зарегистрирован: 05.08.2014

AlexBajdin59rus пишет:

И ЭТОГО ДЕЙСТВИТЕЛЬНО ОЧЕНЬ МНОГО ЧТОБ ТЕПЕРЬ ВРУЧНУЮ ИСПРАВИТЬ ПОД ОБЫЧНЫЙ 3-Х МЕРНЫЙ МАССИВ

Ей богу, детский сад! Автозамену в текстовом редакторе не знаете?

ПС. Не пишите крупно и жирно, здесь и так читают, просто ваша проблема не понятна, т.к. решение её очевидно.

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

В Ардуино не знаю про автозамену. Боюсь запутаться, когда буду исправлять под 3-х мерный массив. Жирно писал, чтоб ответить 3-м людям, цитирование только одному получатся. Решение очевидное как вариант, предполагаю не единственный, поэтому ещё раз повторю вопрос: можно ли оформить код как по моему первому посту, есть кто знает как создать так называемую таблицу ссылок на ссылки (как-то вроде так...) подобие 3-х мерного массива или это невозможно синтаксически и тогда давайте закроем тему?

Добавлено - автозамену нашёл )

Logik
Offline
Зарегистрирован: 05.08.2014

AlexBajdin59rus пишет:

Добавлено - автозамену нашёл )

Так уже и не надо массив ссылок на ссылки? 

Делается не сложно. Вот рабочий вариант двумерного. Т.е. массив ссылок на массив.

const char NameMode0[] PROGMEM ="Старт";
const char NameMode1[] PROGMEM ="Жду Температуру";
const char NameMode2[] PROGMEM ="Есть температура";
const char NameMode3[] PROGMEM ="Проверка нагрева";
const char NameMode4[] PROGMEM ="   Нагрев";
const char NameMode5[] PROGMEM ="  Закипает";
const char NameMode6[] PROGMEM ="  Вскипел";
const char NameMode7[] PROGMEM ="    Перегон !";
const char NameMode8[] PROGMEM ="      Стоп !";
const char NameMode9[] PROGMEM =" Остываеет";

PGM_P const NameMode[] PROGMEM = { NameMode0, NameMode1, NameMode2, NameMode3, NameMode4,
    NameMode5, NameMode6, NameMode7, NameMode8, NameMode9};

Массив ссылок на массивы ссылок - ну чтототипа PGM_P const ArrNM[] PROGMEM = { NameMode, NameModeA,.....

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

Ладно, сделал такое:

// массив ARR[3][2][3];

const uint16_t full_1[] PROGMEM = {1,1,1};
const uint16_t full_2[] PROGMEM = {2,2,2};

const uint16_t two_1[] PROGMEM = {3,3,3};
const uint16_t two_2[] PROGMEM = {4,4,4};

const uint16_t four_1[] PROGMEM = {5,5,5};
const uint16_t four_2[] PROGMEM = {6,6,6};

const uint16_t full[] PROGMEM = {full_1, full_2};
const uint16_t two[] PROGMEM = {two_1, two_2};
const uint16_t four[] PROGMEM = {four_1, four_2};

const uint16_t ARR[] PROGMEM = {full, two, four};

как теперь мне присвоить переменной var значение из массива, как синтаксически написать?

uint16_t var;
  var = ARR[0][0][0];

не выходит...

 

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

Ты вставил указатели на массивы, а не их содержимое. Эта хрень работать не будет.  Такого синтаксиса "склейки" массивов в языке нет.

AlexBajdin59rus
Offline
Зарегистрирован: 17.12.2019

подскажите правильный синтаксис. ну вот на моих массивах. 

 

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

rkit пишет:

Тебе нужно описать массив, но вместо того. чтобы тупо его вбить, ты придумываешь пять страниц какого-то бреда. Зачем?

uint8_t arr[2][2][2] = {{{1,2},{3,4}},{{5,6},{7,8}}};

 

Logik
Offline
Зарегистрирован: 05.08.2014

AlexBajdin59rus пишет:

подскажите правильный синтаксис. ну вот на моих массивах. 

 

типа такого

PGM_P p;
memcpy_P(&p, &ARR[i], sizeof(PGM_P));
 
 

потом по ссылке извлекаешь аналогично следующую ссылку, потом уже и значение массива.