Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подкиньте идею организации массива данных. программирую интерфейс с Тачскрином. 
:(
    Опции темы
=Женек=
Дата 5.1.2011, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Господа, программирую устройство с тачскрином. 

Сразу скажу - пишу в среде CodeVision AVR, если кто знает. Поэтому решение должно быть реализовано элементарным С языком, без всяких наворотов типа std::vector (уж не помню как пишется).

Суть такова - человек касается пальцем экрана, получаются координаты 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кб.

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

Это сообщение отредактировал(а) =Женек= - 5.1.2011, 18:50
PM MAIL   Вверх
xvr
Дата 5.1.2011, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Сделайте одномерный массив структур. В каждой структуре должен описываться элемент управления (1 шт). Так же в ней должны задаваться границы "рабочих столов". Программа должна в run-time искать нужный "рабочий стол" и уже в нем искать нужный элемент управления.

PM MAIL   Вверх
=Женек=
Дата 5.1.2011, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Идею понял не до конца...
ВОт исходные - координаты нажатия... дальше по вашему что?
Одномерный массив? но столы во многом одинаковы, одни и те же координаты будут соответствовать кнопкам в различных окнах.  ПРо границы рабочего стола не понял.

Я пока что взял первый вариант - создал 3-мерный массив координат - 3 стола, 10 кнопок, 4 координаты. В runtime определяю что за стол (desk) и шерстю MAP_COORDS[desk][i]. Сделал инициализацию массива колоночками с комментариями, проблем вроде нет, но есть ощущение топорности того, что я делаю.
PM MAIL   Вверх
mes
Дата 6.1.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(=Женек= @  5.1.2011,  22:24 Найти цитируемый пост)
Я пока что взял первый вариант - создал 3-мерный массив координат - 3 стола, 10 кнопок, 4 координаты. 

разделите этот массив на составляющие.. т.е. создайте отдельно структуры стол, кнопка и т.д. какой именно подход выбирать зависит от дальнейших планов.. если намериваетесь сделать нечто сложнее чем , просто стол и кнопка , то тогда сразу прикручивайте полиморфизм..
а  вобще прежде стоило бы ознакомиться с подходами уже примененных в ГУИ библиотеках.. 





--------------------
PM MAIL WWW   Вверх
xvr
Дата 6.1.2011, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(=Женек= @  5.1.2011,  23:24 Найти цитируемый пост)
Идею понял не до конца...

Объясняю до конца.  smile 
Код

#define ROOM_ID -2
#define END_ID -1

typedef struct {
 unsigned char id; // button ID, or ROOM_ID, or END_ID
 unsigned char x;  // x for button, bitscale of room ids for room
 unsigned char y, x1, y1;
} Button;

#define BIT(n) (1<<(n))

static __flash Button buttons[]={
{ROOM_ID,BIT(0)|BIT(1)|BIT(2)}, // common buttons for all 3 rooms
 {1,0,0,10,10}, // Button with ID 1 on coords (0,0,10,10)
 {2,20,20,25,25}, // Button with ID 2 on coords (20,20,25,25)
{ROOM_ID,BIT(0)}, // buttons for room #0 only
 {5,35,35,40,40},
...
{END_ID}
};

unsigned char find_button_id(unsigned char x, unsigned char y, unsigned char room_id)
{
 Button __flash* btn=buttons;
 char is_active=0;

 for(;btn->id!=END_ID;++btn)
  if (btn->id==ROOM_ID) is_active=(btn->x & BIT(room_id))!=0; else
  if (is_active && x>=btn->x && x<=btn->x1 && y>=btn->y && y<=btn->y1)
    return btn->id;
 return 0;
}


Добавлено @ 11:08
PS. Ваш вариант с 3х мерным массивом сожрет очень много памяти  smile 

Это сообщение отредактировал(а) xvr - 6.1.2011, 11:10
PM MAIL   Вверх
=Женек=
Дата 6.1.2011, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Хех... я все-таки после мытарств пришел к необходимости создания структуры. Спасибо за код, именно то, что я хотел, сейчас вникну.
А пока что вопрос - если я правильно понял, при поиске перебираются все кнопки в массиве. Не загрузит ли проц?
Второе - что такое END_ID я так и не понял, да и вообще, как вы ROOM_ID и Button ID совмещаете в одной переменной..

P.S. не сочтите за твердолобость и лень, скорее всего и сам разберусь, пока вы ответите, но хотелось бы все же слышать объяснение и от вас.
PM MAIL   Вверх
mes
Дата 6.1.2011, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(=Женек= @  6.1.2011,  11:07 Найти цитируемый пост)
как вы ROOM_ID и Button ID совмещаете в одной переменной.

не в одной , внимательнее к комментариям smile

Цитата(=Женек= @  6.1.2011,  11:07 Найти цитируемый пост)
 что такое END_ID

конец значимой информации.. чтоб не использовать размер массива..

Добавлено через 2 минуты и 3 секунды
Цитата(=Женек= @  6.1.2011,  11:07 Найти цитируемый пост)
 при поиске перебираются все кнопки в массиве. Не загрузит ли проц?

а сколько примерно кнопок то предполагается? 10 -15 про стол? не загрузит smile



--------------------
PM MAIL WWW   Вверх
=Женек=
Дата 6.1.2011, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Как и говорил - разобрался, огромное спасибо! Единственное, что изменил - координаты не char а int сделал, у меня дисплей 800х480.
А вот с общими для всех окон кнопками - это конечно ГЕНИАЛЬНО. Сам когда продумывал код решил от этого отказаться и сделать просто общий код операции для одних и тех же кнопок на разных столах.

Спасибо.
PM MAIL   Вверх
=Женек=
Дата 6.1.2011, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Более того, у меня есть "подокна", которые тоже как-то надо идентифицировать, причем с удобствами. А здесь у окна не просто номер в массиве а ID, и я могу сделать окно 1, а подокна 11,12... 
В общем спасибо, сам бы я до такого не дошел...
PM MAIL   Вверх
xvr
Дата 6.1.2011, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(=Женек= @  6.1.2011,  13:07 Найти цитируемый пост)
Более того, у меня есть "подокна", которые тоже как-то надо идентифицировать, причем с удобствами.
Для ID 'подокон' можно использовать поля y (и x1 и y1) в структуре. Можно организовать весьма замысловатую иерархию окон/подокон  smile 


PM MAIL   Вверх
=Женек=
Дата 10.1.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Еще вопрос - объясните мне, как понять вот эту строку
Код

if (btn->id==ROOM_ID) is_active=(btn->x & BIT(room_id))!=0; else
  


особенно вот этот участок: is_active=(btn->x & BIT(room_id))!=0; Одновремено и присвоение и сравнение...

Наткнулся я на это после того как подокна сделал

Код

{ROOM_ID,BIT(0),BIT(0)}, // Кнопки "АУДИОСИСТЕМА", раздел 0
 {1,103,145,369,229},
 {2,430,145,696,229},
 {3,90,293,356,377},
 {4,443,293,709,377},
  
 {104,733,220,796,263},
 

{ROOM_ID,BIT(0),BIT(1)}, // Кнопки "АУДИОСИСТЕМА", раздел 1
 {5,103,145,369,229},
 {6,430,145,696,229},
 {7,90,293,356,377},
 {8,443,293,709,377},
 
 {103,5,220,68,263},   
 {104,733,220,796,263},




Кнопки с id 103 и 104 - для перемещения между подконами, то есть в первом окне только кнопка вперед, во втором - обе кнопки, в последнем - только кнопка назад.
А тачпанель реагирует на обе кнопки в любом подразделе. 
Я переделал заголовок на
Код

unsigned char find_button_id(unsigned char x, unsigned char y, unsigned char room_id, unsigned char subroom_id)


А как изменить мудреный (для меня, любителя) синтаксис функции, чтобы она учитывала и номер подокна?

Заранее спасибо.
PM MAIL   Вверх
xvr
Дата 10.1.2011, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(=Женек= @  10.1.2011,  14:01 Найти цитируемый пост)
Еще вопрос - объясните мне, как понять вот эту строку

if (btn->id==ROOM_ID) : Если текущий элемент - идентификатор комнаты (room ID), то ...
is_active=(btn->x & BIT(room_id))!=0; во флаг 'is_active' присваивается результат сравнения (bool величина - 1 или 0) с нулем результата логического И битовой маски из room_id из параметра и шкалы этих же room_id из текущего элемента. Т.е. is_active установится в 1 если текущий room_id (из параметра) присутствует в маске (в текущем элемента массива), или в 0 в противном случае.
is_active равное 0 блокирует обработку кнопок в массиве

Цитата(=Женек= @  10.1.2011,  14:01 Найти цитируемый пост)
А тачпанель реагирует на обе кнопки в любом подразделе. 

У вас room_id у обоих подразделов равны 0, а подраздел не проверяется

Цитата(=Женек= @  10.1.2011,  14:01 Найти цитируемый пост)
А как изменить мудреный (для меня, любителя) синтаксис функции, чтобы она учитывала и номер подокна?

Добавить в условие -
Код

if (btn->id==ROOM_ID) is_active=(btn->x & BIT(room_id)) && (btn->y & BIT(subroom_id)); else


PM MAIL   Вверх
=Женек=
Дата 10.1.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Спасибо... Сделал как написали - перестали жаться кнопки 101 и 102 ( в секции // common buttons for all 3 rooms)
Я переделал, добавил битовую маску в y:

Код

{ROOM_ID,BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5),BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5)}, // common buttons for all 3 rooms
 {101,0,0,140,80}, // Button with ID 1 on coords (0,0,10,10)
 {102,680,0,800,80}, // Button with ID 2 on coords (20,20,25,25)



