- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
SGELISTENTRY *sgeListAdd(SGELIST *l, const char *id, void *data) {
SGELISTENTRY *ret;
sgeNew(ret, SGELISTENTRY);
l->numberOfEntries++;
if (l!=NULL) {
ret->prev=l->last;
} else {
ret->prev=NULL;
}
if (l!=NULL && l->last!=NULL) {
l->last->next=ret;
}
ret->next=NULL;
ret->id=strdup(id);
ret->data=data;
if (l==NULL) return ret;
if (l->first==NULL) l->first=ret;
l->last=ret;
return ret;
}
Анонимус 21.11.2014 21:48 # 0
Кстати, а есть ведь наверняка для сей какой-то способ указать контракт: дескать параметр не может быть NULL, и чтоб потом статический анализ делать и ругаться на такие вещи?
------------
Например для Java в Idea у менять есть аннотация @NotNull.
Ну и для C# тоже
Soul_re@ver 22.11.2014 01:33 # +1
Компиляторы эту строчку так и понимают и радостно выкидывают последующие проверки нахер. Нормальные анализаторы должны на это ругаться (линт и шланг ругаются)
bot 22.11.2014 03:24 # 0
Анонимус 22.11.2014 13:04 # +1
bormand 22.11.2014 08:23 # 0
Pythoner 22.11.2014 08:53 # 0
A нa caмoм тo дeлe этo нe пpocтoй cвязнoй cпиcoк, a нeкaя cyщнocть, пycть и кpивo, нo peaлизyющaя интepфeйc accoциaтивнoгo мaccивa нa eгo ocнoвe.
Поиск ноды вобще красота:
bormand 22.11.2014 08:58 # 0
P.S. Ну разве что id должно быть const char *, а не char *.
Pythoner 22.11.2014 09:06 # 0
Я бы сделал как const int id, задефайнил где то ид ноды, и далее искал простым сравнением вместо strcmp.
bormand 22.11.2014 09:10 # 0
P.S. Небольшие alist'ы не так уж и тормозят.
Pythoner 22.11.2014 09:17 # 0
Анонимус 22.11.2014 13:12 # 0
TarasB 22.11.2014 21:08 # 0
Анонимус 22.11.2014 22:25 # 0
TarasB 23.11.2014 13:44 # +1
Анонимус 23.11.2014 15:48 # +1
Тоесть если там лежит три калеки, то он все равно будет занимать 2^16 байт?
Анонимус 22.11.2014 13:08 # 0
А Вы всегда используете ассоциативные массивы c O(N)?
bormand 22.11.2014 13:13 # 0
Хоспаде... Нет конечно. Но если мне надо распарсить какой-нибудь конфиг при старте проги, а под рукой только alist или вообще ничего - я не пойду искать/писать хешмапу/дерево только из-за того, что она быстрее.
Анонимус 22.11.2014 13:15 # 0
Если человек пишет на плейн сях, то скорее всего он хочет СКОРОСТИ, разве нет?
Другой вопрос что может быть в этот лист чаще добавляют, чем пишут
bormand 22.11.2014 13:16 # 0
Нет.
Анонимус 22.11.2014 13:17 # 0
Вообще какой смысл вручную писать ассоциативный массив?
bormand 22.11.2014 13:26 # 0
А плейнсишку сейчас есть смысл юзать только там, где языки более высокого уровня вообще не справятся (ядра, дрова, рантаймы), либо справятся, но медленно или с большим расходом ресурсов.
> вручную писать ассоциативный массив
Изкоробочного то нет. А использование внешних либ под вопросом.
3.14159265 22.11.2014 14:12 # 0
Так вот казалось бы сишка — сверхбыстрый язык, а пострадали от квадратичной питушни.
Анонимус 22.11.2014 15:48 # 0
вот прямо там нету мапы готовой?
>>рантаймы
хм.. а почему не кресты с их std::map?
>>внешних либ
Ну он все равно не будет одно и тоже писать 10 раз, все равно он сделает себе либу и будет с нею линковаца (пусть и статически). Поцчему не взять готовое то?
Abbath 22.11.2014 16:26 # 0
Только петушилово со свитчами.
bormand 22.11.2014 13:31 # 0
Одно дело - как реализовать конкретный контейнер.
И совсем другое - в каких случаях нужно юзать его, а не какой-то другой.
С точки зрения реализации конкретного контейнера - тут всё ок. Мелкие косяки, не более того. Тестирование и ревью их пофиксят.
Анонимус 22.11.2014 15:38 # +1
wvxvw 22.11.2014 13:44 # 0
По этой же причине, например, практические реализации квиксорта использую сортировку вставкой для маленьких массивов.
Реализация ассоциативного списка без наворотов имеет все шансы обогнать хеш-таблицу на списках до 8-16 элементов.
Анонимус 22.11.2014 15:39 # 0
Pythoner 22.11.2014 14:43 # 0
bormand 22.11.2014 15:10 # 0
Говно тут скорее всего в отсутствии тестов.
guest 22.11.2014 15:18 # 0
gost 22.11.2014 17:14 # +1
guest 22.11.2014 21:00 # 0
gost 22.11.2014 21:02 # 0
inkanus-gray 22.11.2014 22:29 # 0
bormand 22.11.2014 22:32 # +1
У NULL'а?
inkanus-gray 22.11.2014 22:34 # 0
bormand 22.11.2014 22:38 # 0
Оператор ++ анализирует стек вызвавшей процедуры, отыскивает в нем переменную l и тайком помещает в нее NULL?
Анонимус 22.11.2014 23:11 # 0
bormand 22.11.2014 23:18 # 0
Разве что макрос sgeNew его туда положил...
Анонимус 22.11.2014 23:32 # 0
1) l -- указатель на структуру SGELIST
2) Внутри этой структуры храница указатель на какой-то numberOfEntries
3) Что было с инстансом этой структуры до её попадания в функцию мы не знаем
4) Если представить что numberOfEntries это не int, а какой-то объект то где-то наверху могло быть сказано [тут_идет_приведенный_Вами_код
bormand 22.11.2014 23:37 # 0
Так что всё верно, но "где-то наверху" ограничивается строчками 2-4 этой функции.
bormand 22.11.2014 23:40 # 0
bormand 22.11.2014 23:42 # 0
Анонимус 22.11.2014 23:44 # +1
Как вредно писать неподумав:-.
Soul_re@ver 22.11.2014 22:33 # +2
Pythoner 22.11.2014 22:39 # 0
http://sourceforge.net/projects/sge2d/
bormand 22.11.2014 23:25 # 0
Pythoner 23.11.2014 00:00 # 0
bormand 23.11.2014 00:11 # 0
Pythoner 23.11.2014 00:15 # 0
bormand 23.11.2014 00:14 # 0
bormand 23.11.2014 00:15 # 0
Pythoner 23.11.2014 00:27 # +1
Тоже производительности добавляет.