Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Многомерные массивы в CodeVision
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
zheka
Господа!
Работаю с CodeVision 2.0
Мне нужен многомерный массив. Пытаюсь начать с двумерного. Какова его размерность будет в итоге - фиг его знает,пересчитывать элементы каждый раз я конечно могу, но свербит то что в одномерном массиве без указания размерности вот так можно:

Код
unsigned char  UpMenuImages[] = {11,12,19};


А в двумерном нельзя, выдает ошибку Error: "D:\Ýëåêòðîíèêà\CodeVisoin_Projects\TFT\TFT.c(59): an array can't have elements of this type"

Код
unsigned char  multidim_array[][]={{1,2,3},{4,5,6}};


Есть ли возможность не указывать размерность массива или надо смириться?
kovigor
Цитата(zheka @ Jan 5 2011, 18:23) *
Есть ли возможность не указывать размерность массива или надо смириться?


В мануале Codevision написано, что макс. размерность равна восьми.

Примеры инициализации - там же. См. файл CVAVRMAN.PDF
Палыч
Действительно, вот так:
Код
unsigned char  multidim_array[][]={{1,2,3},{4,5,6}};
- нельзя, но, можно вот так:
Код
unsigned char  multidim_array[][3]={{1,2,3},{4,5,6}};

zheka
Ну хорошо, дпустим у меня массив [x][y][z]. Z у меня будет постоянен, X буду пересчитывать, а вот Y при разных X ,будет разным. Конечно могу нулями заполнить, но...

В общем я обрисую задачу:
Суть такова - человек касается пальцем экрана, получаются координаты X и Y. В идеале хочу получить индивидуальный номер кнопки на которую нажали, плюс информацию о том, что по нажатию этой кнопки делать (типа кода операции). Вся проблема в том, что у меня как бы несколько "рабочих столов" и анализировать коориднаты нажатия нужно в зависимости от номера рабочего стола, а номера у них имеются.

В принципе, как сделать чтобы хотя бы работало, я знаю, но хочется получить удобный для дальнейшего развития программы массив данных, ибо я пока только скелет строю, а потом придет заказчик и будем "мясо" наращивать. КРоме того, я понимаю, что изобретаю велосипед, и наверняка более рациональные чем я сейчас могу придумать, решения существуют.

Пока у меня два варианта - 3-хмерный массив типа

Код
///                                кн№1           кн№2        кн№3        
unsigned char MAP [5][3][4]={ { {0,0,10,10},{0,0,10,10},{0,0,10,10} },   // Рабочий стол №1
                                              { {0,0,10,10},{0,0,10,10},{0,0,10,10} },   // Рабочий стол №2
                                             { {0,0,10,10},{0,0,10,10},{0,0,10,10} },   // Рабочий стол №3
                                             { {0,0,10,10},{0,0,10,10},{0,0,10,10} },   // Рабочий стол №4
                                             { {0,0,10,10},{0,0,10,10},{0,0,10,10} }    // Рабочий стол №5
                                          };



В функции хочу передавать координаты нажатия и номер рабочего стола Dsk, чтобы функция сравнивала не находится ли X,Y в пределах массива координат, записанного в MAP[Dsk][0..n]. А код операции сделаю пятым элементом массива координат кнопки.

Другой вариант - создать тип данных типа Button c полями x,y,x1,y1,opCode, далее массив Desktop состоящий из Button, массив ProgramData состоящий из Desktop.

Как лучше, рациональнее для компилятора (у меня AVR на 16 МГц, а не Core i7), да и памяти оперативной 2кб.

Или есть более рациональный наработанный способ?
kovigor
Цитата(zheka @ Jan 5 2011, 19:55) *
Или есть более рациональный наработанный способ?


Может, я плохо понял задачу, но идея такая. Опишите рабочий стол в виде структуры. И в эту структуру заложите все его характеристики, в т.ч. и координаты. Четыре стола - массив на четыре структуры. А в функцию передавайте, например, номер элемента этого массива или указатель на структуру ...
zheka
Хех... пока ждал ответа, все-таки пришел к первому варианту. Все же массив проще перебирать.
В процессе написания функции определения не находится ли точка нажатия в заданных координатах столкнулся со странной проблемой?

Вот так работает:
Код
   if  ( (sX>MAP_COORDS[m][n][0]) && (sY>MAP_COORDS[m][n][1]) )  
            {
             if ((sX<MAP_COORDS[m][n][2]) && (sY<MAP_COORDS[m][n][3]))
              {
               beep();
               return MAP_COORDS[m][n][4];
              }
            }


А вот так

Код
( ( (sX>MAP_COORDS[m][n][0]) && (sY>MAP_COORDS[m][n][1]) ) &&  ( (sX<MAP_COORDS[m][n][2]) && (sY<MAP_COORDS[m][n][3]) )   )


Не рабоатет... возвращает FALSE, даже если условие истинно...

Повторюсь - у меня CodeVision
demiurg_spb
Попробуйте форматировать исходный текст сложных условий таким образом:
Код
     if    ((sX>MAP_COORDS[m][n][0])
         && (sY>MAP_COORDS[m][n][1])
         && (sX<MAP_COORDS[m][n][2])
         && (sY<MAP_COORDS[m][n][3]))
     {
         ...
     }

И жизнь будет немного проще:-)
zheka
А я так тоже пробовал - результат тот же.

Вот код всей функции, закмомментировл я работающий вариант:
Код
unsigned char GetButtonNumber(unsigned char x, unsigned char y, unsigned char upmenuposition)
{
     unsigned char m,n;
    
                
     sX=800-(int)((((long int)x)*800L)>>8);
     sY=(int)((((long int)y)*480L)>>8);
    
     m=upmenuposition;
      
       for (n=0;n<MC_buttons;n++)    
         {
            if    ((sX>MAP_COORDS[m][n][0])
         && (sY>MAP_COORDS[m][n][1])
         && (sX<MAP_COORDS[m][n][2])
         && (sY<MAP_COORDS[m][n][3]))

            
//            if  ( (sX>MAP_COORDS[m][n][0]) && (sY>MAP_COORDS[m][n][1]) )  
//            {
//             if ((sX<MAP_COORDS[m][n][2]) && (sY<MAP_COORDS[m][n][3]))
              {
               return MAP_COORDS[m][n][4];
              }
//            }  
          }
return 255;          
    
}


функция всегда возвращает 255.
demiurg_spb
Что приходит на ум:
1. Стоит упростить до минимума тестовый вариант.
2. Посмотреть asm-листинг этих двух случаев и найти отличия.
3. Лучше всё-таки использовать структуры, а то код ни разу не самодокументирующийся получается у Вас.
4. Попробовать другой компилятор (gcc, iar), ибо CV не является образцом для подражания.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.