|
Быстрый доступ к элементу. |
|
|
|
 |
Ответов
|
Oct 24 2017, 12:10
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Ну и чисто эстетический момент. Лично меня вымораживает возврат таких простых флагов через указатели на переменные. Куда оптимальнее выглядит все вот так: CODE #define MESSAGE_ARR_SIZE 128
typedef struct TEST_MESSAGE { union { char data[20]; struct TEST_MESSAGE *next; }; }TEST_MESSAGE;
typedef struct { int id; TEST_MESSAGE *p; }TEST_MESSAGE_P;
TEST_MESSAGE *MsgFreeQ;
TEST_MESSAGE messages[MESSAGE_ARR_SIZE]; TEST_MESSAGE_P msg_p[MESSAGE_ARR_SIZE];
int glob_pos;
int BinarySearch(TEST_MESSAGE_P *a, int pos, int key) { int first = 0; int last = pos; int mid; if (pos == 0) //empty array { return ~0; } else if (a[0].id > key) { return ~0; } else if (a[pos - 1].id < key) { return ~pos; } while (first < last) { mid = first + (last - first) / 2;
if (key <= a[mid].id) last = mid; else first = mid + 1; }
if (a[last].id == key) { return last; } else { return ~last; } }
TEST_MESSAGE *AllocMessage(void) { TEST_MESSAGE *p=MsgFreeQ; if (p) MsgFreeQ=p->next; return p; }
void FreeMessage(TEST_MESSAGE *p) { p->next=MsgFreeQ; MsgFreeQ=p; }
void InitMessageQ() { for(unsigned int i=0; i<MESSAGE_ARR_SIZE; i++) { FreeMessage(messages+i); } }
void InsertElement(int id, char msg[]) { int idx; idx = BinarySearch(msg_p, glob_pos, id); if (idx>=0) //command NEW but the element exists - issue UPDATE { UpdateElement(msg_p[idx]->p, msg); //void UpdateElement(TEST_MESSAGE *p, char *inmsg) } else //element not found - add one { idx=~idx; TEST_MESSAGE *nm=AllocMessage(); if (!nm) nm=msg_p[MESSAGE_ARR_SIZE-1].p; //Если не удалось аллоцировать новый элемент - заменяем последний memmove(msg_p+(idx+1), msg_p+idx, sizeof(TEST_MESSAGE_P)*(glob_pos-1-idx)); msg_p[idx].id = id; msg_p[idx].p=nm; memcpy(nm->data, msg, sizeof(nm->data)); if (glob_pos < MESSAGE_ARR_SIZE) glob_pos++; } }
void DeleteElement(int id) { int idx; idx = BinarySearch(msg_p, glob_pos, id); if (idx>=0) { FreeMessage(msg_p[idx]->p); memmove(msg_p+idx, msg_p+(idx+1), sizeof(TEST_MESSAGE_P)*(glob_pos-1-idx)); if (glob_pos > 0) glob_pos--; } }
QUOTE а зачем делать алокацию? у меня статический масив. место уже выделено. по времени это не будет одно и то же? мне все равно придется создать место для элемента. Что значит одно и то же? Копирование, скажем 128 элементов по 24 байта это медленнее, чем копирование 128 элементов по 8 байт? Или одно и то же? Очередь свободных элементов создана заранее, прямо на месте буфера данных. Аллоцирование и освобождение элемента занимает буквально несколько тактов, это же не malloc из библиотеки, посмотрите на функции, я же их написал.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Oct 24 2017, 12:17
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Rst7 @ Oct 24 2017, 17:10)  Ну и чисто эстетический момент. Лично меня вымораживает возврат таких простых флагов через указатели на переменные. Куда оптимальнее выглядит все вот так: CODE #define MESSAGE_ARR_SIZE 128
typedef struct TEST_MESSAGE { union { char data[20]; struct TEST_MESSAGE *next; }; }TEST_MESSAGE;
typedef struct { int id; TEST_MESSAGE *p; }TEST_MESSAGE_P;
TEST_MESSAGE *MsgFreeQ;
TEST_MESSAGE messages[MESSAGE_ARR_SIZE]; TEST_MESSAGE_P msg_p[MESSAGE_ARR_SIZE];
int glob_pos;
int BinarySearch(TEST_MESSAGE_P *a, int pos, int key) { int first = 0; int last = pos; int mid; if (pos == 0) //empty array { return ~0; } else if (a[0].id > key) { return ~0; } else if (a[pos - 1].id < key) { return ~pos; } while (first < last) { mid = first + (last - first) / 2;
if (key <= a[mid].id) last = mid; else first = mid + 1; }
if (a[last].id == key) { return last; } else { return ~last; } }
TEST_MESSAGE *AllocMessage(void) { TEST_MESSAGE *p=MsgFreeQ; if (p) MsgFreeQ=p->next; return p; }
void FreeMessage(TEST_MESSAGE *p) { p->next=MsgFreeQ; MsgFreeQ=p; }
void InitMessageQ() { for(unsigned int i=0; i<MESSAGE_ARR_SIZE; i++) { FreeMessage(messages+i); } }
void InsertElement(int id, char msg[]) { int idx; idx = BinarySearch(msg_p, glob_pos, id); if (idx>=0) //command NEW but the element exists - issue UPDATE { UpdateElement(msg_p[idx]->p, msg); //void UpdateElement(TEST_MESSAGE *p, char *inmsg) } else //element not found - add one { idx=~idx; TEST_MESSAGE *nm=AllocMessage(); if (!nm) nm=msg_p[MESSAGE_ARR_SIZE-1].p; //Если не удалось аллоцировать новый элемент - заменяем последний memmove(msg_p+(idx+1), msg_p+idx, sizeof(TEST_MESSAGE_P)*(glob_pos-1-idx)); msg_p[idx].id = id; msg_p[idx].p=nm; memcpy(nm->data, msg, sizeof(nm->data)); if (glob_pos < MESSAGE_ARR_SIZE) glob_pos++; } }
void DeleteElement(int id) { int idx; idx = BinarySearch(msg_p, glob_pos, id); if (idx>=0) { FreeMessage(msg_p[idx]->p); memmove(msg_p+idx, msg_p+(idx+1), sizeof(TEST_MESSAGE_P)*(glob_pos-1-idx)); if (glob_pos > 0) glob_pos--; } }
Что значит одно и то же? Копирование, скажем 128 элементов по 24 байта это медленнее, чем копирование 128 элементов по 8 байт? Или одно и то же? Очередь свободных элементов создана заранее, прямо на месте буфера данных. Аллоцирование и освобождение элемента занимает буквально несколько тактов, это же не malloc из библиотеки, посмотрите на функции, я же их написал. я понял. сейчас попробую. Результаты такие. Вставка происходит. Только sizeof(TEST_MESSAGE_P)*(glob_pos-1-idx) я заменил на sizeof(TEST_MESSAGE_P)*(glob_pos-idx) иначе вылетает. Элементы вставляются но p->data всех элементов содержит данные последнего элемента и p->next всех элементов указазывает на последний элемент.
Сообщение отредактировал Jenya7 - Oct 25 2017, 07:27
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
Jenya7 Быстрый доступ к элементу. Oct 22 2017, 08:54 jcxz Цитата(Jenya7 @ Oct 22 2017, 11:54) Пробл... Oct 22 2017, 09:09 Jenya7 Цитата(jcxz @ Oct 22 2017, 14:09) Сделайт... Oct 22 2017, 09:20 Rst7 QUOTE И тут я вспомнил работу с SQL базами данных ... Oct 22 2017, 09:14 jcxz Цитата(Rst7 @ Oct 22 2017, 12:14) Потому ... Oct 22 2017, 09:33  Jenya7 Цитата(jcxz @ Oct 22 2017, 14:33) 1. Заче... Oct 22 2017, 09:48   jcxz Цитата(Jenya7 @ Oct 22 2017, 12:48) допус... Oct 22 2017, 09:52   k155la3 Цитата(Jenya7 @ Oct 22 2017, 12:48) . . .... Oct 22 2017, 10:07 Rst7 QUOTE переберите все сочитания 0-10000 и 0-255. Уж... Oct 22 2017, 09:28 Jenya7 Цитата(Rst7 @ Oct 22 2017, 14:28) Вы не п... Oct 22 2017, 09:34 Rst7 QUOTE 1. Зачем хранить указатели на пакеты? Вместо... Oct 22 2017, 09:36 Jenya7 Цитата(Rst7 @ Oct 22 2017, 14:36) В данно... Oct 22 2017, 09:52  jcxz Цитата(Jenya7 @ Oct 22 2017, 12:52) Допус... Oct 22 2017, 10:04   Jenya7 Цитата(Rst7 @ Oct 22 2017, 14:59) В данно... Oct 22 2017, 10:07    jcxz Цитата(Jenya7 @ Oct 22 2017, 13:07) то ес... Oct 22 2017, 10:18     Jenya7 Цитата(jcxz @ Oct 22 2017, 15:18) Я уже н... Oct 22 2017, 10:24     k155la3 Цитата(jcxz @ Oct 22 2017, 13:18) . . . .... Oct 22 2017, 10:32      Jenya7 Цитата(k155la3 @ Oct 22 2017, 15:32) Это ... Oct 22 2017, 10:39      jcxz Цитата(k155la3 @ Oct 22 2017, 13:32) Это ... Oct 22 2017, 11:15 Rst7 QUOTE Допустим у меня массив с ID 3 5 7 13 25 178 ... Oct 22 2017, 09:59 Rst7 QUOTE Исходить надо из случая заполненности всего ... Oct 22 2017, 10:07 Rst7 А вообще-то для полной универсальности топикстарте... Oct 22 2017, 10:09 Jenya7 Цитата(Rst7 @ Oct 22 2017, 15:09) А вообщ... Oct 22 2017, 10:16  Rst7 QUOTE (Jenya7 @ Oct 22 2017, 13:16) это к... Oct 22 2017, 10:47   Jenya7 Цитата(Rst7 @ Oct 22 2017, 15:47) Еще раз... Oct 22 2017, 10:49    Rst7 QUOTE (Jenya7 @ Oct 22 2017, 13:49) Посмо... Oct 22 2017, 11:33     Jenya7 Цитата(Rst7 @ Oct 22 2017, 16:33) Ну если... Oct 22 2017, 11:38 Rst7 QUOTE а я понял. ну вот в этом вопрос - насколько ... Oct 22 2017, 10:59 Rst7 QUOTE Да ладно! Какой компилятор? IAR-овский m... Oct 22 2017, 11:22 jcxz Цитата(Rst7 @ Oct 22 2017, 14:22) Итого з... Oct 22 2017, 11:31 Jenya7 Rst7, jcxz.
Большое вам спасибо. Сделаю так.
Вооб... Oct 22 2017, 11:30 Rst7 QUOTE вы говорите на больших размерах можно подума... Oct 22 2017, 11:41 Jenya7 Цитата(Rst7 @ Oct 22 2017, 16:41) Даже не... Oct 22 2017, 12:37 Jenya7 хотел уточнить такой вопрос
для вставки
Кодmemmove... Oct 23 2017, 11:36 Rst7 QUOTE получается я должен добавить отступ?
Нет. Н... Oct 23 2017, 13:16 Jenya7 Цитата(Rst7 @ Oct 23 2017, 19:16) Нет. На... Oct 23 2017, 13:24 Rst7 QUOTE но а+2 не будет адресом элемента a[2].
Что ... Oct 23 2017, 14:04 Jenya7 Цитата(Rst7 @ Oct 23 2017, 20:04) Что зна... Oct 23 2017, 14:35 XVR Советую отделить id от data и хранить id+индекс в ... Oct 23 2017, 21:16 Jenya7 Цитата(XVR @ Oct 24 2017, 02:16) Советую ... Oct 24 2017, 06:23 ViKo Высказываю идею. Пока пакетов меньше 1024 (чисто п... Oct 24 2017, 07:43 Jenya7 Результаты такие. При добавлении элемента я вылета... Oct 24 2017, 07:44 ViKo Цитата(Jenya7 @ Oct 24 2017, 10:44) так я... Oct 24 2017, 08:05 skripach Цитата(Jenya7 @ Oct 22 2017, 11:54) масси... Oct 24 2017, 07:55 Jenya7 Нашел проблемку. Функция вставки в причесанном вар... Oct 24 2017, 08:41 Rst7 Ну правильно вот так
CODEmemcpy(messages... Oct 24 2017, 10:09 Jenya7 Цитата(Rst7 @ Oct 24 2017, 15:09) Ну прав... Oct 24 2017, 11:12 Rst7 QUOTE не совсем понимаю. memmove переносит из адре... Oct 24 2017, 11:41 Jenya7 Цитата(Rst7 @ Oct 24 2017, 16:33) Вы пере... Oct 24 2017, 11:43 Rst7 QUOTE ммм...а можете показать как. я не понимаю на... Oct 24 2017, 11:57 Jenya7 Цитата(Rst7 @ Oct 24 2017, 16:57) Обновит... Oct 24 2017, 12:07 Jenya7 по моему в
КодTEST_MESSAGE *AllocMessage(void... Oct 26 2017, 07:34 Rst7 QUOTE Элементы вставляются но p->data всех элем... Oct 26 2017, 08:00 Jenya7 Цитата(Rst7 @ Oct 26 2017, 14:00) Ээээ, т... Oct 26 2017, 09:23  Rst7 QUOTE (Jenya7 @ Oct 26 2017, 12:23) Да. Н... Oct 26 2017, 09:47   Jenya7 Цитата(Rst7 @ Oct 26 2017, 15:47) Я так з... Oct 26 2017, 10:39 Rst7 Я не понимаю, что Вы смотрите. Все поля msg_p[i].p... Oct 26 2017, 11:29 Jenya7 Цитата(Rst7 @ Oct 26 2017, 16:29) Что печ... Oct 26 2017, 11:36
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|