The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Написание плагина для IRC-клиента X-Chat (plugin gcc)"
Отправлено NeTxXx, 13-Июн-05 16:28 
Еще хотелось бы добавить пару слов о принципе реализации списка пользователей.
Все делается очень просто.
Объявляем массив указателей на приведенную выше структуру:
static UDATA **u_list;
Также определяем переменную-счетчик пользователей
static uint u_count;

Далее пишем функцию инициализации списка:
void ulist_init(void) {
    u_count = 0; // обнуляем счетчик
    // выделяем память под один элемент типа UDATA*, т.е. указатель.
    // в большинстве случаев его размер равен 32-ум битам
    u_list = (PUDATA)malloc(sizeof(UDATA*)*1);
    memset(u_list,0,sizeof(UDATA*)*1); // заполняем память нулями
    return;
}

Соответственно, функция освобождения памяти (деинициализации):
void ulist_free(void) {
    uint i = 0;
    for (i=0;i<u_count;i++) { // поочередно освобождаем память
        if (u_list[i]) free(u_list[i]); // всех элементов списка (не забывая делать проверку на вшивость)
    }
    if (u_list) free(u_list); // освобождаем память самого списка
    return;
}

Новый элемент добавляется путем добавления в конец списка указателя на новый элемент.
Для этого нам необходимо увеличить размер самого списка ровно на sizeof(UDATA*):
void ulist_add(char *name, char *lastmsg, char *channel, uint r_count) {
    UDATA *pu = malloc(sizeof(UDATA)); // выделяем память под нового пользователя
    // далее заполняем все необходимые поля структуры
    strncpy(pu->u_name,name,sizeof(pu->u_name));
    strncpy(pu->u_lastmsg,lastmsg,sizeof(pu->u_lastmsg));
    strncpy(pu->u_channel,channel,sizeof(pu->u_channel));
    pu->u_rcounter = r_count;
    pu->u_thook = NULL;
    // присваиваем последнему элементу списка адрес структуры,
    // увеличивая после этого счетчик элементов
    u_list[u_count++] = pu;
    // увеличиваем размер списка. (new_size = sizeof(void*)*count)
    u_list = (PUDATA)realloc(u_list,sizeof(UDATA*)*u_count);
    return;
}

Еще нам понадобятся функции поиска и редактирования пользователя. Предлагаю написать их
самостоятельно, для того чтобы хоть чуточку поднапрячь ваш мозговой центр :)
Принцип этих функций довольно прост и очевиден.
Все же я поясню.. Для поиска пользователя по его имени просто пробегаем циклом по всем элементам
списка, сравнивая имя пользователя в текущем элементе с искомым именем. При совпадении, просто
возвращаем указатель на этот элемент.

С редактированием еще проще. Так же как и в функции поиска получаем нужный элемент списка и
устанавливаем новые значения всем элементам структуры.
Надеюсь, с этим каких бы то ни было трудностей не возникнет.

и еще, в конец главного модуля неплохо бы было добавить функцию деинициализации и освободить память под массив пользователей

// deinitialization entry point
int xchat_plugin_deinit (xchat_plugin *plugin_handle)
{

    // releasing user list
    ulist_free();
    xchat_print (plugin_handle, "norepeat-plugin unloaded\n");

    return 1;
}

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру