реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Многомерные массивы в CodeVision
zheka
сообщение Jan 5 2011, 12:23
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Господа!
Работаю с 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}};


Есть ли возможность не указывать размерность массива или надо смириться?
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jan 5 2011, 12:29
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



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


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

Примеры инициализации - там же. См. файл CVAVRMAN.PDF
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 5 2011, 12:31
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Действительно, вот так:
Код
unsigned char  multidim_array[][]={{1,2,3},{4,5,6}};
- нельзя, но, можно вот так:
Код
unsigned char  multidim_array[][3]={{1,2,3},{4,5,6}};

Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 5 2011, 12:55
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Ну хорошо, дпустим у меня массив [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кб.

Или есть более рациональный наработанный способ?

Сообщение отредактировал zheka - Jan 5 2011, 12:56
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jan 5 2011, 15:40
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



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


Может, я плохо понял задачу, но идея такая. Опишите рабочий стол в виде структуры. И в эту структуру заложите все его характеристики, в т.ч. и координаты. Четыре стола - массив на четыре структуры. А в функцию передавайте, например, номер элемента этого массива или указатель на структуру ...
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 5 2011, 16:12
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Хех... пока ждал ответа, все-таки пришел к первому варианту. Все же массив проще перебирать.
В процессе написания функции определения не находится ли точка нажатия в заданных координатах столкнулся со странной проблемой?

Вот так работает:
Код
   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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 5 2011, 16:48
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Попробуйте форматировать исходный текст сложных условий таким образом:
Код
     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]))
     {
         ...
     }

И жизнь будет немного проще:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zheka
сообщение Jan 5 2011, 16:52
Сообщение #8


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



А я так тоже пробовал - результат тот же.

Вот код всей функции, закмомментировл я работающий вариант:
Код
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.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 6 2011, 19:52
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016