Кнопки стали нажиматься, но стало выводиться не то окно. Стало выводиться как раз несуществующее окно с параметрами этой секции (то есть программа нарисовала 2 кнопки, а координаты нажатия определила по этим двум общим кнопкам. 
Да, забыл сказть, что проблема только для окна room=0,sub_room=0. С остальными окнами проблемы нет.
Вывожу окошко так:

1. Программа анализирует room и sub_room, лезет в массив, ищет секцию с подходящую под номера room и sub_room.
2. В зависимости от того, сколько кнопок находит (при подсчете кнопки 101,102,103, 104 пропускаются) выводит их на экран соответствующм кодом (расположение кнопок на экране зависит от их количества и варианта расположения 4).

Код

void DrawDesk(unsigned char room, unsigned char sub_room, unsigned char vp)
{
Button __flash* btn=buttons;
 char is_active=0;
 unsigned char buttons_count=0;          
  
  PasteFromClipboard(83,110);

  for(;btn->id!=END_ID;++btn)
   if ( (btn->id==ROOM_ID) && (btn->x & BIT(room)) && (btn->y & BIT(sub_room)) )
    {
    btn++;
    while ((btn->id != ROOM_ID) && (btn->id != END_ID)) 
    {
      if (btn->id==103) DrawImage(103,5,242); 
       else if (btn->id==104) DrawImage(104,733,242);
//       else if (btn->id==101) {low_beep();}
//       else if (btn->id==102) {}              
       else buttons_count++;
      btn++;    
    }  
    }

  //CursorXY(100,200);
  //sprintf(s,"XX %u",buttons_count);
  //PutString(s);

     
   
   if (buttons_count==1)
     {
       CopyRect(399,143,531,285,3,258,184,vp);
       CopyRect(462,371,615,455,3,391,219,vp);
     
       //Rect(278,219,544,303,clRed);
                   
     }
      
   if (buttons_count==2)
     {
       CopyRect(133,143,265,285,3,83,184,vp);
       CopyRect(154,371,307,455,3,216,219,vp);       
       CopyRect(308,371,461,455,3,430,219,vp);
       CopyRect(266,143,398,285,3,584,184,vp);
       
       //Rect(103,219,369,303,clRed);
       //Rect(430,219,696,303,clRed);       
     }                 
     
   if (buttons_count==3)
     {
     CopyRect(0,0,132,142,3,83,110,vp);
     CopyRect(0,286,153,370,3,216,145,vp);
     
     CopyRect(154,286,307,370,3,430,145,vp);
     CopyRect(133,0,265,142,3,584,110,vp);

     CopyRect(0,143,132,285,3,253,258,vp);
     CopyRect(0,371,153,455,3,386,293,vp);
     
     //Rect(103,145,369,229,clRed);
     //Rect(430,145,696,229,clRed);
     //Rect(273,293,539,377,clRed);
     
                                                                       
     }
                       
   if (buttons_count==4)
     {
     
     CopyRect(0,0,132,142,3,83,110,vp);
     CopyRect(0,286,153,370,3,216,145,vp);
     
     CopyRect(154,286,307,370,3,430,145,vp);
     CopyRect(133,0,265,142,3,584,110,vp);

     CopyRect(308,286,461,370,3,90,293,vp);
     CopyRect(266,0,398,142,3,244,258,vp);

     CopyRect(399,0,531,142,3,423,258,vp);
     CopyRect(462,286,615,370,3,556,293,vp);
   

     //Rect(103,145,369,229,clRed);
     //Rect(430,145,696,229,clRed);
     //Rect(90,293,356,377,clRed);
     //Rect(443,293,709,377,clRed);
     
     
     }



  

  
      
    
    
  

    
}



Но программа сразу цепляется за {ROOM_ID,BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5),BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5)}, // common buttons for all 3 rooms думая, что нашла окно с параметрами room=0, sub_room=0.
С остальными окнами проблемы нет.


