Все для Sony Ericsson, патчи, эльфы, моддинг, прошивка
  
Логин: Пароль: Запомнить: Привет гость! Зарегистрируйся или авторизируйся для получения доп. возможностей!
Разделы
PDA версия сайта
TrackIDentify
Новости
Статьи
Файлы
Патчи
Патчи A2
Патчи db2020
Эльфы
Исходники эльфов
Wiki
Форум
Опросы
Обратная связь
Развернуть/Свернуть
 
Развернуть/Свернуть

Урок: разбираем списки, часть 1 : Эльфостроение : Эльфы : Форум : Для Sony Ericsson патчи эльфы моддинг прошивка
/  Список форумов
   /  Эльфы
      /  Эльфостроение
   /  Урок: разбираем списки, часть 1
На печать 
Правила 


arban


Elfmaker


Регистрация: 2.3.08
Сообщений: 802
Репутация: 3111





 
  #1 [09.11.09, 19:22] Урок: разбираем списки, часть 1   

 
И так, цель нашего урока - понять зачем нужны списки объектов (LIST'ы, листы). Допустим, нам надо сделать эльф, который будет читать из файла какие-то данные и выводить их удобным образом, например в виде пунктов, или выводить список файлов в папке - примеров можно придумать кучу. Таким образом - листы помагают удобно и быстро распределять объекты в памяти. Это удобство достигается специальными функциями для работы со списками:

Код: 
LIST *List_New(void);
void List_Free(LIST *lst);
void ListElement_AddtoTop(LIST *lst,void *newElement);
void * ListElement_Remove(LIST *lst,int index);
int ListElement_Prt2NumElement(LIST *lst,void *ptr);
int ListElement_Find(LIST *lst,void *element, int (*cmp_proc)(void *,void *));
void * ListElement_GetByIndex(LIST * , int index);
void ListElement_Add(LIST *lst,void *newElement);
void List_FreeElements(LIST *,int (*cmp_proc)(void * elem_from_list),void (*freefunc)(void * elem_from_list));
void ListElement_Insert(LIST *lst, int i, void *new_item);


Сейчас все функции мы разбирать не будем, а рассмотрим основные моменты.

Для начала необходимо создать список. Он будет находится в переменной list. Перед этим расскажу немного о структуре LIST:

Код:
typedef struct
{
  u16 unk;//неизвестно
  u16 FirstFree;//кол-во пунктов
  void **listdata;//массив с данными
}LIST;


Теперь приступим!

1. Объявляем list как указатель:

Код:
LIST * list;


2. Создаем свою структуру, содержащую какое-то число и строку, и называем её ITEM:

Код:
typedef struct
{
   int number;// число
   wchar_t * string;//строка
}ITEM;


3. Пишем функцию для создания списка, она не будет возвращать никакого значения, поэтому её тип - void, также она не содержит параметров. Я делаю для этого отдельную функцию только для оптимизации при использовании её в нескольких местах, да и код выглядит красивее. Ещё советую давать понятные имена функциям, например: List_Create, List_Destroy, List_Save и т.д.

Код: 
void List_Create()
{
 list=List_New();//выделяем память под список
 for(int i=0;i<10;i++)//запускаем цикл для добавления 10-ти пунктов
  {
    ITEM *item=new ITEM; //создаем новую переменную типа ITEM
    memset(item,0,sizeof(ITEM));// выделяем для неё память
    item->number=i;//присваиваем переменной number в структуре ITEM текущего пункта значение i
    wchar_t buf[1];//создаем так называемый буффер, для хранения временной строчки
    //тип wchar_t - строка в кодировке Unicode
    snwprintf(buf, 2, L"%d", i);//функцией записываем в буффер число как строку
    item->string=new wchar_t[wstrlen(buf)+1];// выделяем память под строку
    //string в структуре ITEM в размере буффера buf
    //единицу прибавлять в таком случае обязательно! 
    //иначе символ L'\0' не запишется в строку
    wstrcpy(item->string, buf); //наконец, копируем в item->string строку buf
    ListElement_Add(list, item);//добавляем всё это дело в список
  }  
}


Вроде бы всё расписал тут, что не понятно - не стесняйтесь спрашивать. Эту функцию очень легко отредактировать под свои

нужды.

4. Теперь пришло время функции уничтожения списка, назовем её List_Destroy, также для удобства напишем простенький макрос:

Код:
#define DELETE(a) if (a) {delete(a);a=0;} //если объект a не равен 0, то очищаем память, занятую им

Код: 
void List_Destroy()
{
if (list)//если список list существует
  {
    while (list->FirstFree)//если есть ещё пункты в списке
    {
      ITEM* it=(ITEM*)ListElement_Remove(menu->list,0);//удаляем пункт с индексом(номером) 0 
      //из списка и присваиваем его указатель переменной it.
      //Можно удалять и последний пункт, но так удобней.
      DELETE(it->string);// очищаем память, выделенную под строку it->string
      DELETE(it);//очищаем память, выделенную под сам пункт it
    }
    List_Free(list);//удаляем список
  }
}



Если вы не поняли зачем List_Destroy - при создании списка вы выделяли память под список, пункты, строки в пунктах, если это

всё не "убивать" то происходит утечка памяти, тоесть нужно очистить память, занятую этими объектами.

5. Располагаем функции где нам необходимо, например:

- List_Create помещаем в main
- List_Destroy в onMyBookClose (в ту функцию, где обрабатывается ивент закрытия книги)

Лучше всего уничтожать лист, когда он уже не используется.

Вот, собственно, на сегодня и всё. Что не так, не понятно и т.д. - отписывайтесь :)

