Инт в Лонг, инкрементация... Ты чего хочешь - штоп в структуре указатель на int x был? Ну так объяви в ней указатель и передай адрес при инициализации экземпляра структуры.
Слушайте, без задачи мы, возможно говорим о разных сторонах слона.
Объясните толком, что это за "x"? Он один на всех? В том смысле, что если в программе 100500 экземпляров myStruct, то при инкрементировании "c" в любом из них, этот х должен тоже инкрементироваться? Так? Или как?
Кстати, что там делает typedef? Он не нужен, а если бы и был нужен, то он не так вводится.
Нет, в этом случае указатель не надо. Коль скоро переменная одна на всех, то пусть она одна и остаётся (и одна только память жрёт). А с указателем у Вас будет память жраться на переменную и на указатели во всех элементах - намного больше.
Это делается примерно так:
1. В саму структуру добавляете статическое поле
struct Kaka {
...
static int x = 0;
...
};
далее в функциях перехода пишем так:
struct Kaka {
...
static int x = 0;
...
void moveUp() {
if (prev == NULL && next == NULL) x++;
else {
// здесь переход вверх как он и был
}
}
...
void moveDown() {
if (prev == NULL && next == NULL) x--;
else {
// здесь переход вниз как он и был
}
}
};
До значения x всегда можно добраться через название класса. В моём случае класс называется Kaka, так что добираемся так: Kaka::x
По хорошему, нужна только одна переменная в меню на которую можно скастовать любой тип. При входе в пункт меню, где возможно изменение величины любой переменной из программы, переменной из меню присваивается значение переменной из программы и на дисплей выводится экран с возможностью изменять. По выходу из этого пункта меню проверять - согласен пользователь с изменениями или нет. Если да, переменной программы присваивается изменённое значение, если нет - то и не надо. Бывает так, что наизменяв в меню переменную хочешь оставить начальное значение. Типа ENTER и ESC для ввода значения - длинное короткое нажатие на джойстик. Можно такое организовать?
Ну, вот смотрите, я долго спрашивал Вас одна она или не одна (ещё в #53 жирным шрифтом!). Ответ получил только после того, как пример написал. Вам трудно было раньше ответить? Вы правда думаете, что мне больше нечего делать, как писать примеры один за другим, после каждого узнавая что-то новое? Мне вот жалко потраченного на тот пример времени. давайте Вы будете чётко отвечать на вопросы.
Итак, что такое не одна? Своя на каждый экземпляр структуры? Или пара-тройка на все? Объясните Вы толком, без этого Вам нельзя помочь.
Громкость,яркость, скважность, длительность, время и тд.
Все они задаются через меню, каждая из своего подпункта.
Т.е. и каждый подпункт должен менять значение только своей переменной.
Портянка типа:
if(val_increment){
switch(curItem>menu_id){
case 11:
Яркость++
break;
case 151:
громкость++;
break;
.....
....
....
case 100501:
Ещекакаятохерь++;
break;
}
Какой то вариант некрасивый
Громкость,яркость, скважность, длительность, время и тд.
Все они задаются через меню, каждая из своего подпункта.
Т.е. и каждый подпункт должен менять значение только своей переменной.
Ну, тогда зачем изобретать велосипед? В моём изначальном примере есть метод action - он как раз для этого - чтобы делать то, что нужно, когда данный элемент меню выбран! Вот в него это надо пихать. Пусть меняет что хочет.
Может я не тот пример смотрел, но метод action кроме вывода в монитор ничего не делает и ни где не вызывается.
Вы комментарии не читали. Он должен "делать то, что нужно, когда вызвали" - у меня в примере печатал, у Вас может видео с порхаба скачивать. Что нужно, то и делает.
Kakmyc пишет:
(*Handler)() и у меня вполне работает, но тогда опять же нужно знать, что в него передавать и опять же на переменную ссылка в нем нужна
Какая ссылка? Сделайте эту переменную свойством структуры (как prev) и он всегда будет иметь доступ именно к своей, а не к чужой.
Может я не тот пример смотрел, но метод action кроме вывода в монитор ничего не делает и ни где не вызывается.
Вы комментарии не читали. Он должен "делать то, что нужно, когда вызвали" - у меня в примере печатал, у Вас может видео с порхаба скачивать. Что нужно, то и делает.
Kakmyc пишет:
(*Handler)() и у меня вполне работает, но тогда опять же нужно знать, что в него передавать и опять же на переменную ссылка в нем нужна
Какая ссылка? Сделайте эту переменную свойством структуры (как prev) и он всегда будет иметь доступ именно к своей, а не к чужой.
Я все читал.
Просто я не знаю , как сделать указатель
на ссылку в структуре.
Кучу инфы перелопатил решения не нашел.
Колхозю по своему, по колхозному.
Давая советы , учитывайте, что не все знают ЯП'ы на вашем уровне.
Я вот знаю, что такое ссылка/указатель, но у меня компилятор ругается, когда я ссылку пытаюсь засунуть в структуру, я знаю, что сделать это можно 100%, но я просто не знаю синтаксиса
Да, в том-то и проблема, что не знаете. Вы даже не знаете. что ссылка и указатель - это совершенно разные вещи. Например, в С++ есть и то и другое, а в С ссылок нет - есть только указатели.
Kakmyc пишет:
ссылку пытаюсь засунуть в структуру, я знаю, что сделать это можно 100%, но я просто не знаю синтаксиса
Да, не надо Вам этого. Просто заведите там обыкновенную переменную. Зачем Вам ссылка? Я думал, что Вы хотите иметь одну переменную на всех - для того и ссылка, а если нет, то никакая ссылка Вам не нужна. Просто заведите там переменную (как prev заведёт) и пользуйте её на здоровье.
Да, в том-то и проблема, что не знаете. Вы даже не знаете. что ссылка и указатель - это совершенно разные вещи. Например, в С++ есть и то и другое, а в С ссылок нет - есть только указатели.
Kakmyc пишет:
ссылку пытаюсь засунуть в структуру, я знаю, что сделать это можно 100%, но я просто не знаю синтаксиса
Да, не надо Вам этого. Просто заведите там обыкновенную переменную. Зачем Вам ссылка? Я думал, что Вы хотите иметь одну переменную на всех - для того и ссылка, а если нет, то никакая ссылка Вам не нужна. Просто заведите там переменную (как prev заведёт) и пользуйте её на здоровье.
Мне ненужна одна переменная на все структуры, мне нужна одна типовая структура со ссылкой на множество переменных в каждом из этих экземпляров своя переменная
Блин, я Вам ХЗ какой раз раз пишу. Давайте напишу помедленнее и покрупнее
просто заведите поле в структуре (точно также, как заведено поле prev - ну точно также!). Назовите его, например, kaka. И эта самая kaka будет своя в каждом экземпляре. Никакие указатели и ссылки для этого не нужны от слова нахрен.
Тогда придется всегда хранить все структуры в памяти, что не есть хорошо.
Меню оно создаётся не ради меню, это всего лишь подпрограмма. Одно дело когда 5 пунктов меню, и совсем другое, когда 50.
Меню- отдельная функция с локальными структурами.
Которые создаются каждый раз при входе в функцию и уничтожаются при выходе
В момент необращения его просто не будет.
А так же ещё может быть рабочий режим, в котором меню будет неактивно и дисплей будет отображать совсем иную информацию.
Так вот зачем все время держать в ОЗУ эти структуры ?
Наверно, потому что это МК и правила программирования немножко другие, отличные от большого брата? Программа одна. Все требуемые ресурсы известны на стадии проектирования и освобождать память для других программ нет необходимости? Можно создать все объекты на стадии инициализации и потом не тратить на это время.
Меню- отдельная функция с локальными структурами. Которые создаются каждый раз при входе в функцию и уничтожаются при выходе В момент необращения его просто не будет. А так же ещё может быть рабочий режим, в котором меню будет неактивно и дисплей будет отображать совсем иную информацию. Так вот зачем все время держать в ОЗУ эти структуры ?
Но в таком случае при выходе из функции она будет забывать всё (например, какой элемент сейчас выбран) и каждый раз рисоваться с чистого листа.
А кроме того, таким приёмом Вы не сэкономите ничего. Ну, нет у Вас меню, а что статические элементы типа названий пунктов куда-то исчезли? Всё равно всё будет сидеть в памяти.
Наверно, потому что это МК и правила программирования немножко другие, отличные от большого брата? Программа одна. Все требуемые ресурсы известны на стадии проектирования и освобождать память для других программ нет необходимости? Можно создать все объекты на стадии инициализации и потом не тратить на это время.
Так вот именно поэтому, если у меня 1кб ОЗУ из которых меню будет жрать половину и может не хватить каким то другим задачам в том числе и отрисовке и хочется отделить теплое от мягкого
Но в таком случае при выходе из функции она будет забывать всё (например, какой элемент сейчас выбран) и каждый раз рисоваться с чистого листа.
А кроме того, таким приёмом Вы не сэкономите ничего. Ну, нет у Вас меню, а что статические элементы типа названий пунктов куда-то исчезли? Всё равно всё будет сидеть в памяти.
Не будет ничего забывать, потому что static menuItem *curItem = &m1;
Опробовал и потестил, все работает примерно как и представлял, разница по памяти 386/516 в байтах.
Замерял функцией
int freeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
Я вот тоже как в темном лесу. Но это недостаток моего знания языка. Просто код нетипичный для обычного быдлокодера мигающего светодиодом. Я даже платформио поставил, чтоб хоть маленько разобраться где синтаксис, а где переменные, да еще в чужом исполнении. Учитывая, что мы в песочнице, прошу от себя и от других тормозов, отнестись к этому с пониманием.
Не будет ничего забывать, потому что static menuItem *curItem = &m1;
А вот это попадалово на грабли!
Это будет работать только если между удалением объекта, на который указывает статический указатель и созданием его снова ничего не происходит с памятью и он будет создан точно в том же месте, где и был. Если же он будет создан хоть на байт в другом месте, Вы прибежите сюда вопросом типа: "рандомный глюк! несовместимость с библиотекой кнопки/сервы/экрана/"чесания задницы" - вот так всё работает, а стоит включить проверку кнопки, как всё зависает!".
Никогда ни используйте статический указатель на динамический объект!
Так вот именно поэтому, если у меня 1кб ОЗУ из которых меню будет жрать половину и может не хватить каким то другим задачам в том числе и отрисовке и хочется отделить теплое от мягкого
В том и дело, что нет никаких других задач. Сейчас у Вас задача одна. В ней известно всё. Отрисовка это часть задачи и про неё тоже всё известно. Как может чего то не хватить? А теплое от мягкого отделять - это Вам в Виду надо, а не в АВР.
Не будет ничего забывать, потому что static menuItem *curItem = &m1;
А вот это попадалово на грабли!
Это будет работать только если между удалением объекта, на который указывает статический указатель и созданием его снова ничего не происходит с памятью и он будет создан точно в том же месте, где и был. Если же он будет создан хоть на байт в другом месте, Вы прибежите сюда вопросом типа: "рандомный глюк! несовместимость с библиотекой кнопки/сервы/экрана/"чесания задницы" - вот так всё работает, а стоит включить проверку кнопки, как всё зависает!".
Никогда ни используйте статический указатель на динамический объект!
О том, что если таким образом, вне функции меню, забить память по максимуму всякой фигнёй, достаточно ли этого будет для понимания будет ли происходить, то что вы предрекаете.
Ни в одном из случаев ваши предсказания работать не желают.
Вы, знаете, я далёк от мысли с Вами спорить и что-то Вам доказывать. Уже второй день я Вам говорю, что так не делается, а Вы мне доказываете обратное. Да, не вопрос, делайте как хотите, мне-то собственно что?
const char * itemText; // Название данного элемента (тут может быть не текст, а адрес картинки. Функция show знает, что с этим делать) строка кода из примера Евгения
воткнуть адрес картинки. tft.pushImage(1, 8, 50, 52, menu1); Я так понимаю мой адрес картинки это мои координаты, размер и название (1, 8, 50, 52, menu1);
Функция show знает, что с этим делать
Serial.println(itemText);
меняем на tft.pushImage(x1, y1, sizeX, sizeY, file);
Не понятно как быть с параметром file, как прописывать.
И скорее всего нужно менять конструктор. Сюда мне вообще страшно лезть...
Просто копируем динамическую структуру в статическую и работаем только со статической.
Кактус. покажите мне в коде место. где вы "копируете динамическую структуру в статическую" ? я такого не вижу, вижу только сохранение ссылки. а не самой структуры.
Мне тоже кажется, что ваш код заведомо глючный. Сохранение ссылки на уничтоженную динамическую переменную будет работать только если участок памяти, где лежала переменная - не меняется между вызовами функции. А это означает, вообще-то, что эта память вам между вызовами не нужна и весь этот "цирк с конями" - создание кучи менюшек при входе в функцию и удаление при выходе - никому не нужен.
будет работать только если участок памяти, где лежала переменная - не меняется между вызовами функции.
Да, я это уже писал об этом в #81. Если бы человек спросил, я бы и пример привёл в котором она сваливается. Но, человек пришёл сюда не учиться а спорить и свою правоту доказывать. В добрый путь :-)
теоретически да. Но практически нет. Вот и спрашиваю как переделать конструкто под графическое меню. Мне нужно каждый пункт меню т.е файл картинки отобразить в нужной точке. соотвевтсвенно вместо пункта Menu1 нужно прописать координаты x,y, размер картинкиХ, размер картинкиY и сам файл с картинкой в конструктор. вот и спрашиваю как это сделать?
у вас все пункты меню будут рисованные, например в виде иконок? - или просто текст красивым шрифтом на цветном фоне?
Если первое - советую все пункты меню сделать картинками одинакового размера, или, хотя бы, одинаковой высоты - тогда не придется под каждую картинку запоминать координаты, будете выводить иконки "строчками". как например в смартфоне. В итоге, получается. что вся разница между графическим и текстовым меню - это что в текстовом меню вы храните строчку символов, например "Настройки". а в графическом у вас на этом же самом месте лежит имя иконки.
Если же меню - это красивый текст на графическом экране - то это, вообще-то, обычное текстовое меню
Инт в Лонг, инкрементация... Ты чего хочешь - штоп в структуре указатель на int x был? Ну так объяви в ней указатель и передай адрес при инициализации экземпляра структуры.
Лучше, ссылку. Указатель его до разбрызгиванья байт доведет.
Слушайте, без задачи мы, возможно говорим о разных сторонах слона.
Объясните толком, что это за "x"? Он один на всех? В том смысле, что если в программе 100500 экземпляров myStruct, то при инкрементировании "c" в любом из них, этот х должен тоже инкрементироваться? Так? Или как?
Кстати, что там делает typedef? Он не нужен, а если бы и был нужен, то он не так вводится.
Задача такая.
Структурное меню.
По нему передвигаемся(в моем случае энкодером, но можно чем угодно), выбираем той же кнопкой энкодера.
В некоторых подменю нужно задавать значение.
Там нет перехода perv/next(их значение задано как NULL), вход и выход по кнопке.
Так вот когда находимся в этих подменю , врещнние энкодера меня нет значение переменной.
Так как таких пунктов может быть много, для этого хотелось бы, в качестве переменных использовать указатели.
Это не какой то конечный продукт, просто изучение самой концепции.
Нет, в этом случае указатель не надо. Коль скоро переменная одна на всех, то пусть она одна и остаётся (и одна только память жрёт). А с указателем у Вас будет память жраться на переменную и на указатели во всех элементах - намного больше.
Это делается примерно так:
1. В саму структуру добавляете статическое поле
далее в функциях перехода пишем так:
До значения x всегда можно добраться через название класса. В моём случае класс называется Kaka, так что добираемся так: Kaka::x
Переменная не одна.
Иначе я не понимаю как хранить все эти значения и работать с ними.
Хочется сделать по аналогии с Handler'ом.
Из каждого подменю запускать свою функцию(если подменю это разрешает)
И точно так же в каждом подменю которое разрешает менять значение переменной, изменять свою переменную.
Вот мне и непонятен механизм .
Если мы указываем на переменную "х", то внутренняя переменная структуры , только принимает ее значение при входе в структуру.
И меняем мы только внутреннюю переменную структуры, никак не затрагивая переменную на которую структура ссылается при создании
По хорошему, нужна только одна переменная в меню на которую можно скастовать любой тип. При входе в пункт меню, где возможно изменение величины любой переменной из программы, переменной из меню присваивается значение переменной из программы и на дисплей выводится экран с возможностью изменять. По выходу из этого пункта меню проверять - согласен пользователь с изменениями или нет. Если да, переменной программы присваивается изменённое значение, если нет - то и не надо. Бывает так, что наизменяв в меню переменную хочешь оставить начальное значение. Типа ENTER и ESC для ввода значения - длинное короткое нажатие на джойстик. Можно такое организовать?
Написать то можно всё что угодно, но нужно сделать это понятно и компактно.
Идеальный вариант был бы передавать в качестве переменной ссылку на нужную переменную, только ругается структура на ссылки.
Переменная не одна.
Ну, вот смотрите, я долго спрашивал Вас одна она или не одна (ещё в #53 жирным шрифтом!). Ответ получил только после того, как пример написал. Вам трудно было раньше ответить? Вы правда думаете, что мне больше нечего делать, как писать примеры один за другим, после каждого узнавая что-то новое? Мне вот жалко потраченного на тот пример времени. давайте Вы будете чётко отвечать на вопросы.
Итак, что такое не одна? Своя на каждый экземпляр структуры? Или пара-тройка на все? Объясните Вы толком, без этого Вам нельзя помочь.
Скажем имеем переменные:
Громкость,яркость, скважность, длительность, время и тд.
Все они задаются через меню, каждая из своего подпункта.
Т.е. и каждый подпункт должен менять значение только своей переменной.
Портянка типа:
Сейчас подробнее есть набор структур вот такого типа
Объявлены они вот так:
Переходы заложены в самих структурах.
Так же там есть идентификатор того, что делать при том или ином типе идентификатора.
1 просто меню с переходами
2 подменю где выставляются значения переменных
3 по нажатию "ок" вызывается обработчик функции.
Так вот, нужно к каждому пункту меню типа 2, привязать ссылку на свою переменную.
Вопрос: как это сделать ?
Скажем имеем переменные:
Громкость,яркость, скважность, длительность, время и тд.
Все они задаются через меню, каждая из своего подпункта.
Т.е. и каждый подпункт должен менять значение только своей переменной.
Ну, тогда зачем изобретать велосипед? В моём изначальном примере есть метод action - он как раз для этого - чтобы делать то, что нужно, когда данный элемент меню выбран! Вот в него это надо пихать. Пусть меняет что хочет.
Может я не тот пример смотрел, но метод action кроме вывода в монитор ничего не делает и ни где не вызывается.
(*Handler)() и у меня вполне работает, но тогда опять же нужно знать, что в него передавать и опять же на переменную ссылка в нем нужна
Пока остановился на таком варианте:
Создаём массив с переменными.
За место переменной в экземпляре структуры указываем литерал указывающий на номер члена массива. И работаем с переменной через него.
Может я не тот пример смотрел, но метод action кроме вывода в монитор ничего не делает и ни где не вызывается.
Вы комментарии не читали. Он должен "делать то, что нужно, когда вызвали" - у меня в примере печатал, у Вас может видео с порхаба скачивать. Что нужно, то и делает.
(*Handler)() и у меня вполне работает, но тогда опять же нужно знать, что в него передавать и опять же на переменную ссылка в нем нужна
Какая ссылка? Сделайте эту переменную свойством структуры (как prev) и он всегда будет иметь доступ именно к своей, а не к чужой.
Может я не тот пример смотрел, но метод action кроме вывода в монитор ничего не делает и ни где не вызывается.
Вы комментарии не читали. Он должен "делать то, что нужно, когда вызвали" - у меня в примере печатал, у Вас может видео с порхаба скачивать. Что нужно, то и делает.
(*Handler)() и у меня вполне работает, но тогда опять же нужно знать, что в него передавать и опять же на переменную ссылка в нем нужна
Какая ссылка? Сделайте эту переменную свойством структуры (как prev) и он всегда будет иметь доступ именно к своей, а не к чужой.
Я все читал.
Просто я не знаю , как сделать указатель
на ссылку в структуре.
Кучу инфы перелопатил решения не нашел.
Колхозю по своему, по колхозному.
Давая советы , учитывайте, что не все знают ЯП'ы на вашем уровне.
Я вот знаю, что такое ссылка/указатель, но у меня компилятор ругается, когда я ссылку пытаюсь засунуть в структуру, я знаю, что сделать это можно 100%, но я просто не знаю синтаксиса
Да, в том-то и проблема, что не знаете. Вы даже не знаете. что ссылка и указатель - это совершенно разные вещи. Например, в С++ есть и то и другое, а в С ссылок нет - есть только указатели.
Да, не надо Вам этого. Просто заведите там обыкновенную переменную. Зачем Вам ссылка? Я думал, что Вы хотите иметь одну переменную на всех - для того и ссылка, а если нет, то никакая ссылка Вам не нужна. Просто заведите там переменную (как prev заведёт) и пользуйте её на здоровье.
Да, в том-то и проблема, что не знаете. Вы даже не знаете. что ссылка и указатель - это совершенно разные вещи. Например, в С++ есть и то и другое, а в С ссылок нет - есть только указатели.
Да, не надо Вам этого. Просто заведите там обыкновенную переменную. Зачем Вам ссылка? Я думал, что Вы хотите иметь одну переменную на всех - для того и ссылка, а если нет, то никакая ссылка Вам не нужна. Просто заведите там переменную (как prev заведёт) и пользуйте её на здоровье.
Мне ненужна одна переменная на все структуры, мне нужна одна типовая структура со ссылкой на множество переменных в каждом из этих экземпляров своя переменная
Блин, я Вам ХЗ какой раз раз пишу. Давайте напишу помедленнее и покрупнее
просто заведите поле в структуре (точно также, как заведено поле prev - ну точно также!). Назовите его, например, kaka. И эта самая kaka будет своя в каждом экземпляре. Никакие указатели и ссылки для этого не нужны от слова нахрен.
Тогда придется всегда хранить все структуры в памяти, что не есть хорошо.
Меню оно создаётся не ради меню, это всего лишь подпрограмма. Одно дело когда 5 пунктов меню, и совсем другое, когда 50.
А Вам по-любому придётся их хранить все в памяти. А где ещё Вы их собрались хранить?
Ну оно понятно, что в памяти, но одно дело всегда, и совсем другое, только в момент обращения к меню.
В момент необращения где оно будет? На складе?
В момент необращения где оно будет? На складе?
Меню- отдельная функция с локальными структурами.
Которые создаются каждый раз при входе в функцию и уничтожаются при выходе
В момент необращения его просто не будет.
А так же ещё может быть рабочий режим, в котором меню будет неактивно и дисплей будет отображать совсем иную информацию.
Так вот зачем все время держать в ОЗУ эти структуры ?
Наверно, потому что это МК и правила программирования немножко другие, отличные от большого брата? Программа одна. Все требуемые ресурсы известны на стадии проектирования и освобождать память для других программ нет необходимости? Можно создать все объекты на стадии инициализации и потом не тратить на это время.
Но в таком случае при выходе из функции она будет забывать всё (например, какой элемент сейчас выбран) и каждый раз рисоваться с чистого листа.
А кроме того, таким приёмом Вы не сэкономите ничего. Ну, нет у Вас меню, а что статические элементы типа названий пунктов куда-то исчезли? Всё равно всё будет сидеть в памяти.
Наверно, потому что это МК и правила программирования немножко другие, отличные от большого брата? Программа одна. Все требуемые ресурсы известны на стадии проектирования и освобождать память для других программ нет необходимости? Можно создать все объекты на стадии инициализации и потом не тратить на это время.
Так вот именно поэтому, если у меня 1кб ОЗУ из которых меню будет жрать половину и может не хватить каким то другим задачам в том числе и отрисовке и хочется отделить теплое от мягкого
Но в таком случае при выходе из функции она будет забывать всё (например, какой элемент сейчас выбран) и каждый раз рисоваться с чистого листа.
А кроме того, таким приёмом Вы не сэкономите ничего. Ну, нет у Вас меню, а что статические элементы типа названий пунктов куда-то исчезли? Всё равно всё будет сидеть в памяти.
Не будет ничего забывать, потому что static menuItem *curItem = &m1;
Опробовал и потестил, все работает примерно как и представлял, разница по памяти 386/516 в байтах.
Замерял функцией
Я вот тоже как в темном лесу. Но это недостаток моего знания языка. Просто код нетипичный для обычного быдлокодера мигающего светодиодом. Я даже платформио поставил, чтоб хоть маленько разобраться где синтаксис, а где переменные, да еще в чужом исполнении. Учитывая, что мы в песочнице, прошу от себя и от других тормозов, отнестись к этому с пониманием.
Не будет ничего забывать, потому что static menuItem *curItem = &m1;
А вот это попадалово на грабли!
Это будет работать только если между удалением объекта, на который указывает статический указатель и созданием его снова ничего не происходит с памятью и он будет создан точно в том же месте, где и был. Если же он будет создан хоть на байт в другом месте, Вы прибежите сюда вопросом типа: "рандомный глюк! несовместимость с библиотекой кнопки/сервы/экрана/"чесания задницы" - вот так всё работает, а стоит включить проверку кнопки, как всё зависает!".
Никогда ни используйте статический указатель на динамический объект!
Так вот именно поэтому, если у меня 1кб ОЗУ из которых меню будет жрать половину и может не хватить каким то другим задачам в том числе и отрисовке и хочется отделить теплое от мягкого
В том и дело, что нет никаких других задач. Сейчас у Вас задача одна. В ней известно всё. Отрисовка это часть задачи и про неё тоже всё известно. Как может чего то не хватить? А теплое от мягкого отделять - это Вам в Виду надо, а не в АВР.
Не будет ничего забывать, потому что static menuItem *curItem = &m1;
А вот это попадалово на грабли!
Это будет работать только если между удалением объекта, на который указывает статический указатель и созданием его снова ничего не происходит с памятью и он будет создан точно в том же месте, где и был. Если же он будет создан хоть на байт в другом месте, Вы прибежите сюда вопросом типа: "рандомный глюк! несовместимость с библиотекой кнопки/сервы/экрана/"чесания задницы" - вот так всё работает, а стоит включить проверку кнопки, как всё зависает!".
Никогда ни используйте статический указатель на динамический объект!
В моем случае такого быть не должно.
Работает потому, что немного
по другому.
Просто копируем динамическую структуру в статическую и работаем только со статической.
Остальное можно даже в PROGMEM запихать.
Не дошел пока до этого
А так нельзя?
static PROGMEM
Вот вся функция меню.
Для лучшего понимания
Вот структура:
Вот вся функция меню.
НУ, в таком случае, всё, как я сказал
А также, готовьтесь к неожиданным ниоткуда возникающим и исчезающим в никуда глюкам. Это я Вам гарантирую.
А также, готовьтесь к неожиданным ниоткуда возникающим и исчезающим в никуда глюкам. Это я Вам гарантирую.
Достаточно наглядный тест будет ?
Я не понимаю, о чём Вы.
Я не понимаю, о чём Вы.
О том, что если таким образом, вне функции меню, забить память по максимуму всякой фигнёй, достаточно ли этого будет для понимания будет ли происходить, то что вы предрекаете.
Потому, что по коду я ничего подобного не вижу
Как повезёт, ибо в этой функции Вы память как забьёте, так и освободите. Но если она пропорет кучу, то сломается, а если нет - то нет.
Как повезёт, ибо в этой функции Вы память как забьёте, так и освободите. Но если она пропорет кучу, то сломается, а если нет - то нет.
В общем , размер кучи 1642байта.
При размере массива 1600байт, все работает в штатном режиме.
При 2000байт, меню работает в штатном режиме, размер переменных пляшет (они глобальные).
Ни в одном из случаев ваши предсказания работать не желают.
Что я делаю не так ?
Как смоделировать процесс ?
Ни в одном из случаев ваши предсказания работать не желают.
Вы, знаете, я далёк от мысли с Вами спорить и что-то Вам доказывать. Уже второй день я Вам говорю, что так не делается, а Вы мне доказываете обратное. Да, не вопрос, делайте как хотите, мне-то собственно что?
#import "menu1.h"
#import "menu2.h"
#import "menu3.h"....
....
....
int x1 =1;
int y1=8;
int sizeX=50;
int sizeY=52;
int x2....
int y2...
....
У меня очередной вопрос. Как сюда
const char * itemText; // Название данного элемента (тут может быть не текст, а адрес картинки. Функция show знает, что с этим делать) строка кода из примера Евгения
воткнуть адрес картинки. tft.pushImage(1, 8, 50, 52, menu1); Я так понимаю мой адрес картинки это мои координаты, размер и название (1, 8, 50, 52, menu1);
Функция show знает, что с этим делать
Serial.println(itemText);
меняем на tft.pushImage(x1, y1, sizeX, sizeY, file);
Не понятно как быть с параметром file, как прописывать.
И скорее всего нужно менять конструктор. Сюда мне вообще страшно лезть...
SMenuItem(const char * const _itemText, SMenuItem * _prev = nullptr, SMenuItem * _parent = nullptr) {
itemText = _itemText;
prev = _prev;
parent = _parent;
children = nullptr;
next = nullptr;
Просто копируем динамическую структуру в статическую и работаем только со статической.
Кактус. покажите мне в коде место. где вы "копируете динамическую структуру в статическую" ? я такого не вижу, вижу только сохранение ссылки. а не самой структуры.
Мне тоже кажется, что ваш код заведомо глючный. Сохранение ссылки на уничтоженную динамическую переменную будет работать только если участок памяти, где лежала переменная - не меняется между вызовами функции. А это означает, вообще-то, что эта память вам между вызовами не нужна и весь этот "цирк с конями" - создание кучи менюшек при входе в функцию и удаление при выходе - никому не нужен.
Люди, подскажите плз как переделать конструктор под графическое меню.
Люди, подскажите плз как переделать конструктор под графическое меню.
Туцик, вы уже спрашивали - нет никакой разницы между "графическим" и "текстовым" меню.
теоретически да. Но практически нет. Вот и спрашиваю как переделать конструкто под графическое меню. Мне нужно каждый пункт меню т.е файл картинки отобразить в нужной точке. соотвевтсвенно вместо пункта Menu1 нужно прописать координаты x,y, размер картинкиХ, размер картинкиY и сам файл с картинкой в конструктор. вот и спрашиваю как это сделать?
у вас все пункты меню будут рисованные, например в виде иконок? - или просто текст красивым шрифтом на цветном фоне?
Если первое - советую все пункты меню сделать картинками одинакового размера, или, хотя бы, одинаковой высоты - тогда не придется под каждую картинку запоминать координаты, будете выводить иконки "строчками". как например в смартфоне. В итоге, получается. что вся разница между графическим и текстовым меню - это что в текстовом меню вы храните строчку символов, например "Настройки". а в графическом у вас на этом же самом месте лежит имя иконки.
Если же меню - это красивый текст на графическом экране - то это, вообще-то, обычное текстовое меню
А я Вам о чем?
Вот картинка моего меню, то, что и хочу получить.
https://ibb.co/m8DrRs3