Меню, вопросы.
- Войдите на сайт для отправки комментариев
Делаю проект, появились вопросы по меню. Я понимаю что можно сделать чтоб работало, внутрь никто лазть не будет, и критиковать значит тоже. Но хочется сделать красиво и правильно.
Вот код
#include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); char* mainMenu[] = {"1. SETUP", "2. TEST"}; char* setupMenu[] = {"1. TIME SETUP", "2. GSM SETUP"}; char* testMenu[] = {"1. GSM TEST"}; void setup() { lcd.begin(16, 2); lcd.print("hello, world!"); } void loop() { for (int i = 0; i < 3; i++) { lcd.clear(); showMenu(i); delay(3000); } } void showMenu(int numM) { switch (numM) { case 0: { int n = sizeof(mainMenu) / sizeof(mainMenu[0]); for (int i = 0; i < n; i++) { lcd.setCursor(0, i); lcd.print(mainMenu[i]); } } break; case 1: { int n = sizeof(setupMenu) / sizeof(setupMenu[0]); for (int i = 0; i < n; i++) { lcd.setCursor(0, i); lcd.print(setupMenu[i]); } } break; case 2: { int n = sizeof(testMenu) / sizeof(testMenu[0]); for (int i = 0; i < n; i++) { lcd.setCursor(0, i); lcd.print(testMenu[i]); } } break; default: // if nothing else matches, do the default // default is optional break; } }
Код написал для тестирования работы меню.
ТУТ симуляция работы кода, если интересно.
1. Как лучше объявлять переменные в которых хранятся названия меню? Глобально или локально в фцнкции showMenu? Я понимаю что если глобально то у меня будет меньше памяти, но если локально получается при вызове функции постоянну переменным прописываются значения. Вот не понимаю какое из двух зол выбрать.
2 И второй вопрос, меню имеют разное количество пунктов. Количество элементов в массиве можно получить так int n = sizeof(Array) / sizeof(Array[0]); Но для двумерного массива как определить количество элементов я не нашел. Есть ли такая возможноать? Двуменрый массив нужен чтобы сложить все меню в одну переменную, и выводить в зависимости от уровня меню нужный массив.
Я понимаю что если меню статично, то вывод на экран можно обрабатывать программно, но это свой кусок кода для каждого меню, а так в одну процедуру можно передать номер меню, из массива получаем количество элементов и выводим меню.
Например массив объявляем так
char* mMenu[][2] = {{"1. SETUP", "2. TEST"},{"1. TIME SETUP", "2. GSM SETUP"},{"1. GSM TEST"}};
Но тогда я не могу получить количество элементов в массиве программно.
Может быть мне не заморачиваться и сделать еще массив с указанием количества элементов меню?
int elemMenu[] = {2,2,1};
и всё получается. А у Вас что, не выходит? Или просто не пробовали?
char* mMenu[][2] = {{"1. SETUP", "2. TEST"},{"1. TIME SETUP", "2. GSM SETUP"},{"1. GSM TEST"}};
Но тогда я не могу получить количество элементов в массиве программно.
int elemMenu[] = {2,2,1};
Спасибо от чайника, вы развеяли мои сомнения :-)
и всё получается. А у Вас что, не выходит? Или просто не пробовали?
Так что вопрос - как получить количество элементов в массиве второго уровня остался открытым. Может всетаки есть какая хитрость?
ну по мойе вере ни Перун ни Велес ничего против не имеют :-)
int elemMenu[] = {2,2,1};
Обижаете уважаемый.. пробовал, но что он вам в сериал выводит с таким примером? 3! То есть у меня 3 элемента на первом уровне.
Понятно, что Вы попусту растратили память на пять указателей? Она у Вас что, лишняя? В реальных больших меню будет гораздо больше.
По уму, если меню имеет структуру "дерева", то и делать её надо в виде дерева, а не в виде массива. Собственно, так всегда и делается.
А, вон, что Вам надо.
Понятно, что Вы попусту растратили память на пять указателей? Она у Вас что, лишняя? В реальных больших меню будет гораздо больше.
По уму, если меню имеет структуру "дерева", то и делать её надо в виде дерева, а не в виде массива. Собственно, так всегда и делается.