Как правильно синтаксически создать во flash МАССИВ МАССИВА МАССИВОВ
- Войдите на сайт для отправки комментариев
Всем привет! Вот столкнулся с такой задачей: значения высчитал, теперь эти значения нужно записать во флеш-память, но не знаю как это синтаксически правильно сделать. Итак, есть 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
КТО ПОДСКАЖЕТ ПРАВИЛЬНОСТЬ ОФОРМЛЕНИЯ?
СПАСИБО!
А памяти-то хватит?
памяти хватает АРДУИНО МЕГА пользуюсь. Подскажите про синтаксис
Пишет типа такого (с первым вариантом определения -
const
uint16_t*
const
ARR_OCR1A)
Я так понимаю ошибка заключается где-то здесь
в первых 3-х словах. Я пока с указателями не профессионал...
Тебе нужно описать массив, но вместо того. чтобы тупо его вбить, ты придумываешь пять страниц какого-то бреда. Зачем?
Идея, попробую. У меня просто два двумерных массивов по такому подобию оформлено, решил также трёхмерный сделать. Не. а кто-нибудь подскажет (так, чтобы знать) как оформить в PROGMEM трёхмерный массив как у меня
http://arduino.ru/forum/otvlechennye-temy/shifrovanie-v-arduino#comment-... стр.90
Крайне неудобно будет работать с такими данными.
Я бы все же посоветовал создать три массива.
Заодно и памяти сэкономишь
Тут есть различие в занимаемой памяти, если мою эту запись оформит как двумерный массив. Ведь вроде же выглядит почти как двумерный...
Но всё таки изначальный вопрос для меня не закрыт. Просто теперь очень много удалять типа:
если оформлять как 3-х мерный массив...
и ещё в скобках ( {} ) не затеряться... Там значений 5 * 30 * 50 = 7500... :-(
Подход из #1 имеет право на жизнь если длины массивов разные. Например описание многостраничного меню. Строка - сама по себе массив символов, но у каждой строки своя длина. Массив ссылок на строки - меню, одна его страница и тоже разное число позиций в каждой. Ну и все страницы многостраничного - массив ссылок на страницу. Тут будет экономия памяти, особенно если озаботится чтоб повторяющиеся в разных местах строки не дублировались. А если все массивы равные то трехмерный массив предпочтительней.
Про удобство - так если кумекаеш что пишешь - все удобно, а если нет так и нет.
А вам точно нужен трехмерный массив? Как логически связаны эти три набора данных?
и ещё в скобках ( {} ) не затеряться... Там значений 5 * 30 * 50 = 7500... :-(
надеюсь вы не собираетесь набивать массив на 7500 элементов вручную? Значения откуда берутся - наверно результат работы какой-то программы? - оформите вывод программы в виде .h файла и генерите его автоматом.
Тогда, кстати... не так и важно будет, как вы массив оформите - как кучу одномерных или двумерных... или один трехмерный - набивать все равно программе, а не вам
Подход из #1 имеет право на жизнь если длины массивов разные. Например описание многостраничного меню. Строка - сама по себе массив символов, но у каждой строки своя длина. Массив ссылок на строки - меню, одна его страница и тоже разное число позиций в каждой. Ну и все страницы многостраничного - массив ссылок на страницу. Тут будет экономия памяти, особенно если озаботится чтоб повторяющиеся в разных местах строки не дублировались. А если все массивы равные то трехмерный массив предпочтительней.
Про удобство - так если кумекаеш что пишешь - все удобно, а если нет так и нет.
ТУТ ПОНЯЛ, ВСЁ ЯСНО.
А вам точно нужен трехмерный массив? Как логически связаны эти три набора данных?
ЛОГИЧЕСКАЯ СВЯЗЬ ТАКОВА: 5 РЕЖИМОВ МИКРОШАГА ДИГАТЕЛЯ, 30 ЗНАЧЕНИЙ ОБОРОТОВ В СЕКУНДУ, 50 ЗНАЧЕНИЙ РЕГИСТРА OCR1A - ИТОГ ARR_OCR1A[5][30][50]
надеюсь вы не собираетесь набивать массив на 7500 элементов вручную? Значения откуда берутся - наверно результат работы какой-то программы? - оформите вывод программы в виде .h файла и генерите его автоматом.
ДА, ТАК И СДЕЛАНО, ВСЁ ВЫСЧИТЫВАЕТСЯ, ВЫВОДИТСЯ ЧЕРЕЗ МОНИТОР ПОРТА, ОТТУДА КОПИРУЮ УЖЕ В ДРУГОЙ СКЕТЧ. ПРИМЕРНО ТАК:
И ЭТОГО ДЕЙСТВИТЕЛЬНО ОЧЕНЬ МНОГО ЧТОБ ТЕПЕРЬ ВРУЧНУЮ ИСПРАВИТЬ ПОД ОБЫЧНЫЙ 3-Х МЕРНЫЙ МАССИВ
ЧТОБ ВЫВЕСТИ 3-Х МЕРНЫЙ МАССИВ В МОНИТОР, НУЖНО ПЕРЕПИСЫВАТЬ ПРОГРАММУ... Я И ТАК ЕЁ ДОЛГО ПИСАЛ, ЗАПУТАЕШЬСЯ ТАМ... ВОТ И НУЖНО МНЕ ТО, ЧТО ЧТО Я ЗАДАЛ ИЗНАЧАЛЬНО... ЕСТЬ У КОГО ОПЫТ РЕШЕНИЯ МОЕГО ПЕРВОГО ВОПРОСА?
оформите вывод программы в виде .h файла и генерите его автоматом.
Значения хранятся в cpp. В .h декларации.
ДА, ОНИ У МЕНЯ В .H ФАЙЛЕ
Значения хранятся в cpp. В .h декларации.
Совершенно необязательно. Если .h файл включается строго в одну компилируемую единицу, в нем могут быть и значения.
Пример - шрифты сплошь и рядом храняться в .h файлах, а внутри точно такие же массивы в ПРОГМЕМ.
Ну конечно же не обязательно. Если хочется себе сделать жизнь сложнее - делай как хочешь.
И ЭТОГО ДЕЙСТВИТЕЛЬНО ОЧЕНЬ МНОГО ЧТОБ ТЕПЕРЬ ВРУЧНУЮ ИСПРАВИТЬ ПОД ОБЫЧНЫЙ 3-Х МЕРНЫЙ МАССИВ
Ей богу, детский сад! Автозамену в текстовом редакторе не знаете?
ПС. Не пишите крупно и жирно, здесь и так читают, просто ваша проблема не понятна, т.к. решение её очевидно.
В Ардуино не знаю про автозамену. Боюсь запутаться, когда буду исправлять под 3-х мерный массив. Жирно писал, чтоб ответить 3-м людям, цитирование только одному получатся. Решение очевидное как вариант, предполагаю не единственный, поэтому ещё раз повторю вопрос: можно ли оформить код как по моему первому посту, есть кто знает как создать так называемую таблицу ссылок на ссылки (как-то вроде так...) подобие 3-х мерного массива или это невозможно синтаксически и тогда давайте закроем тему?
Добавлено - автозамену нашёл )
Добавлено - автозамену нашёл )
Так уже и не надо массив ссылок на ссылки?
Делается не сложно. Вот рабочий вариант двумерного. Т.е. массив ссылок на массив.
Массив ссылок на массивы ссылок - ну чтототипа PGM_P const ArrNM[] PROGMEM = { NameMode, NameModeA,.....
Ладно, сделал такое:
как теперь мне присвоить переменной var значение из массива, как синтаксически написать?
не выходит...
Ты вставил указатели на массивы, а не их содержимое. Эта хрень работать не будет. Такого синтаксиса "склейки" массивов в языке нет.
подскажите правильный синтаксис. ну вот на моих массивах.
Тебе нужно описать массив, но вместо того. чтобы тупо его вбить, ты придумываешь пять страниц какого-то бреда. Зачем?
подскажите правильный синтаксис. ну вот на моих массивах.
типа такого
потом по ссылке извлекаешь аналогично следующую ссылку, потом уже и значение массива.