(c)arban




LG Optimus
My SVN | Elflib Wiki | Elf SVN
Спасибо сказали: Crong, DuXeN0N, lisaus, Olegat0r, vodoo999, SERGK393, D3mon

den_po


Developer/Admin


Регистрация: 27.3.06
Сообщений: 3279
Репутация: 10763
Откуда: Чебоксары




 
  #2 [09.11.09, 19:33] Re: Урок: разбираем списки, часть 1   

 
arban пишет:
- List_Destroy обязательно (!!!) помещать при закрытии книги

смущает это заявление

куча списковых функций, тех, что есть в либе, и что нету, описана тут http://supertrubka.org/wiki/doku.php?id=index&idx=firmware




promt is better than google translate

mmcorp


Patcher/Elfmaker


Регистрация: 14.5.08
Сообщений: 358
Репутация: 2528
Откуда: Ржев




 
  #3 [30.09.10, 21:31] Re: Урок: разбираем списки, часть 1   

 
я бы рекомендовал в функции List_Destroy() удалять последний элемент из списка, так как при его "выемки" из списка сдвига элементов происходить не будет, работать очищение листа будет в разы быстрее, особенно для листов с количеством элементов >>5000




не занимаюсь эльфами и патчами (=
Siemens c75 -> SonyEricsson k610i + SonyEricsson w595 + SonyEricsson w580i -> HTC Desire Z


Похожие темы
 ТемаОтветыАвторПросмотрыОбновление
  Урок: создаём GUI, часть 16arban1336401.08.10, 22:32
  Урок: создаём GUI, часть 21arban758823.02.09, 20:23
  лишняя часть3=paha=491717.03.09, 18:51

  • Поиск
  • Права
Вы не можете начинать темы.
Вы не можете редактировать свои сообщения.
Вы не можете создавать опросы.
Вы не можете вкладывать файлы в сообщения.
Вы не можете отвечать на сообщения.
Вы не можете удалять свои сообщения.
Вы не можете голосовать.

Главная Новости Статьи Файлы Патчи Форум Опросы PDA
- Генерация страницы: 0.11 секунд | 10 Запросов | HTML: 34.34 КБ -