PM MAIL   Вверх
=Женек=
Дата 10.1.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Ларчик просто открывался. Заменил & на == в
Код

if ( (btn->id==ROOM_ID) && (btn->x == BIT(room)) && (btn->y == BIT(sub_room)) )

PM MAIL   Вверх
xvr
Дата 10.1.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(=Женек= @  10.1.2011,  18:56 Найти цитируемый пост)
Ларчик просто открывался. Заменил & на == в
Это неправильно. Оригинальный вариант позволял задать набор одних и тех же кнопок для набора окон. В варианте == наборы работать не будут

Цитата(=Женек= @  10.1.2011,  18:21 Найти цитируемый пост)
Но программа сразу цепляется за {ROOM_ID,BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5),BIT(0)|BIT(1)|BIT(2)|BIT(3)|BIT(4)|BIT(5)}, // common buttons for all 3 rooms думая, что нашла окно с параметрами room=0, sub_room=0.

Правильно цепляется - вы же ей сами написали BIT(0) в room_id и в subroom_id (x и y)

Цитата(=Женек= @  10.1.2011,  18:21 Найти цитируемый пост)
В зависимости от того, сколько кнопок находит (при подсчете кнопки 101,102,103, 104 пропускаются) выводит их на экран соответствующм кодом (расположение кнопок на экране зависит от их количества и варианта расположения 4).

Весьма странный способ рисования кнопок  smile 
Стоит данные для рисования кнопок засунуть в тот же массив, а не пытаться вычислить расположение звезд по количеству астрономов, их наблюдающих  smile 

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.