Помогите начинающему с кодом
- Войдите на сайт для отправки комментариев
Сб, 23/07/2016 - 14:45
есть код работающей для ардуино дуэ, углубляться не буду, но проблема вот в чем. Созданы одномерные массивы:
const int n;
int A[n], B[n];
Вопрос следующий как изменить n при работе через командное окно в ардуино айде при общении с платой,
или же как изменить тип n с const int просто на int при изменении выдает ошибку в массивах.
Статические массивы вы таким образом ("при работе через командное окно в ардуино айде при общении с платой") не измените. Если вам нужно динамически менять размер массива - массив должен быть динамическим, т.е. выделяться при помощи malloc или new, удаляться при помощи free или delete.
Как-то так, навскидку:
Писал навскидку, не компилировал, кусок кода предназначен лишь для демонстрации подхода.
Добрый день! Имеется проблемка, пытаюсь написать Gui на ардуино и фишка в чем:
Имеется несколько массивов, которые содержат варианты или пункты подругому
например массив String Menu[] = {"Screen OFF", "Help", "Time", "Test", "", "Scan Net", "Test Alarm", "", "", " Time Alarm", "" };
и мне необходимо узнать длину массива, вроде все просто Menu.length и все
Однако учитывая что в меню 10 пунктов (11 пункт холостой, пустой), то в общем получится около 11 массивов... Поэтому я хочу собрать их все в один стэк или лист используя struct но тогда усложняется чтение длины... есть более простой вариант использовать двумерный массив, однако нет уверености что все 11 массивов будут использовать один и тот же тип данных
И еще, вывод информации на экран опирается на переменную MenuS которая является эдаким номером страницы а именно:
-1 = выключен дисплей 0 = меню (выводит MenuS) 1 = Help 2 = страница настройки времени и тд.
тоестькогда мы находимся в меню MenuS = 0; и выбираем пункт ScreenOff у нас отключается дисплей и MenuS становится -1
после нажатия кнопки(ввода) с отключеным дисплеем MenuS становится 0 и процедура ScreenOff выводит основываясь на значении MenuS определенную картинку, в данном случае наше меню (String Menu[]) а отображение пунктов происходит в зависимости от положения подстроечного резистора, поэтому в функции ScreenUp что бы понять какой пункт показать считываются показания резистора и переводится в пункты:
punkt = map(analogRead(A0), 0, 1022, 0, GUI.MenuP.length);
где GUI.MenuP.length ожидаемая длина массива MenuP
вот описание листа
Благодарю за ответ, но это ведь сработает в случае, когда количество ячеек массива увеличивается, в противном случае ему некуда будет записывать? И насколько я понял там происходит копирование из старого в новый, не совсем, возможно, правильно изложил проблему, мне нужно без сохранения данных изменить кол-во ячеек массива с помощью меню (serial.print/println) , но у меня не работает в программе создание массива через просто int размерность, он требует, чтобы размерность массива была const int в связи с этим упираюсь и не могу изменить с помощью клавиатуры.
Я вам написал код, который может как увеличивать, так и уменьшать размер массива. Как создавать динамический массив - там тоже есть. У вас проблемы понять, что делает тот или иной кусок? Спрашивайте - отвечу.
у меня не работает в программе создание массива через просто int размерность, он требует, чтобы размерность массива была const int в связи с этим упираюсь и не могу изменить с помощью клавиатуры.
Правильно требует. Иначе просто не может быть.
Вот смотрите:
У нас в памяти будут раположены подряд 4 двухбайтовые ячейки памяти, в первых трех разместиться массив, а в четвертой - простая переменная b.
Что должна сделать программа, чтобы увеличить размерность массива до 4, если то место, где должен быть четвертый элемент массива, уже занять переменной b?
Поэтому размеры статических массивов изменять невозможно.
Если требуется массив с изменяемым размером, описывается указатель на массив, а потом этому указателю выделяется память.
Увеличение размера массива при этом делается в 5 шагов:
1. Создаем временный указатель.
2. Выделяем ему нужное количество памяти.
3. Копируем содержимое старого массива в новый.
4. Освобождесм мамять старого массива.
5. Присваиваем основному указателю на массив значение нового указателя.
При этом необходимо учитывать, возникают нежелательные побочные эффекты:
1. Требуется удвоенное количество памяти.
2. Происходит фрагментация памяти. Например, оказывается, что общий объем доступной памяти, скажем 800 байт, но выделить 200 байт невозможно, т.к. память состоит из нескольких фрагментов, каждый из которых меньше 200 байт.
мне нужно без сохранения данных изменить кол-во ячеек массива
В этом случае достаточно всего двух шагов:
1. Освобождение памяти.
2. Выделение нового фрагмента.
Если освобождаемая память выделялась последней, фрагментации памяти не происходит.