Многомерный символьный массив

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Наверняка вопрос смешной: как создать многомерный массив 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" };

выдают ошибку компиляции...

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Ответ в самом вопросе.

Строчки 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" подсказать готовую библиотеку для построения меню. Возможно надобность в велосипеде - отпадет.

 

maksim
Offline
Зарегистрирован: 12.02.2012
char mainMenu[3][6] = { {'M','e','n','u','1', 0},{'M','e','n','u','1', 0},{'M','e','n','u','1', 0} };

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Вроде гуглил, видимо плохо :) Не смог найти пример где массивы многомерны (ассициотивные) с неполным заполнением ячеек.

За библиотеку спасибо!

ПС: я с пхп пришел и в С С++ только самые общие основы знаю.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

maksim: "0" в принципе массивом следующего уровня должен быть

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

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" };

 

maksim
Offline
Зарегистрирован: 12.02.2012

А ноль? Может он ему очень нужен? 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Общая идея была такая (дальше велосипед):

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 " };

 

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

А ноль? Может он ему очень нужен? 

Вы правы. ОЧЕНЬ НУЖЕН. Поэтому умный компилятор добавит его сам. Даже если вы не указали этого в явном виде.

http://arduino.cc/en/Reference/String

leshak
Offline
Зарегистрирован: 29.09.2011

 

JollyBiber пишет:

Общая идея была такая (дальше велосипед):

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]);
  
}

 

 

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Тогда еще один вопрос (нагуглить тоже не смог..) - есть встроенная функция определения размера массива или надо каждый раз высчитывать?

maksim
Offline
Зарегистрирован: 12.02.2012

Я чет не пойму, это я сообщения не вижу и пропускаю или форум глючит?

leshak
Offline
Зарегистрирован: 29.09.2011

 Нет. Но есть "хак".

Имеется функций sizeof  (и думаю в любом учебники где показывается работа с массивами есть пример ее использования).

Умеет возвращать размер переменной или типа/структуры/класса.

Пример использования смотрите хоть тут:

http://arduino.ru/forum/programmirovanie/sketchi-dlya-besprovodnogo-vkly...

Сообщение 24, первая строчка - декларация массива, 3-ть строчка - дефайн для вычисления его длины.

leshak
Offline
Зарегистрирован: 29.09.2011

maksim пишет:

Я чет не пойму, это я сообщения не вижу и пропускаю или форум глючит?

Сообщения выскакивают "вверх", не только когда есть новый пост, но и когда идет правка уже существующего сообщения (например "очепятки" убрать).

leshak
Offline
Зарегистрирован: 29.09.2011

 Кстати, Максим, а вы не могли бы глянуть в http://arduino.ru/forum/obshchii/novyi-sposob-vzaimodeistviya-s-polzovatelem

Я вижу в железных вопросах вы разбираетесь лучше меня, как я понял что-бы это воспроизвести нужно генерировать синусойду около 3mHz и оцифровывать ее. Не подскажете справится ардуина с таким? PWM-ами, выварачиванием таймеров и проч.?

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Спасибо! Сейчас доделаю свой "велосипед", а потом буду эксперементировать с оптимизацией.

mixail844
Offline
Зарегистрирован: 30.04.2012

ну если я вас прально понял то :

 

int lenght;
char menu[10];
lenght= strlen(menu);//lenght получит размер массива,если тот не пустой.если пустой то lenght=0;

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Ну вот, хоть и криво, но написал свой первый скетч, причем делает то что я от него и хотел :) Навигация влево-вправо (по кругу) и вход в подменю с навигацией влево-вправо (тоже по кругу). Двухуровневое меню для LCD Keypad Shield 2*16. Если кому интересно могу выложить на осмеяние. :)

leshak
Offline
Зарегистрирован: 29.09.2011

mixail844 пишет:

ну если я вас прально понял то :

 

int lenght;
char menu[10];
lenght= strlen(menu);//lenght получит размер массива,если тот не пустой.если пустой то lenght=0;

 

Эта функция вернет длину строки (пробежится по ней пока не встретит нулевой символ). А была задача "узнать количество элементов в  массиве".

Это делается

#define MyArrayLeng sizeof(MyArray)/РАЗМЕР_ЭЛЕМЕНТА_В_БАЙТАХ

если  элемент масива имеет какой-то известный тип, то вместо РАЗМЕР_ЭЛЕМЕНТА_В_БАЙТАХ можно подставить sizeof(ТИП_ЭЛЕМЕНТА)

Wejur
Offline
Зарегистрирован: 13.06.2015
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...

elik745i
Offline
Зарегистрирован: 08.04.2012
//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;
         
                           
}
}

Почему дуина глючит и не хочет компиллировать вот это, чтото я запутался....