Я имею ввиду чтобы не нужно было несколько раз писать имена переменных - сначала объявляя их в объявлении структуры, а потом опять писать их присваивая значения... или чтобы не было так: переменные перечисляются в одном месте, а присваивание в другом...
В общем, чтобы было наглядно, переменная и тут же присваивание...
Последний раз редактировалось shads Пт ноя 07, 2014 12:18:51, всего редактировалось 1 раз.
я вообще не понял, в чем смысл этой структуры - работать с ней все равно неудобно.
имхо, меню должно строиться на обезличенном наборе (массиве, списке) пунктов, а каждый пункт уже описывается структурой с полями "имя", "номер" и т.п.
в этом случае работа с любым пунктом меню из массива/списка ведется совершенно одинотипно. а в вашем случае уже нельзя, например, циклом перебрать все пункты и вывести их на дисплей...
возможно в силу своей ограниченности я чего-то недопонимаю, но покажите пример кода функции, которая по номеру пункта выберет из вашей структуры нужные поля...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
ARV писал(а):возможно в силу своей ограниченности я чего-то недопонимаю, но покажите пример кода функции, которая по номеру пункта выберет из вашей структуры нужные поля...
Хе... возможно в силу своей ограниченности я чего то неправильно предполагаю ...
Но представлял себе это как то так: функция берет адрес начала структуры и перебором находит первый 0, это будет конец текста первой менюшки, соответственно к этому адресу прибавляем количество информационных байт (в нашем случае 2) и попадаем на начало второй менюшки... ну и т.д.
Хотя тут возможны грабли с особенностями четного выравнивания в AVR... но думаю и это можно разрулить...
А для чего весь этот ананизм ?
Создайте свой тип-структуру с данными, указателями на строки, и всякими другими свойствами. Объявите массив с этим типом и выбирайте из него по индексу необходимую структуру.
Собственно, это любезно продемонстрировал ARV несколькими постами выше.
shads писал(а):функция берет адрес начала структуры и перебором находит первый 0, это будет конец текста первой менюшки, соответственно к этому адресу прибавляем количество информационных байт (в нашем случае 2) и попадаем на начало второй менюшки... ну и т.д.
чем-то напоминает процесс вырезания гланд через прямую кишку...
когда-то я этими меню был маленько озабочен... если нужно - гуглите на моем сайте "TUI" - Text User Interface - делал библиотечку для меню на текстовом ЖКИ... среди основных фич:
- почти любая вложенность "подменю" (ограничение - объем памяти)
- возможность динамически менять текст пунктов меню (например, "подсветка вкл" на "подсветка выкл")
- возможность встраивания в меню числовых изменяемых параметров (например, "яркость 15%") - параметр меняется прямо в пункте меню
- ориентация на WinAVR
что-то там еще было, сейчас уже и не упомню...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Спасибо, гляну...
Просто я и структуры особо не юзал и вложенные структуры (как вы предложили) не особо представляю как использовать... Вот то что пришло в голову, и выдал
В общем - попробую это правильно сделать... а не через прямую к....
ARV писал(а):"TUI" - Text User Interface - делал библиотечку для меню на текстовом ЖКИ...
Посмотрел... Сложновато честно говоря, для 0216 дисплея...
Может оно и универсально конечно, но у меня совершенно не нашлось сил вникать... лентяй наверное... или просто не привык вникать в чужую писанину ..
По твоему предложению - минус в том что поле uint8_t name[10]; должно быть равно максимально длинной записи... а я все это затеваю для NOKIA3310 дисплея... там как известно страница = 84 байта... я конечно буду применять уплотнение, но тем не менее, как то не оптимально получится если на каждую страницу будет отводится одинаково большое неэффективно используемое поле...
Например в моем случае эта проблема как раз решается тем что каждая строка индивидуальна... что в этом плане подскажете?
И еще вопросик... зачем у вас поле id ? Ведь порядковый номер пункта меню итак следует из нумерации в массиве...
Последний раз редактировалось shads Пт ноя 07, 2014 21:28:40, всего редактировалось 1 раз.
Аlex писал(а):Заюзать указатель на строку, вместо массива.
Это - да.... более менее компромиссный вариант...
но возникает неудобство редактиования\удаления\добавления страниц меню... т.к. тексты и параметры страниц - будут сгруппированы в разных местах...
В моем случае тоже есть две сущности, это 1) нумерация страниц (enum) и 2) само наполнение страниц с параметрами (по крайней мере все для каждой отдельной менюшки - держится в кучке)... Тоже конечно не фантан из-за enum... Но по крайней мере при редактировании одного параметра легко видны зависимости, т.к. все в кучке...
В идеале можно было бы (я имею ввиду мой случай) и от enum освободится и оставить только структуры с наполнением... и обращаться к ним через указатели... но в таком случае не организуешь в оперативке динамические массивы с переменными для каждой менюшки, все ручками придется прописывать...
shads писал(а):но в таком случае не организуешь в оперативке динамические массивы с переменными для каждой менюшки, все ручками придется прописывать...
А что если замучить malloc() / free() ?
Ведь даже в плюсах всякие классы, на подобии String, основаны на том же динамическом выделении/освобождении памяти.
Аlex писал(а):А что если замучить malloc() / free() ?
Ведь даже в плюсах всякие классы, на подобии String, основаны на том же динамическом выделении/освобождении памяти.
Ой... я в Си пока буксую... а как речь о плюсах заходит - у меня вообще искры из глаз сыплются .....
Функции malloc() и free().
То, что там упоминается С++, не обращайте внимания. В С тоже есть эти функции. Но для их использования, компилятору необходима некая область памяти, называемая кучей (heap), которая обычно настраивается где-то в настройках компилятора.
Всем привет!
Решил портировать код, который был написан для PIC18 на какой нить STM32F10x и заодно прокачать скилл написания программ на си.
Так вот натнулся на эти строки
Я полагаю что нулевой элемент архива longAddressLocation будет расположен по адресу 0x0E. Так?
В доке на STM32 вот что пишут
The STM32F10xxx features up to 96 Kbytes of static SRAM. It can be accessed as bytes,
half-words (16 bits) or full words (32 bits). The SRAM start address is 0x2000 0000.
Будет ли работать этот кусок кода если я напишу вот так
а обязательно по определенному адресу? Напишите
const unsigned char myLongAddress[8] = {EUI_0,EUI_1,EUI_2,EUI_3,EUI_4,EUI_5,EUI_6,EUI_7};
будет размещено во флэше, адрес можно получить через указатель
oleg110592 писал(а):а обязательно по определенному адресу? Напишите
const unsigned char myLongAddress[8] = {EUI_0,EUI_1,EUI_2,EUI_3,EUI_4,EUI_5,EUI_6,EUI_7};
будет размещено во флэше, адрес можно получить через указатель
хм. Думал об этом, но индусы из микрочипа не просто так же написали эту фигню?
В целом я правильно понял назначение этих строк?
Гляньте пжалстя... что я такого криминального понаписал?.....
Тут конечно бессмыслица полная... но это из-за того что я лишнее повыкидывал...
Компиль (AVRStudio 4.19) ошибку кажет какую-то необычную... первый раз такую вижу...
И как то странно себя ведет... например если закомментировать i--; то ошибка исчезает Спойлер