- 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
#include "iostream"
using namespace std;
enum {MaxFucktorial=13};
static int fucks[MaxFucktorial+1];
template<const int ValuePosition, const int Value>
struct initFuckedValue
{
enum {CurrentValue=Value*ValuePosition};
static void fuckUp(void)
{
fucks[ValuePosition]=CurrentValue;
initFuckedValue<ValuePosition+1, CurrentValue>::fuckUp();
};
};
template<const int Value>
struct initFuckedValue<MaxFucktorial, Value>
{
static void fuckUp(void){};
};
void InitFucks(void)
{
fucks[0]=1;
initFuckedValue<1,1>::fuckUp();
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"Введите аргумент факториала: "<<endl;
InitFucks();
int fuckArg=0;
cin>>fuckArg;
cout<<"Начинаем считать факториал..."<<endl
<<"Подсчёт факториала успешно завершён. ОК."<<endl
<<"Результат: "<<fucks[fuckArg]<<endl;
cin>>fuckArg;
return 0;
}
Решил запостить всё. Жемчужена.
Мой знакомый, молодой преподаватель-аспирант из института пришёл однажды расстроенный. Спрашиваю у него: "Что случилось?"
-- "Один мой первокурсник, когда я дал ему задание посчитать факториал через рекурсию принёс мне какую-то непонятную компилирующуюся галиматью. И считает она уж слишком быстро... Это какая-то программа обманка. Вообщем я ему поставил 2."
Да, это лаба. ^_^
dosGovno 28.06.2011 19:05 # −2
Полностью согласен с преподавателем.
dosGovno 30.06.2011 14:33 # −1
TheHamstertamer 01.07.2011 12:43 # −2
Irdis 28.06.2011 19:18 # +9
А идея у парня забить массив факториалами на этапе компиляции. тоже сойдёт. препод лох =)
Dummy00001 28.06.2011 19:34 # +3
и даже имя метода fuckUp() подходит, потому что считает фак-ториалы в восходящем порядке ;)
macGovno 28.06.2011 21:38 # +2
3.14159265 28.06.2011 19:20 # +16
походу обычное ЧСВшное преподобыдло, которое слабо разбирается в предмете, который читает.
и это не галиматья
THIS IS FUCKTORIAAAAAAL!!!!
TarasB 28.06.2011 20:18 # −1
походу обычное ЧСВшное кодобыдло, которое слабо разбирается в коде, который пишет
либо выёбывающийся первокур
3.14159265 28.06.2011 21:33 # +1
таким вот ставить двойки. потому что какой-то быдлостудент-первокур считает себя умнее дипломированого преподавателя.
а тем кто пишет через стандартно через рекурсию а-ля имплементация от LinuxGovno - пятерки
дал бы я Вам почитать историю, о том
как один студентик на экзамене по физике барометром высоту здания мерял, но мне влом искать.
guest 28.06.2011 21:37 # +5
guest 28.06.2011 22:56 # −1
http://govnokod.ru/7097#comment94257
Это не я написал. Загуглил студенческую. (=
TarasB 29.06.2011 09:07 # +2
Вычисление факториала на шаблонах нахуй не нужно в реальности, вот в чём дело.
3.14159265 29.06.2011 11:31 # +1
>А если в медвузе студент на домашнем задании удалит пациенту гланды через задницу
какие удачные сравнения и весьма тонкие познания в жизни студентов медвуза и их пациентов.
рекомендую внимательно прочесть про случай с барометром.
http://www.bajena.com/ru/articles/1004/nils-bor/
а потом глянуть здесь например
http://ru.wikipedia.org/wiki/Бор,_Нильс
о его вкладе в науку и о тои как он по Вашим словам *довыебывался* до Нобелевской премии.
3.14159265 28.06.2011 21:36 # +2
bugmenot 28.06.2011 21:45 # 0
It works, bitches.
guest 28.06.2011 22:58 # −1
ctm 29.06.2011 06:48 # +8
ну факториал ладно - нечего там отлаживать, а если чуть сложнее?)
при работе в команде предпочтительнее "быдлокодерский вариант", т.к. это позволяет хоть как-то упростить взаимозаменяемость программистов.
Некоторое время спустя гениям скорее дадут новую задачу (что им самим будет интереснее), а поддержку кода отдадут кому-нибудь - выгодно экономически.
От простоты кода в конечном итоге выигрывают все.
я бы поставил 5 (за идею, поощрить соображалку), но объяснил, почему не надо делать сложно там, где можно сделать просто, и что получится, если будешь излишне извращаться - будешь сидеть на одном и том же коде, т.к. никто другой его не осилит - оно надо?
Irdis 29.06.2011 08:42 # 0
шаблонное метапрограмирование это отдельная тема в с++. по ней между прочим книги пишут(см., например, Александреску "Современное проектирование на С++", David Abrahams and Aleksey Gurtovoy "C++ Template Metaprogramming").
Не суть в сложности, суть в том что используется это широко, и не знание этого вопроса говорит о некомпетентности в области с++.
ctm 29.06.2011 09:15 # +2
TarasB 29.06.2011 09:17 # −4
Он вообще везде предпочтительней. У шаблонного варианта нет вообще никакого оправдания. Он по всем параметрам хуже нормального решения. И только тупые крестобляди дрочат на него, потому что "вау, оно типа сложное, в других языках так не сделать". В дрочении на бесполезную сложность заключается вся суть крестобляди.
Выдержки из известных цитат:
"Сложность использования повышает ЧСВ крестобляди до заоблачных высот"
"Умение героически преодолевать трудности, которые создает твой собственный инструмент, вместо того, чтобы решать непосредственно прикладную задачу"
absolut 29.06.2011 09:47 # +1
TarasB 29.06.2011 09:50 # +1
absolut 29.06.2011 10:15 # +4
Так что дело не в личности, а в содержании высказанного выше.
TarasB 29.06.2011 13:22 # 0
2. Наезды с++ников на дельфистов тоже политкорректностью никогда не отличались.
absolut 29.06.2011 13:44 # 0
http://www.gamedev.ru/users/?id=45914
TarasB 29.06.2011 13:59 # 0
Забанили меня из-за одного ушлёпка, который сначала слюнями и матами всё забрызгал, потом, после того, как ему адекватно ответили, трусливо потёр свои посты (то есть он ещё и всех подставил).
guest 29.06.2011 14:53 # −1
Когда из бана выпустят?
TarasB 29.06.2011 15:02 # 0
Потому что на форуме ГД.ру платным участникам можно ВСЁ. Модератор-то их банить не может, а ведущий пока в одиночку со всеми платными участниками разберётся, ушлёпок уже свои посты потрёт.
eth0 29.06.2011 20:10 # +7
TarasB 30.06.2011 09:14 # 0
Но просто где ещё можно найти народ игру потестить, про умные околоигровые вещи поговорить и так далее.
guest 06.07.2011 23:37 # +1
Говорит фриисофт программист со стажем?
guest 09.07.2011 01:44 # −1
absolut 09.07.2011 11:01 # +1
guest 09.07.2011 12:51 # +3
SmackMyBitchUp 29.06.2011 15:20 # +4
Мне шаблон понравился, я по вашему крестоблядь? Нет, ну логика-то у вас одна:
> И только тупые крестобляди дрочат на него, потому что "вау, оно типа сложное, в других языках так не сделать". В дрочении на бесполезную сложность заключается вся суть крестобляди.
Да, мне шаблон понравился, что с того? Из этого, как я смотрю, вы можете сделать вывод (непонятно на чем основанный), что я дрочу на эти шаблоны ибо они есть только тут.
Идите нахуй, не парьте людям мозги. Хватит.
Что вы вообще забыли в данном треде, если людей, которые программируют на С++, называете крестоблядями? Проходите мимо тогда.
>Да и если это первокур, то это он не сам написал.
Откуда такие выводы, сударь?
>...прочие изливания по поводу других ЯП
Делайте лучше, раз уж вы умеете и знаете
TarasB 29.06.2011 15:29 # 0
А мне может нравится вырезать гланды через задницу, что с того? Но если мой ученик сделает то же самое, я не буду, как вы умиляться, "нестандартному мышлению", "ловкости рук" итд, я буду ему объяснять, что так делать нахуй не нужно, и что гланды надо вырывать так, как принято.
Так вот, шаблоны в этой задаче нахуй не нужны, они нужны только для выебонов, не давая никаких вообще преимуществ.
А пока что я в этой теме вижу дроч на то "как красиво он засунул руку со скальпелем в задницу и дотянулся до гланд".
> Что вы вообще забыли в данном треде, если людей, которые программируют на С++, называете крестоблядями?
Не всех. А только тех, что дрочит на его кривости, считая их преимуществами.
> Откуда такие выводы, сударь?
Для написания этого кода нужна квалификация сильно выше, чем средний уровень первокура.
guest 29.06.2011 16:01 # +1
TarasB 29.06.2011 16:12 # −1
Правда, надо сказать, что на бесплатном компиляторе это не прокатывает. То есть компилируется, но инициализируется только при запуске.
Платный я не проверял (он стоит дохрена), но никаких технических препятствий не вижу.
gegMOPO4 29.06.2011 16:46 # −1
bugmenot 29.06.2011 16:50 # +3
guest 29.06.2011 17:17 # −1
, да, того самого.
guest 29.06.2011 17:18 # −1
На нём будет также, ага.
TarasB 30.06.2011 09:14 # 0
guest 29.06.2011 17:22 # 0
TarasB 30.06.2011 09:15 # 0
guest 29.06.2011 17:39 # −1
Есть, фирмы, что её разрабатывают\спонсируют?
Есть ли у неё перспективы, и почему ты так думаешь?
Есть ли сборка мусора и опциональна ли она?
TarasB 30.06.2011 09:17 # 0
2. Да.
3. Да, т.к. 1,2,4
4. Да.
Ты бы лучше спросил, чего мне в ней не хватает.
А не хватает мне средств для JIT-компиляции, функций, создающих новые функции, и такого всякого.
Ну и ещё немного не хватает возможности писать глобальные процедуры в главном файле (для одноразовых программ полезно, чтобы не заводить 3 файла на простейший проект).
Ну и человечной среды.
guest 30.06.2011 09:57 # −1
То есть больше интересует, можно ли на любом классе использовать паттерн RAII. В том же C#, если полагаться на сборку мусора, то это не возможно сделать в тамашнем деструкторе (финализатор), только с использованием костыля dispose совместно с using.
TarasB 30.06.2011 10:04 # 0
Есть только фраза из описания языка:
То есть GC и RAII в одном приложении совмещать можно.
Кстати, ещё небольшой прикол стандарта - как только тип-указатель (объявленный локально) выходит из области видимости, то все переменные этого типа освобождают память (тоже детерминированно).
guest 30.06.2011 10:18 # −1
Может включает "сборку мусора" для указанного типа данных?
SmackMyBitchUp 29.06.2011 20:30 # −2
Понятно, то есть человек пришедший в универ имеет девственно чистый ум. Ладно. Вопросов к вам больше не имею, спасибо.
ctm 29.06.2011 09:51 # +1
лишь в 5% действительно оправдано использование метапрограммирования, когда плюсы его использования превышают минусы - какое-никакое усложнение кода, т.е. увеличение себестоимости ПО.
При обучении же, нужно рассматривать оба варианта, показать плюсы, минусы каждого. Мой упрек преподу именно в том, что это не было сделано.
TarasB 29.06.2011 09:58 # +1
Расчёт констант при компиляции - это не тот случай.
3.14159265 29.06.2011 11:53 # 0
>везде предпочтительнее "быдлокодерский вариант"
и оно по большей части ведется на божественных пасцалях/делфях, а не крестоблядстве дает видимые и ощутимые плоды.
стаи пхпешников и не только успешно решающих "прикладные задачи"
guest 28.06.2011 19:47 # +1
А так да, код вроде нормальный, но выпендрёжный. Решил студент над преподом поглумиться. :D
guest 28.06.2011 20:01 # +1
Я плакал.
guest 28.06.2011 20:04 # −6
TarasB 28.06.2011 20:17 # +1
Чтобы посчитать факториал при компиляции, шаблоны (костыли компилятора) не нужны. Нужен компилятор, способный допереть, что вызов чистой функции от констант успешно заменяется подстановкой значения.
Минус шаблонного крестоговна, выполняющегося при компиляции, заключается в том, что оно не переносится в период выполнения (параметры шаблона - константы, блять). В этом заключается великое уродство С++ - код, который должен делаться программой при выполнении и при компиляции, пишется на совсем разных языках, один из которых на самом деле нужен только как костыль для затыкания несовершенств компилятора.
guest 28.06.2011 21:11 # +3
Да у тебя же БОРЛАНД.
>Минус шаблонного крестоговна, выполняющегося при компиляции, заключается в том, что оно не переносится в период выполнения
А вот тут http://govnokod.ru/7095 можно посмотреть охуительно красивое шаблонодельфиговно от гуры.
TarasB 29.06.2011 09:11 # −3
absolut 28.06.2011 20:29 # +4
Esper 28.06.2011 20:45 # +3
2. Смотрим на эффект.
3. Отправляем хитрую задницу, откуда пришла.
4. ??????
5. PROFIT!
guest 28.06.2011 21:09 # +1
1. Просим прогу посчитать "fucktorial" 1000.
2. Смотрим на эффект.
3. Отправляем глупую задницу, откуда пришла.
4. ??????
5. PROFIT!
Esper 28.06.2011 21:19 # 0
К тому же, если компилятору сыпануть под хвост немного сольцы, то он рекурсию преобразует в цикл - стек ничего не почувствует.
guest 28.06.2011 21:20 # 0
И это будет не верно.
Esper 29.06.2011 12:07 # 0
Да. Поскольку int знаковый и мы не будем кормить прогу отрицательными числами: она их не переварит - это устранимый минус; то можно считать, что счет идет по модулю 2^31.
guest 30.06.2011 10:33 # −1
gegMOPO4 30.06.2011 11:12 # 0
absolut 30.06.2011 11:19 # 0
gegMOPO4 30.06.2011 11:34 # +3
guest 30.06.2011 11:58 # −1
Ещё как предсказуемо. Не нужно быть Вангой, что-бы предсказать, что запись или чтение за границей массива неминуемо приведёт к падению программы, зависанию, выдаче не верных результатов или появлению эксплоита.
Esper 30.06.2011 12:13 # 0
Не неминуемо. В том-то и проблема.
Этот говнокод у меня спокойно сказал, что 15! = 0.
guest 30.06.2011 12:16 # −1
Esper 30.06.2011 13:57 # +1
Неверно процитировал - mea culpa.
Прошу прощения.
guest 30.06.2011 14:18 # −1
dosGovno 30.06.2011 14:19 # +1
- скажи спасибо, не наклонительное повеление...
gegMOPO4 30.06.2011 12:29 # 0
guest 30.06.2011 12:38 # −1
gegMOPO4 30.06.2011 12:55 # 0
guest 30.06.2011 13:09 # −1
В данной программе это не возможно. Всё остальное я перечислил.
gegMOPO4 06.07.2011 20:47 # 0
guest 06.07.2011 23:40 # −1
Esper 30.06.2011 12:10 # 0
guest 30.06.2011 12:16 # −1
3.14159265 28.06.2011 21:24 # +1
Fucked up?
если уж и писать через рекурсию то так
int fuckt (int num) { return (num>0) ? fuckt(num-1)*num : 1; }
хотя и это неидеально
guest 28.06.2011 23:06 # −2
Вы уверены, что здесь сработает оптимизация хвостовой рекурсии?
Esper 29.06.2011 11:55 # +1
guest 30.06.2011 10:22 # −1
Ну конечно. Кто-бы сомневался. Это же загугленный студенческий вариант.
>если уж и писать через рекурсию то так
Просто зачем говорить, что писать нужно так, когда это не оптимальный вариант, пожирающий стек? Если написать правильно с возможностью использования хвостовой рекурсии, тогда проблем то не будет.
Esper 30.06.2011 12:32 # 0
Если пишешь на C/C++, чем мы тут и занимаемся, то трудно гарантировать, что сделает и чего не сделает компилятор в плане оптимизации.
К примеру, "gcc -O0" не преобразует в цикл ни "тупой" рекурсивный факториал, ни факториал с хвостовой рекурсией, в полученном коде будут честные call'ы, стек будет честно пожран; а "gcc -O2" преобразует в цикл и хвостатый, и бесхвостый факториалы, в коде - ни единого call'а.
Никогда не понимал молящихся на хвостовую рекурсию.
guest 30.06.2011 12:36 # −1
Ага и потом перенеси на другой компилятор и будет тебе счастье без хвоста в виде заполненного стека... Очевидно, же, что при использовании хвостовой оптимизации - шансы на оптимизацию больше под любым компилятором.
>"gcc -O0" не преобразует в цикл
Спасибо, КЕП. Ключ -O0 и так нам говорит об отключенной оптимизации.
gegMOPO4 30.06.2011 12:56 # 0
guest 30.06.2011 13:11 # −1
А я считаю, что желательно, тем более что для данного примера это делается очень легко.
gegMOPO4 06.07.2011 20:51 # +1
Это в языках, подобных C++. Кое-где рекурсия необходима.
guest 06.07.2011 23:44 # −1
Ну, думаю, кроме горе-студента, тут никто рекурсию использовать "не предлагал".
Esper 30.06.2011 13:12 # 0
"gcc -O1" работает так же, как и "gcc -O0".
guest 30.06.2011 13:22 # −1
Как раз таки, если писать с учётом оптимизации хвостовой рекурсии - гарантии есть.
А именно, если в документации к данному компилятору сказано, что хвостовая рекурсия оптимизируется, то она оптимизируется.
А если не использовать хвостовую оптимизацию, то это уже рулетка - либо оптимизирует либо нет (тут уже можно говорить о шансах).
Притом, хвостовую рекурсию в цикл преобразовывать компиляторы научились уже очень давно, так что шанс встретить компилятор без оптимизации хвостовой рекурсии стремиться к 0%.
TarasB 30.06.2011 14:20 # −2
> стремиться
> ь
АХАХА
guest 30.06.2011 14:27 # −1
- Вы при написании одного слова допустили одну ошибку.
- Какую же?
- Такого слова нет.
gegMOPO4 06.07.2011 20:54 # +2
guest 06.07.2011 23:35 # −1
Я то согласен, но некоторые функциональщики так не считают.
guest 06.07.2011 23:46 # −1
gegMOPO4 07.07.2011 09:39 # 0
SiPlus 24.01.2013 18:25 # 0
3.14159265 28.06.2011 21:17 # 0
absolut 28.06.2011 21:26 # +3
3.14159265 28.06.2011 21:42 # +3
ну раз больше 12! не влезет, то больше 13! и подавно.
guest 28.06.2011 23:00 # −1
Esper 29.06.2011 12:01 # +2
Сначала смотрим сквозь пальцы на отсутствие проверки, что обращение не вылазит за границы массива, а потом удивляемся, откуда появляется столько "дырявого" кода.
macGovno 28.06.2011 21:42 # +6
Esper 29.06.2011 19:48 # +11
absolut 29.06.2011 20:33 # +2
bugmenot 28.06.2011 21:47 # 0
Мартин 28.06.2011 23:22 # +1
dosGovno 28.06.2011 23:37 # +2
http://govnokod.ru/user/320
guest 29.06.2011 12:33 # 0
AxisPod 29.06.2011 06:46 # +3
А то что преподы навязывают свою точку зрения это зло, ибо все же в вузах должны в первую очередь учить думать, а уж потом давать знания. После таких преподов и выходят говнокодеры пачками, за которыми потом нужно постоянно следить.
TarasB 29.06.2011 09:11 # −5
Уже давно компиляторы научились считать константы при компиляции, а крестобляди по прежнему дрочат на шаблоны, которые никто, кроме них, прочитать не сможет (ну или сможет, только хорошенько курнув).
Очень жаль, что мои мысли, которые я пытался тут высказать, потонули в крестоблядском кукареканьи о "нестандартном мышлении" и "отличном решении".
Irdis 29.06.2011 09:41 # 0
TarasB 29.06.2011 09:56 # +1
Ну и определить константный массив значений через эту функцию. Нормальный компилятор сам заменит вызовы на значения.
Irdis 29.06.2011 10:20 # +1
то в релизной сборке в мсиле я увижу константный масив(т.е. вычисления a[i - 1]*i точно не будет )??
TarasB 29.06.2011 12:05 # 0
Ты должен написать функцию, возвращающую массив факториалов. И если ты напишешь const f = Get13Fucktorials; то значение f должен посчитать компилятор.
macGovno 29.06.2011 12:07 # +2
Желательно не на хаскеле и не на другой функциональщине.
guest 29.06.2011 12:36 # 0
Ну или хотя бы на функциональщине.
macGovno 29.06.2011 15:54 # 0
TarasB 29.06.2011 16:01 # 0
Ты должен написать функцию (Get13Fucktorials), возвращающую массив факториалов (чисел от 0 до 12). И если ты напишешь const f = Get13Fucktorials; то значение f должен посчитать компилятор. Потому что внутри этой функции нет ничего, зависящего от данных, неизвестных компилятору.
guest 29.06.2011 16:04 # −1
>Ты должен написать функцию (Get13Fucktorials), возвращающую массив факториалов
Да С++ вообще массивы без обёрток возвращать через return не умеет.
Aleskey 30.06.2011 08:30 # −1
{
return array_;
}
guest 30.06.2011 09:58 # −1
Aleskey 30.06.2011 10:18 # 0
http://codepad.org/6rXsVh2H
Выводит 12.
#include <stdio.h>
const int (&getArray())[10] {
static int tmp[10] = {1,2,3,4,5,6,7,8,9,10};
return tmp;
}
int main() {
printf ("%d", getArray()[0]);
printf ("%d", getArray()[1]);
return 0;
}
guest 30.06.2011 10:25 # −1
Массив сложных объектов с отложенной инициализацией - как вариант использования данной конструкции.
Aleskey 30.06.2011 10:22 # +1
guest 30.06.2011 10:24 # −1
Aleskey 30.06.2011 10:30 # +1
guest 30.06.2011 10:41 # −1
macGovno 29.06.2011 16:22 # 0
TarasB 29.06.2011 16:27 # 0
macGovno 29.06.2011 16:40 # +1
В то время как метапрограммирование поритруемо, гарантирует выполнение на этапе компиляции, явно выражает намерение программиста.
TarasB 29.06.2011 16:49 # +1
Хорошо, в крайнем случае я признаю, что шаблоны - это костыль, затыкающий несовершенства современных компиляторов. Признать их адекватным средством я никак не могу.
> В то время как метапрограммирование поритруемо
Оно не портируемо в период выполнения, понимаешь? Шаблоны умеют работать только с константами времени компиляции. А если я захочу, чтобы логика, которую выполняют шаблоны, делалась на основе вводимых данных, то что - облом? Понимаешь, это я привожу к мысли, которую не я сказал, что "очень плохо, что язык шаблонов С++ не совпадает с С++".
Если бы через constexpr было сделано - то нет проблем, на здоровье.
> явно выражает намерение программиста.
Может тогда на асме писать? Он куда явнее выражает немерения программиста.
Понимаешь, дело в том, что дело программиста - это написать код, который 1) понятен, 2) поддаётся оптимизации. Он НЕ ДОЛЖЕН оптимизировать код вручную! А шаблоны - это и есть оптимизация вручную. Можешь назвать их "преждевременной оптимизацией".
macGovno 29.06.2011 17:14 # +2
1. Ну тогда дождись или напиши адекватный компилятор, потом обсирай метапрограммирование. За десятилетия описанный тобой функционал так и не был реализован и не известно будет ли. А пока метапрограммирование достойно существования.
2. Это естественно минус, но нужно думать где применять метопрограммирование и специалист должен быть с ним знаком. Например если нужны часто повторяющее вычисления, единственный адекватный способ это сделать - сгенерировать константы. По причине описанной выше - наиболее элегантный метод на сегодня -- это метрапрограммирование.
3. Нет лучше разработать ИДЕ с одной кнопкой "сделать заебись". Это самое главное намерение программиста. И главное думать не надо.
TarasB 30.06.2011 09:31 # 0
У меня претензии к использованию шаблонов для данной задачи.
> 1.
В этом направлении работы ведутся. constexpr уже есть, правда сильно ужатый. Сильно мешает низкоуровневое наследство С++ (оно всегда мешало и было мёртвым грузом на языке, и это основной его минус), которое затрудняет анализ кода.
2. Нет, можно генерировать константы извне (создать программу, создающую файл констант и запускающую компилятор), можно считать при старте программы. Любой крупный проект содержит нетривиальный запуск компилятора.
Далее, если эти шаблонные вычисления понадобятся для вводных (т.е.не известных компилятору) данных, то придётся всю логику продублировать. То есть шаблоны порождают повторяющийся код, и всё это ради (в худшемслучае) 1 милисекунды на старте программы, или (в лучшем) ради того, чтобы компилятор мучался с шаблонами вместо того, чтобы сразу вычислить значение функции, что намного проще.
А ручное дублирование кода - это, как известно, потенциальный источник ошибок. В С++ в некоторых случаях одно и то же дублируют трижды - на языке шаблонов (для принудительного переноса в стадию компиляции), на низкоуровневом языке (для скорости), на языкы контейнеров (для надёжности). Когда С++ники узнали, что в Паскале быстрый код отличается от безопасного только директивами компилятора, они дико фрустрировали, придумывая отмазки типа "раз проверки отключаемые, то значит Паскаль опаснее чем С++" и прочую лабуду и в стиле "раз в Форде Фокусе подушки безопасности можно открутить, то он не менее опасен, чем Москвич".
3. В будущем так и будет. Но константы на шаблонах - это прошлое, закопайте это, как когда-то закопали ручную замену умножения на сдвиг (которая нужна была только из-за несовершенства тогдашних компиляторов). И вообще, не надо считать себя умнее компилятора (тоже избитая мысля, да).
guest 30.06.2011 10:05 # −1
Когда такое было? :D
TarasB 30.06.2011 10:08 # 0
guest 30.06.2011 10:13 # −1
http://www.gamedev.ru/flame/forum/?id=148721#m1
зы: Прочтите название темы.
gegMOPO4 30.06.2011 11:21 # +5
guest 30.06.2011 12:14 # +3
Вообще, всегда самые доставляющие споры о языках были в присутвии 2 парней с гейсдева:
pushkoff (С++ is best!!!11) и TarasB (Delphi is best!!!11)
pushkoff 30.07.2011 14:54 # +3
а вообще я еще питон люблю, но он не очень холиварный язык...
guest 30.07.2011 15:21 # −1
http://govnokod.ru/7204
http://govnokod.ru/7149
http://govnokod.ru/7131
http://govnokod.ru/7114
guest 30.07.2011 18:04 # −1
inkanus-gray 30.07.2011 16:08 # +1
Как это Питон не холиварный? А как же жёсткий перенос строк и жёсткие отступы? В каком языке (кроме древнего Фортрана) ещё подобное есть?
inkanus-gray 30.07.2011 16:14 # +1
И внезапно «PHP vs Python»:
http://holywars.ru/comments/767
pushkoff 30.07.2011 19:41 # 0
там одни веб девелоперы, я рассматриваю питон больше как средство автоматизации
pushkoff 30.07.2011 19:36 # 0
bugmenot 30.07.2011 20:24 # 0
почему "либо-либо"?
inkanus-gray 30.07.2011 21:11 # 0
Вы так говорите, как будто на PHP нет серьёзных проектов.
bugmenot 31.07.2011 00:06 # +2
> @bugmenot
я сначала хотел спросить, что за фигнюция перед ником, но потом догадался:
http://i.imgur.com/OxYY5.jpg
inkanus-gray 31.07.2011 00:18 # +1
Да я тоже, когда впервые увидел этот символ в комментариях в Ютубе и в Твиттере, не мог догадаться, что это значит.
Взятие адреса переменной же! Я же всегда говорил, что Паскаль намного читабельнее, чем Си++, где & может означать всё, что угодно.
guest 31.07.2011 08:30 # −1
guest 31.07.2011 08:28 # −2
macGovno 30.06.2011 12:13 # 0
2. Такой подход тоже имеет недостатки. Усложняет систему сборки например, но имеет право на жизнь, на равне с метапрограммированием. Аргумент про ручное дублирование кода признаю, но его мало для отказа от метапрограммирования. Нужно проектировать систему грамотно и использовать метопрограсммирование там где такого дублирования не предвидится.
3. Cчитать себя умнее компилятора не надо, надо просто знать насколько он умён и на что способен. Когда тобой предложенная оптимизация станет дефакто стандартом (как rvo или copy elision) -- можешь начинать махать лопатой. А пока не надо.
ЗЫ. И в С++ быстрый от безопасного отличается тоже только директивами. Гугли "checked stl".
TarasB 30.06.2011 12:17 # +1
guest 09.07.2011 01:45 # −3
striker 29.06.2011 09:41 # +8
И даже если данный подход просасывает по всем параметрам другим подходам, то всё равно надо его рассмотреть, чтобы знать, что так "можно, но не нужно"
TarasB 29.06.2011 09:57 # −2
2. В универе разве достаточно "лишь бы работало"?
striker 29.06.2011 10:01 # +7
2. для начала диалога, я думаю, что этого достаточно. а тут сразу двойку и подсрачник.
Esper 29.06.2011 12:10 # +3
striker 30.06.2011 03:02 # 0
Esper 30.06.2011 09:46 # +1
1. То, что препод в данном случае не блеснул квалификацией, бесспорно. Но тем не менее, он принял верное решение, ниже раскрою, почему.
2. От ученистудента(!) потребовали написать факториал с использованием рекурсии (указано в описании). Т.е. цель была в том, чтобы студент продемонстрировал свое умение писать рекурсивные функции. Студент оного умения не продемонстрировал. В процессе вычисления рекурсивной функции может вызываться она сама. С т.з. C++ initFuckedValue<M, N>::fuckUp() и initFuckedValue<P, Q>::fuckUp() - разные функции, если (P!=M)||(Q!=N). А в этом говнокоде initFuckedValue<M, N>::fuckUp() зовет только initFuckedValue<M+1, Q>::fuckUp(), или ничего не зовет, если M=13. Т.е. при "вычислении" initFuckedValue<M, N>::fuckUp() сама она вызвана быть не может, факториал посчитан без использования рекурсии - условие задачи не выполнено.
3. Вы не находите эти const'ы очаровательными?
А по мне они свидетельствуют о непонимании студентом плюсовых шаблонов.
4. К сожалению, в C, а за ним - и в C++, проверка корректности работы с памятью - не вспомогательная функция, а чуть ли не основное занятие программиста. Студент продемонстрировал, что корректно работать с памятью он не умеет.
5. Если посмотреть на время появления этого говнокода, то нетрудно догадаться: скоро экзаменационная сессия закончится, а студент все не может сдать лабу. Т.е. либо идиот, либо раззвездяй. А еще наверняка - будущий солдат, защитник Родины.
Это очень хороший говнокод, если бы его не было, его следовало бы придумать.
guest 30.06.2011 10:03 # −1
Как?
Esper 30.06.2011 10:27 # +1
1. Объявляем статический массив на 14 элементов:
2. Запрашиваем у пользователя число:
3. Нигде и никак не проверяем, что же нам на самом деле подсунул пользователь.
4. Используем то, что нам подсунул пользователь, в качестве индекса при доступе в массив из пункта 1:
guest 30.06.2011 10:40 # +2
А студенты часто пишут на выброс, так что если он уже умеет проверять ввод пользователя, то можно и не делать её.
Задач много, а значит подходить нужно инженерно. Если проверка ввода не нужна, то и писать её не нужно.
Критерий нужности этой проверки:
1)Требует заказчик (а именно препод).
2)Все ещё не умеешь проверять ввод (а значит нужно научиться, а значит нужно писать).
Esper 30.06.2011 13:00 # +1
Ну а дальше следует убедиться, что факториал этого значения лежит в массивчике, а значит, имеет смысл за ним обратиться.
По поводу нужна/не нужна проверка скажу так: препод должен требовать ее наличие, если студент хочет больше "трояка".
guest 30.06.2011 13:14 # −2
Если студент это делал уже 100ню раз и умеет, то препод требовать не обязан, что-бы не отвлекаться на мелочи и сосредоточиться на главном для данного занятия.
absolut 30.06.2011 13:20 # +8
guest 30.06.2011 13:29 # −1
Болтун - находка для шпиона.
absolut 30.06.2011 13:36 # +3
guest 30.06.2011 13:43 # −1
>А теперь сравните кол-во писанины у себя и у меня
В какой темке вы хорошо расписали свою точку зрения, что-бы сравнить кол-во моих слов из этой темы с оной?
absolut 30.06.2011 14:21 # 0
Есть много более интересных и захватывающих моментов в жизни. :)
guest 30.06.2011 14:24 # −1
>А теперь сравните кол-во писанины
guest 30.06.2011 14:03 # −1
Ну, а я видел это уже не 3, а много раз в Интернете, и что? Меня такие мелочи не волнуют. Есть много более интересных и захватывающих моментов в жизни.
absolut 30.06.2011 14:20 # +1
gegMOPO4 06.07.2011 20:57 # 0
absolut 07.07.2011 10:36 # −2
ударная гласная, дабы пресечь всякий сортирный юмор
Esper 30.06.2011 13:54 # 0
Судя по тому, что препод вынужден видеть его в конце июня, студент не утруждал себя работой в семестре.
Таких препод ДОЛЖЕН.
guest 30.06.2011 14:00 # 0
Где такое сказано? Выложить говнокод могли с опозданием в 4 -месяца или -года, а может вообще придумали. Делайте выводы правильно, не додумывайте того, чего не было.
Irdis 30.06.2011 12:29 # 0
Я нахожу что вы не понимаете для чего нужны const в шаблонах.
const int как тип не равен int
а вот const const int равен const int.
В этой задаче не играет значения. Но формально лучше писать const, иначе можно неплохо пролететь.
Esper 30.06.2011 13:38 # +4
"14.1.5 The top-level cv-qualifiers on the template-parameter are ignored when determining its type."
я действительно не понимаю, зачем там const. И мне не стыдно в этом признаться.
guest 30.06.2011 13:44 # −5
>не понимаю, И мне не стыдно
Мне стыдно за вас.
Esper 30.06.2011 14:05 # +3
и
по стандарту одно и то же. Т.е. const тут не нужен.
И g++ со стандартом и мной согласен.
guest 30.06.2011 14:07 # −1
Irdis 30.06.2011 16:06 # −2
Irdis 30.06.2011 12:57 # +2
В метапрограммировании с++ шаблонные структуры называются мета функциями. В данном случае он сделал рекурсию основанную на мета функциях.
Esper 30.06.2011 15:31 # 0
Рекурсией на метафунктоидах была бы возможна, если бы метафунктоид мог позвать себя как метафунктоид. Но метафунктоид лишь описывает способ построения функтоида, соответствующего каким-то параметрам. Нельзя позвать метафунктоид - можно позвать функтоид. Т.е. "рекурсия на метафунктоидах" - еще один неудачный термин, вводящий в заблуждение.
К сожалению, развитие C++ идет по пути введения фич, которые издалека похожи на что-то уже имеющееся у других, и обозначения этих фич неудачными терминами.
Dr_Offset 07.07.2011 08:35 # +1
ctm 29.06.2011 12:56 # 0
2. в общем-то да, как и практически везде.
absolut 29.06.2011 09:45 # +5
>я бы поставил ему 5.
>я бы поставил ему 2.
>я бы поставил 5
Уважаемые, неужели нет других оценок, и к чему такая контрастность?
Ставлю "4" : за реализацию на шаблонах и выебку с факами.
bugmenot 29.06.2011 10:13 # 0
получится скорее уд. чем хор.
absolut 29.06.2011 10:31 # 0
bugmenot 29.06.2011 10:37 # 0
4 минус балл за незнание формулы муавра с константным временем даст тот же результат (хуи в индентификаторах мы как бы прощаем)
TarasB 29.06.2011 12:07 # +1
bugmenot 29.06.2011 14:06 # −4
TarasB 29.06.2011 14:18 # +4
3.14159265 29.06.2011 15:15 # 0
guest 29.06.2011 16:03 # −1
bugmenot 29.06.2011 16:30 # 0
TarasB 29.06.2011 16:52 # +1
Например, это всё равно что вычислять x^2 по формуле x*(x+1). предел отношения по прежнему равен 1, но разность нифига не стремится к нулю, она стремится к бесконечности.
bugmenot 30.06.2011 18:51 # −1
guest 29.06.2011 17:15 # −1
И да, мы знаем, что любую формулу можно разложить в ряд, аппроксимировать, интерполировать или экстраполировать.
А главное, не точно.
bugmenot 29.06.2011 18:48 # 0
не любую
а консервы - вон они - http://oeis.org/A000142
guest 29.06.2011 18:51 # −1
Блин, попался...
>а консервы
Спасибо, уже не нужно.
bugmenot 29.06.2011 19:26 # +1
http://i.imgur.com/UuiZx.jpg
guest 29.06.2011 20:00 # −1
guest 30.06.2011 00:46 # +4
TarasB 30.06.2011 10:06 # −3
guest 30.06.2011 14:11 # +3
Мы знаем.
guest 30.06.2011 14:06 # −5
eth0 30.06.2011 16:19 # +3
Govnoeb 30.06.2011 16:40 # +7
по поводу крестоблядей - пг/тм 'нафф сэд
кстати препод мог бы словить тонны лулзов, попросив студента объяснить как и почему работает его лаба
absolut 01.07.2011 17:03 # +4
P.S. Страйкер, суппорт вообще как поживает и дальнейшие планы на жизнь?
LegionDead 01.07.2011 17:04 # 0
guest 01.07.2011 17:28 # +7
striker 05.07.2011 15:59 # 0
bugmenot 05.07.2011 17:10 # +6
> вкусность
очень надеюсь, что новая фича порадует не только говноедов
gegMOPO4 06.07.2011 21:01 # +1
absolut 05.07.2011 18:07 # 0
bugmenot 05.07.2011 18:16 # 0
striker 05.07.2011 22:23 # 0
absolut 06.07.2011 06:55 # 0
striker 06.07.2011 07:16 # 0
Напомнило http://www.netlore.ru/files/uploads/2007/05/manage1.jpg
А вообще, я еще тот лентяй
carsten 05.07.2011 09:49 # +3
Но по идее можно было бы поставить и пять, за нестандартный подход.
bormand 16.09.2012 12:13 # +1
Факториал 13 то? На сколько наносекунд, простите?
guest8 08.04.2019 21:02 # −999
guest8 09.04.2019 11:05 # −999