Многомерный символьный массив
- Войдите на сайт для отправки комментариев
Ср, 09/05/2012 - 23:40
Наверняка вопрос смешной: как создать многомерный массив char?
Варианты
char mainMenu[][] = { {"Menu1", 0},{"Menu1", 0},{"Menu1", 0} };
или
char submenu[0][3][15] = {"Menu 1 S1",
"Menu 1 S2",
"Menu 1 S3" };
char submenu[1][3][15] = {"Menu 2 S1",
"Menu 2 S2",
"Menu 2 S3" };
выдают ошибку компиляции...
Ответ в самом вопросе.
Строчки 4-6 компилируются.
А в первой строчке - вам мешает ноль.
Если же вам нужно, просто "массив строчек", до достаточно char submenu[3][15]=....
Кстати строчки 1 и 4 ре. вместе никогда не скомпилируются. Вы, фактически пытаетесь объявить переменную submenu два раза.
Если ваша задача запихнуть все субменю в один массив и образатся к ним по индексу, тогда так
char submenu[][3][15] ={ {"Menu 1 S1", "Menu 1 S2", "Menu 1 S3" }, {"Menu 2 S1", "Menu 2 S2", "Menu 2 S3" } };А стоит погуглить и разобратся, на будущие. "C++ строки", "C++ многомерный массивы", "массивы строк", "массив массивов".
Кстати гугл, может еще на слова "arduino menu library" подсказать готовую библиотеку для построения меню. Возможно надобность в велосипеде - отпадет.
char mainMenu[3][6] = { {'M','e','n','u','1', 0},{'M','e','n','u','1', 0},{'M','e','n','u','1', 0} };Вроде гуглил, видимо плохо :) Не смог найти пример где массивы многомерны (ассициотивные) с неполным заполнением ячеек.
За библиотеку спасибо!
ПС: я с пхп пришел и в С С++ только самые общие основы знаю.
maksim: "0" в принципе массивом следующего уровня должен быть
char mainMenu[3][6] = { {'M','e','n','u','1', 0},{'M','e','n','u','1', 0},{'M','e','n','u','1', 0} };А зачем так сложно?
char mainMenu[3][6] = { "Menu1","Menu1","Menu1" };Даст тот же результат.
Можно даже
char mainMenu[][6] = { "Menu1","Menu1","Menu1" };А ноль? Может он ему очень нужен?
Общая идея была такая (дальше велосипед):
char menu[3][15] = {"Menu 1 ", "Menu 2 ", "Menu 3 "}; char submenu0[3][15] = {"Menu 1 S1 ", "Menu 1 S2 ", "Menu 1 S3 " }; char submenu1[3][15] = {"Menu 2 S1 ", "Menu 2 S2 " }; char submenu2[4][15] = {"Menu 3 S1 ", "Menu 3 S2 ", "Menu 3 S22", "Menu 3 S3 " };А ноль? Может он ему очень нужен?
Вы правы. ОЧЕНЬ НУЖЕН. Поэтому умный компилятор добавит его сам. Даже если вы не указали этого в явном виде.
http://arduino.cc/en/Reference/String
Общая идея была такая (дальше велосипед):
char menu[3][15] = {"Menu 1 ",
"Menu 2 ",
"Menu 3 "};
char submenu0[3][15] = {"Menu 1 S1 ",
"Menu 1 S2 ",
"Menu 1 S3 " };
char submenu1[3][15] = {"Menu 2 S1 ",
"Menu 2 S2 " };
char submenu2[4][15] = {"Menu 3 S1 ",
"Menu 3 S2 ",
"Menu 3 S22",
"Menu 3 S3 " };
Зачем эта куча переменных?
Смотрите пример в моем первом ответе.
Вместо submenu0, и submenu1, гораздо же луче submenu[0] и submenu[1], можно циклом пробегатся, можно функцию написать
void printSubMenu(byte menuIndex){ for(byte i=0;i<3;i++) Serial.println(submenu[menuIndex][i]); }Тогда еще один вопрос (нагуглить тоже не смог..) - есть встроенная функция определения размера массива или надо каждый раз высчитывать?
Я чет не пойму, это я сообщения не вижу и пропускаю или форум глючит?
Нет. Но есть "хак".
Имеется функций sizeof (и думаю в любом учебники где показывается работа с массивами есть пример ее использования).
Умеет возвращать размер переменной или типа/структуры/класса.
Пример использования смотрите хоть тут:
http://arduino.ru/forum/programmirovanie/sketchi-dlya-besprovodnogo-vkly...
Сообщение 24, первая строчка - декларация массива, 3-ть строчка - дефайн для вычисления его длины.
Я чет не пойму, это я сообщения не вижу и пропускаю или форум глючит?
Сообщения выскакивают "вверх", не только когда есть новый пост, но и когда идет правка уже существующего сообщения (например "очепятки" убрать).
Кстати, Максим, а вы не могли бы глянуть в http://arduino.ru/forum/obshchii/novyi-sposob-vzaimodeistviya-s-polzovatelem
Я вижу в железных вопросах вы разбираетесь лучше меня, как я понял что-бы это воспроизвести нужно генерировать синусойду около 3mHz и оцифровывать ее. Не подскажете справится ардуина с таким? PWM-ами, выварачиванием таймеров и проч.?
Спасибо! Сейчас доделаю свой "велосипед", а потом буду эксперементировать с оптимизацией.
ну если я вас прально понял то :
Ну вот, хоть и криво, но написал свой первый скетч, причем делает то что я от него и хотел :) Навигация влево-вправо (по кругу) и вход в подменю с навигацией влево-вправо (тоже по кругу). Двухуровневое меню для LCD Keypad Shield 2*16. Если кому интересно могу выложить на осмеяние. :)
ну если я вас прально понял то :
Эта функция вернет длину строки (пробежится по ней пока не встретит нулевой символ). А была задача "узнать количество элементов в массиве".
Это делается
#define MyArrayLeng sizeof(MyArray)/РАЗМЕР_ЭЛЕМЕНТА_В_БАЙТАХ
если элемент масива имеет какой-то известный тип, то вместо РАЗМЕР_ЭЛЕМЕНТА_В_БАЙТАХ можно подставить sizeof(ТИП_ЭЛЕМЕНТА)
int abc[2]={ int a[3][3]={1,1,0,1,0,1,0,1,1}, int b[3][3]={1,1,0,0,0,1,0,0,1}, int c[3][3]={1,0,0,0,0,0,1,1,1} };Хаюшки, а как мне несколько двухмерных массивов вложить в один другой одномерный массив?
в компиляторе пишет про пропущенные символы какие-то ';' '}' token...
//Pone Book //number: char numbers[250][42] = {0}; char names[250][15] = {0}; void setup() { // put your setup code here, to run once: Serial.begin(19200); Serial.println("Multidimentional arry example"); char numbers[][42] = { "+994502545376" }; char names[][15] = { "Elnur Mehdiyev"}; //Serial.println(numbers[0]); } void loop() { // put your main code here, to run repeatedly: for(byte pbe = 0; pbe <= 249; pbe++){ char* pbname = names[pbe]; char* pbnum = numbers[pbe]; if(pbname){ Serial.print("<pbname>"); Serial.print(pbname); Serial.println("</pbname>"); Serial.print("<pbnum>"); Serial.print(pbnum); Serial.println("</pbnum>"); }break; } }Почему дуина глючит и не хочет компиллировать вот это, чтото я запутался....