- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
template < typename CType >
void list < CType >::sorted_push(CType val, long int key)
{
if (head) {
// Создаём контейнер и помещаем в него полученное значение
container < CType > *new_cont;
container < CType > *tmp = head;
new_cont = new container < CType >;
new_cont->set_key(key);
new_cont->set_cargo(val);
while ((tmp != tail) && (key > (tmp->get_key())))
tmp = tmp->get_next();
if ((tmp == tail) && (key > (tmp->get_key()))) { // Если выполнились одновременно два условия в цикле
new_cont->set_next(tmp->get_next()); // Вставляем в самый конец
new_cont->set_past(tmp);
tmp->set_next(new_cont);
tail = new_cont;
} else {
new_cont->set_next(tmp);
new_cont->set_past(tmp->get_past());
if ((tmp->get_past()) != NULL)
tmp->get_past()->set_next(new_cont);
if (tmp == head)
head = new_cont;
tmp->set_past(new_cont);
}
if (empty) {
empty = false;
tail = head;
}
} else {
container < CType > *new_cont;
new_cont = new container < CType >;
new_cont->set_key(key);
new_cont->set_cargo(val);
new_cont->set_next(head);
tail = head = new_cont;
empty = false;
}
}
template < typename CType > CType queue < CType >::pop()
{
container < CType > *tmp = list<CType>::head;
if (tmp == NULL) {
std::cerr <<
"Стек пуст! Стек возвращает мусор! ";
list<CType>::empty = true;
} else {
CType tmpval = list<CType>::head->get_cargo();
// Переходим к следующему элементу
list<CType>::head = list<CType>::head->get_next();
if (list<CType>::head == NULL)
list<CType>::empty = true;
delete tmp;
return tmpval;
}
}
template < typename CType > CType stack < CType >::pop()
{
container < CType > *tmp = list<CType>::tail;
if (tmp == NULL) {
std::cerr <<
"Очередь пуста! Возвращается мусор! ";
list<CType>::empty = true;
} else {
CType tmpval = list<CType>::tail->get_cargo();
// Переходим к предыдущему элементу
if (list<CType>::tail != list<CType>::head)
list<CType>::tail = list<CType>::tail->get_past();
else
list<CType>::empty = true;
delete tmp;
return tmpval;
}
}
kurwa 26.03.2016 00:14 # +1
bormand 26.03.2016 00:45 # 0
guest 26.03.2016 00:46 # 0
Давайте лучше обсудим вот http://goo.gl/9wa58a
Меня аж рапирает от желания поделиться
MAKAKA 29.10.2020 03:42 # 0
годно
>if ($_POST['table']=='xleb') $table=$_POST['table'];
братишка
bormand 26.03.2016 00:58 # +1
> Возвращается мусор!
За возврат мусора надо убивать. Но почему-то отсутствие return'а - всего лишь warning.
guest 26.03.2016 00:59 # 0
Так это же первое правило сей: "мусор на входе -- мусор на выходе", не?
bormand 26.03.2016 01:10 # 0
Не можешь вернуть - кидай исключение. Нелья исключение - делай аборт.
guest 26.03.2016 01:15 # 0
Существует два подхода сообшить о невозмжности сделать что-то:
1) потребовать от клиента всегда проверять возможность (и тогда если он полез без проверки можно кидать эксепшен или срать мусором)
2) возвращать заранее оговоренное (нуль, минус один итд)
В частности тут можно написать так: "клиент обязан следить за тем что очередь не пуста. Если пуста -- это UB и УГ"
bormand 26.03.2016 01:12 # +1
guest 26.03.2016 01:16 # 0
ну там в джавововом ентерпрайзе принято проверять Preconditions, чтобы сразу кинуть IllegalStateException("Can't pop, queue is null") чем вернуть null, и потом через 100 строк получить NPE
bormand 26.03.2016 02:01 # 0
guest 26.03.2016 02:06 # 0
тем более что ассерт можно отключить в продакшен коде (даже в жабе можно)
Макконел в своей красной книге "code complete" целую главу написал про правильные контракты
типа если у вас написано "не пихайте сюда число больше чем 42" то лучше сразу проверьте и упадите
с другой стороны один рубист писал что нефиг тратить строчки на "защиту от дурака". Если клиент кода не читает мануалов и сует пальцы в розетку -- сам дурак
3_14dar 26.03.2016 02:08 # 0
guest 26.03.2016 03:29 # 0
а мне казалось они добрые и японские
3_14dar 26.03.2016 03:34 # 0
guest 26.03.2016 05:26 # +1
Ну извини тогда
Может тебе в секцию бокса записаться?
MAKAKA 29.10.2020 03:41 # 0
так это везде принято
фаст фейлр же
viktorokh96 26.03.2016 01:22 # 0
guest 26.03.2016 01:26 # 0
viktorokh96 26.03.2016 01:32 # 0
Null где то задефайнен в 0, и компилер просто материться что тип который я ему сую ( а сую класс) не может принять ноль... Хотя можно бросать ссылку.. Хм а это идея))
viktorokh96 26.03.2016 01:38 # 0
Saehrimnir 28.10.2020 20:21 # 0
bormand 26.03.2016 01:58 # 0
А если хочется возвращать пустое значение - boost::optional в помощь.
viktorokh96 26.03.2016 02:40 # 0
kurwa 26.03.2016 03:19 # 0
bormand 26.03.2016 07:10 # 0
kegdan 26.03.2016 01:34 # 0
Щито? Щито блеадь?
guest 26.03.2016 01:52 # 0
сразу представляется как BP или SP перехлестывают через границу стека и делают stack underflow
А на самом деле там ничего даже близко такого нет
kegdan 26.03.2016 01:53 # −1
guest 26.03.2016 01:58 # 0
тебе кажется смешным тот факт что SP указывает на стек (и BP тоже, если не включен режим omit-frame-pointer)?
inkanus-gray 26.03.2016 02:01 # +1
guest 26.03.2016 02:07 # +3
Kozel 26.03.2016 09:13 # 0
guest 26.03.2016 16:52 # 0
так лучше?
bormand 26.03.2016 16:53 # 0
guest 26.03.2016 17:10 # 0
bormand 26.03.2016 17:35 # 0
guest 26.03.2016 17:37 # +2
тогда считайте что я сказал ESP и EBP
Просто у меня почерк такой что я E часто пишу как R
gost 27.03.2016 07:14 # 0
Antervis 29.03.2016 07:42 # 0
guest 29.03.2016 09:04 # 0
Вот тебе так и кажется
1024-- 29.03.2016 10:01 # 0
Сравните,
В первом случае видна суть алгоритма, во втором - видна реализация, а суть ускользает.
roman-kashitsyn 29.03.2016 11:02 # +2
Когда нет побочных эффектов, нет необходимости отличать ссылки и указатели от значений, поэтому в чистых функциональных языках указатели не нужны.
Поскольку чистые функциональные языки тоже не нужны, даже в каскеле есть IORef и прочие IOArray.
Ну и вся эта абстракция к тому же разбивается о суровые реалии производительности, поэтому часто важно использовать какой-нибудь UnboxedXxx и писать тонны бройлерплейта.
1024-- 29.03.2016 11:12 # +2
> разбивается о суровые реалии производительности
Вот в том и дело, что кроме сути в коде приходится вычитывать всякую питушню о производительности, особенностях хранения, особенностях языка.
P.S. А переполнение я не учёл ни там, не здесь. И вот придётся кому-то потом читать код правильного факториала ещё и с проверкой на переполнение.
roman-kashitsyn 29.03.2016 11:14 # +2
Добро пожаловать в суровый мир инженеров.
kegdan 29.03.2016 11:30 # +4
roman-kashitsyn 29.03.2016 11:33 # +1
kegdan 29.03.2016 11:36 # −1
guest 29.03.2016 12:05 # +2
CHayT 29.03.2016 14:53 # 0
guest 29.03.2016 14:56 # 0
То есть если у меня ранг состоит из 16x4 то у меня одна версия программы, а если 8x8 то другая?
Даже КК признавал что 80% его оптимизаций специфичны для конкретного чипсета (точнее контроллера памяти) а теперь-то и вовсе
CHayT 29.03.2016 18:21 # +1
разные версии никто не пишет, есть кодогенератор, который детектит всё это при билде под конкретную машину
так сделано в ATLAS и FFTW, к примеру
3.14159265 29.03.2016 22:04 # +1
Например всякие деления оптмизируются в умножения на константу плюс сдвиг >> size_t. НО ТОЛЬКО в случае если на целевой машине деление достаточно тормозное.
Antervis 29.03.2016 12:24 # +1
kurwa 29.03.2016 22:02 # 0
CHayT 29.03.2016 22:37 # 0
наличие этих вещей не делает кацкел не чисто функциональным
roman-kashitsyn 29.03.2016 22:55 # 0
Да, тут я слукавил. Ведь каскел программа ничего не производит эффектов, только лишь конструирует чистое значение IO, которое магически исполняется грязным рантаймом.
CHayT 29.03.2016 23:09 # 0
щас я длинно отвечаю на другой пост, там будет изложен мой дзен
CHayT 29.03.2016 23:47 # 0
guest 29.03.2016 12:08 # 0
ктож спорит-то?
а что в сишечке звездочка это и умножение и часть сигнатуры типа, указывающая что речь идет об указателе, и еще она разыменовывает указатель -- это песдец, да
но си это си, без сей никуда
увы
1024-- 29.03.2016 12:40 # 0
> ктож спорит-то?
Я бы мог поспорить, коли больше знаний было.
Няшнее - что-то среднее. Где при случае можно и чистую функцию и GC, и при случае - когда можно переписать 1 бит в сложной структуре вместо того, чтобы возиться с неизменяемыми структурами данных.
Antervis 29.03.2016 12:18 # 0
1024-- 29.03.2016 12:36 # 0
Хотел что-то такое, как у Вас, написать вместо первого кода, но понял, что с введением псевдохаскеля контраст будет выше.
Antervis 29.03.2016 13:04 # 0
Desktop 28.10.2020 23:58 # 0
guest8 29.10.2020 00:07 # −999
MAKAKA 29.10.2020 03:37 # 0
guest8 29.10.2020 04:14 # −999
rotoeb 29.10.2020 04:28 # 0
Fike 29.10.2020 07:56 # −1
они там все наглухо ебанутые. ну какое это исключительное блядь поведение?
при чем у них же в стандартной библиотеке куча методов типа bool TryGet(key, ref reference), он блядь мимо них что ли прошел?
Fike 29.10.2020 07:59 # −1
Какой способ ваш любимый
33.72%
Exceptions