Меню, вопросы.
- Войдите на сайт для отправки комментариев
Делаю проект, появились вопросы по меню. Я понимаю что можно сделать чтоб работало, внутрь никто лазть не будет, и критиковать значит тоже. Но хочется сделать красиво и правильно.
Вот код
#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};
static const char* mainMenu[] = {"1. SETUP", "2. TEST"};char* mMenu1[][2] = { {"1. SETUP", "2. TEST"}, {"1. TIME SETUP", "2. GSM SETUP"}, {"1. GSM TEST"} }; Serial.println(sizeof(mMenu1)/sizeof(mMenu1[0]));и всё получается. А у Вас что, не выходит? Или просто не пробовали?
char* mMenu[][2] = {{"1. SETUP", "2. TEST"},{"1. TIME SETUP", "2. GSM SETUP"},{"1. GSM TEST"}};
Но тогда я не могу получить количество элементов в массиве программно.
int elemMenu[] = {2,2,1};
static const char* mainMenu[] = {"1. SETUP", "2. TEST"};Спасибо от чайника, вы развеяли мои сомнения :-)
char* mMenu1[][2] = { {"1. SETUP", "2. TEST"}, {"1. TIME SETUP", "2. GSM SETUP"}, {"1. GSM TEST"} }; Serial.println(sizeof(mMenu1)/sizeof(mMenu1[0]));и всё получается. А у Вас что, не выходит? Или просто не пробовали?
char* mMenu1[5][2] = { {"1. SETUP", "2. TEST"}, {"1. TIME SETUP", "2. GSM SETUP"}, {"1. GSM TEST"} }; Serial.println(sizeof(mMenu1)/sizeof(mMenu1[0])); выдает 5!Так что вопрос - как получить количество элементов в массиве второго уровня остался открытым. Может всетаки есть какая хитрость?
ну по мойе вере ни Перун ни Велес ничего против не имеют :-)
int elemMenu[] = {2,2,1};
Обижаете уважаемый.. пробовал, но что он вам в сериал выводит с таким примером? 3! То есть у меня 3 элемента на первом уровне.
char* mMenu1[][5] = { // здесь три элемента по 5 указателй в каждом! {"1. SETUP", "2. TEST", "3. TEST", "4. TEST", ""}, // Все пять указателей при деле {"1. TIME SETUP", "2. GSM SETUP", ""}, // Три указателя испоользуются, а два - не при делах {"1. GSM TEST", ""} // Два указателя испоользуются, а три - не при делах };Понятно, что Вы попусту растратили память на пять указателей? Она у Вас что, лишняя? В реальных больших меню будет гораздо больше.
По уму, если меню имеет структуру "дерева", то и делать её надо в виде дерева, а не в виде массива. Собственно, так всегда и делается.
А, вон, что Вам надо.
char* mMenu1[][5] = { // здесь три элемента по 5 указателй в каждом! {"1. SETUP", "2. TEST", "3. TEST", "4. TEST", ""}, // Все пять указателей при деле {"1. TIME SETUP", "2. GSM SETUP", ""}, // Три указателя испоользуются, а два - не при делах {"1. GSM TEST", ""} // Два указателя испоользуются, а три - не при делах };Понятно, что Вы попусту растратили память на пять указателей? Она у Вас что, лишняя? В реальных больших меню будет гораздо больше.
По уму, если меню имеет структуру "дерева", то и делать её надо в виде дерева, а не в виде массива. Собственно, так всегда и делается.