Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Имбецилы

Автор Алексей Гринь, октября 17, 2009, 13:43

0 Пользователи и 1 гость просматривают эту тему.

Karakurt

Цитата: myst от ноября  8, 2009, 16:33
Компилятор какбэ не телепат.
Вы не ответили на вопрос:
Цитата: Алексей Гринь от ноября  8, 2009, 05:56
Внимание, вопрос: кто имбецил?
;)

myst

Цитата: Karakurt от ноября  8, 2009, 18:06
Цитата: myst от ноября  8, 2009, 16:33
Компилятор какбэ не телепат.
Вы не ответили на вопрос:
Цитата: Алексей Гринь от ноября  8, 2009, 05:56
Внимание, вопрос: кто имбецил?
;)
: Не хотелось бы никого обижать...

Алексей Гринь

Ну так скажите, что исправить? Сильно заморачиваться тихим бредом датского имбецила не хочется.

Цитата: Triton от ноября  8, 2009, 07:53
А почему у вас тела методов шаблона в cpp вынесены, они ж как бы в h всю жизнь были.
В реализации каждого метода нужно писать каждый раз template <class T>, как имбецил. Мегакрутой c++ иначе не воткнёт (имбецил же).

Цитата: myst от ноября  8, 2009, 16:33
Компилятор какбэ не телепат.
Чо? Компилятор всё видит, ибо compile-time ошибок не выдаёт. Вопит линкер, который в том же файле видит метод add. Если пошутить, он внезапно перестаёт видеть add. Я пытаюсь понять, что я сделал не так... За ходом афазической мысли олигофренов очень сложно следить, но я пытаюсь осмыслить как-то, люблю психиатрию.
肏! Τίς πέπορδε;

myst

Цитата: Алексей Гринь от ноября  9, 2009, 01:20
Я пытаюсь понять, что я сделал не так...
Не удосужился прочитать учебник. Марш читать Страуса! (Поторопись, он уже идёт в сарай за лопатой... ;))

Алексей Гринь

Цитата: myst от ноября  9, 2009, 02:04
Не удосужился прочитать учебник. Марш читать Страуса! (Поторопись, он уже идёт в сарай за лопатой... ;))
Не-а, я делаю всё правильно. Имбецил тут, похоже, Code::Blocks. Потому что если в main.cpp вместо

   #include "MyCoolClass.h"

написать
 
   #include "ParentClass.cpp"
   #include "MyCoolClass.cpp"

всё компилится без проблем. Т.е. имбецил-КодеБлокс не подключает цппов. Не понимаю, из-за чего такое может быть. Все нужные файлы к проекту подключены.
肏! Τίς πέπορδε;

Алексей Гринь

Только что КодеБлокс вылетел с Segmentation Fault. O shi~ :(
肏! Τίς πέπορδε;

Алексей Гринь

И ведь что забавно, если делать то же, но в Plain C,  то всё происходит абсолютно беспроблемно. Отчего же, отчего же всё так в цэпопе костыльно и вкривь?
肏! Τίς πέπορδε;

Алексей Гринь

Я плачу кровавыми слезами. Мы предположили, что имбецил — КодеБлокс, потому что почему-то не видит файлов реализации, а хедеры видит. Ок, для интересу я определил функции прямо в хедерах:

   virtual void add(T item) { }

Так теперь это чудо имбецилии пишет мне:

MySuperClass.cpp|7|error: redefinition of 'void MySuperClass<T>::add(T)'|
MySuperClass.h|20|error: 'virtual void MySuperClass<T>::add(T)' previously declared here|
||=== Build finished: 2 errors, 0 warnings ===|

Т. е. это чучело видит cpp, но не хочет линковать. Хм...

А если написать так:

   virtual void add(T item);

То это индиго мне пишет:

obj/Debug/main.o||In function `main':|
/main.cpp|5|undefined reference to `MySuperClass<int>::MySuperClass()'|
/main.cpp|7|undefined reference to `MySuperClass<int>::add(int)'|
||=== Build finished: 2 errors, 0 warnings ===|

Ололо, взаимоисключающие параграфы! То он мне пишет, что ничо не определено, то пишет, что дважды.
肏! Τίς πέπορδε;

Алексей Гринь

Всё понял. Я ранее недооценивал уровень ущербности Сиплюса. Надо шаблоны реально писать в хедерах. Писец. Маразм крепчал.

Смысл выражения "через жопу" стал намного яснее теперь.
肏! Τίς πέπορδε;

Triton

Гринь, извините, но прежде чем называть кого-то имбецилом, не помешает прочитать инструкцию на пользуемый инструмент.
Шаблоны надо писать именно в хэдерах, потому что они по своей сути - макросы, подставляемые во время компиляции. Вынести их cpp не представляется возможным.

Таки да, ни Си, ни Си++ не имеют внятной поддержки модульности и раздельной компиляции, только костыль в виде хэдеров, что поделать, это не академический паскаль и не ада.  :donno:
Молиться, поститься и слушать радио Ватника

myst

Цитата: Triton от ноября  9, 2009, 08:37
Шаблоны надо писать именно в хэдерах, потому что они по своей сути - макросы, подставляемые во время компиляции. Вынести их cpp не представляется возможным.
Можно, но надо помнить: первое, выхлоп компилятора — машинный код, никаких шаблонов в объектных файлах уже нет; второе, компилятор создаёт только экземпляры шаблона, необходимые в данной единице компиляции. Если нужен экземпляр шаблона для другой единицы, надо сказать об этом компилятору. Так как это зело негибко, это почти не практикуется, и шаблоны хранят в заголовочниках.


И да, у Страуса в книге всё это есть. Так шта, read the fucking manual right now! ;)

Triton

О том и речь. Так же как теоретически можно и вручную в cpp вписать объявления нужных внешних функций и описания типов данных, а практически они хранятся в h.
Молиться, поститься и слушать радио Ватника

Алексей Гринь

Цитата: Triton от ноября  9, 2009, 08:37
Гринь, извините, но прежде чем называть кого-то имбецилом, не помешает прочитать инструкцию на пользуемый инструмент.
Не, когда используешь некий инструмент, 90% времени идёт руководствование ЗДРАВЫМ СМЫСЛОМ (некие общепринятые стандарты, интуитивность интерфейсов и т. д.), когда же в 10% ЗДРАВЫЙ СМЫСЛ отсутствует, нужно читать маны. Когда же у какого-то инструмента всё ровно наоборот — костылей больше, чем здравого смысла — то это уже херня на постном масле, а не «инструмент».

Цитата: Triton от ноября  9, 2009, 08:37
Шаблоны надо писать именно в хэдерах, потому что они по своей сути - макросы, подставляемые во время компиляции
Есть куча языков, в которых почему-то шаблоны (называемые чаще макросами) могут вполне нормально находиться в файле реализации.

Они идиоты: осилили раздельную компиляцию *.cpp-файлов в *.o файлы с последующей общей линковкой, но сделать что-то подобное с шаблонами не осилили, а ведь могли сделать формат *.tem, который бы тоже делался в некий объектный метакод, а потом линкером всё бы скреплялось. Ан нет, такого нету.

Шаблоны это самые обычные допотопные сишные макросы, только типизированные — и всё.

Цитата: Triton от ноября  9, 2009, 08:37
только костыль в виде хэдеров
Какой костыль? Хедеры это вообще-то элемент хорошей, годной архитектуры отделения интерфейса от реализации. Почему это круто — см. гугл.

С++ пытается занять нишу некоего высокоуровненого языка, а на деле оказывается самым обычным си со свистелками и перделками. Нафиг он нужен-то тогда? Поэтому я снова возвращаюсь к сяхе, попытка полюбить цэпэпэ не удалась. Извините, но блестеть кишками в файле интерфейса у всех на виду — это не моё.
肏! Τίς πέπορδε;

myst

Цитата: Алексей Гринь от ноября 11, 2009, 12:49
Они идиоты: осилили раздельную компиляцию *.cpp-файлов в *.o файлы с последующей общей линковкой, но сделать что-то подобное с шаблонами не осилили, а ведь могли сделать формат *.tem, который бы тоже делался в некий объектный метакод, а потом линкером всё бы скреплялось. Ан нет, такого нету.
Вот тебе статья на злобу дня.
А вот тебе прямая ссылка на компилер, который умеет раздельную компиляцию шаблонов: http://www.comeaucomputing.com/

myst

Цитата: Алексей Гринь от ноября 11, 2009, 12:49
Хедеры это вообще-то элемент хорошей, годной архитектуры отделения интерфейса от реализации. Почему это круто — см. гугл.
Годной?! :o
Механическая вставка файла в файл препроцессором — это самый наикостыльнейший костыль. Как и препроцессор в целом...

myst

Цитата: Алексей Гринь от ноября 11, 2009, 12:49
Поэтому я снова возвращаюсь к сяхе, попытка полюбить цэпэпэ не удалась.
О да! Си — это предел совершенства, когда нужно загубить несколько тысяч человеко-лет.

Алексей Гринь

Цитата: myst от ноября 11, 2009, 13:33
А вот тебе прямая ссылка на компилер, который умеет раздельную компиляцию шаблонов: http://www.comeaucomputing.com/
Что-такое про него слышал, но его покупать ещё надо :) И не знаю, насколько он совестим с gcc, а люблю расширения gcc.
И, кстати, что насчёт компиляции шаблонов в стандарте? Это как-то оговаривается, или implementation-dependent?

Цитата: myst от ноября 11, 2009, 13:38
О да! Си — это предел совершенства, когда нужно загубить несколько тысяч человеко-лет.
Неправда. Система исключений делается одним человеком за пару часов, система наследования, виртуальные методы и даже приведение типов с рантайм-проверкой при умелом подходе делаются одним человеком за рабочий день.
Я вчера исключения переписал с использованием ключевого слова __thread, открыл для себя эту прелесть C99 и gcc (gcc-то впереди планеты всей, там это давно было) :) До перехода на линукс юзал виндовые Tls*** :(
Один раз написал фреймворк — и юзай хоть до самой смерти, в чём проблема?

Цитата: myst от ноября 11, 2009, 13:34
Годной?! :o
Механическая вставка файла в файл препроцессором — это самый наикостыльнейший костыль. Как и препроцессор в целом...
Э-э. Я говорю, что отделение интерфейса от реализации — это круто. Я не говорю, что то, как это реализовано в Си, мегакруто. В цэпопе там вообще всё в кучу, ещё хуже. Тут надо вдуматься в значение слова "хедер": заголовок.
Вот СиШарпах всяких и Явах, чтобы поглядеть на интерфейс/контракт, нельзя нормально глянуть в код. Только на всякие IDE да RAD'ы можно полагаться, потому что тоже там всё в кучу. Контракт — отдельно, мухи — отдельно, господа!

Цитата: myst от ноября 11, 2009, 13:34
Механическая вставка файла в файл препроцессором — это самый наикостыльнейший костыль. Как и препроцессор в целом...
Так то же самое и делает СиПлюс. Та же механическая вставка, только типизированная (с проверкой типов аргументов макросов). Я же не в абсолютных величинах сравниваю (ясно, что в Си макросы кривые по сравнению с какой-нибудь Немерлей), а конкретно СиПлюс с СиКавай. И СиПлюс посасывает в таком сравнении
肏! Τίς πέπορδε;

myst

Цитата: Алексей Гринь от ноября 11, 2009, 13:54
И, кстати, что насчёт компиляции шаблонов в стандарте? Это как-то оговаривается, или implementation-dependent?
У меня нет стандарта. По-моему, жадные стандартизаторы его зажали.

myst

Цитата: Алексей Гринь от ноября 11, 2009, 13:54
в чём проблема?
В том, что людям надо программный продукт делать, а не обработку исключений, наследование, виртуальные методы, ..., ну ты понял. :)

Алексей Гринь

Единственное, что меня огорчает в сишных макросах, так это отсутствие возможности макросом генерить другие макросы, напр. что-нибудь вроде так:

#define MAKE_MACRO(name, id, value)  #define name##id value

:(

Или, напр., const int satan = 666; не считается полноценной константой, и её нельзя в макросы лепить (в отличие от С++).

А так макросы классная штука, мне вот нонче надо было нагенерить разных функций по типу cfBox_* для всех примитивных типов, так это делалось так:

#define FOREACH_PRIM(macro) \
   macro(int) \
   macro(float) \
   macro(bool) \

   ...
etc. (сколь их там? небольше десятка. Этот добрый макрос написан раз и навсегда и используется много раз)

А затем:

#define HELPER(type) Object* cfBox_##type(type value);
   FOREACH_PRIM(HELPER)
#undef HELPER


И в том же духе.

Что равносильно СиПлюсовому:
template <class T>
Object* cfBox(T v);


С одним но: туто нету ограничения на type set. Или можно как-то по-другому? Потому что я не вкурил, как делать ограничения (по типу Сишарпового where)? Как я понял, никак нельзя, и типа тип выводится (type inference) по вызываемым методам и полям. А если полей вообще не вызывается? Как ограничить типы только для примитивных? Мне это надо!

И ещё повеселило: как реализовать специализацию шаблона для конкретного типа, да чтобы к нему подходили все наследуемые подклассы? И это типа высокоуровневый язык? На Си, блин, легче реализовать эмуляцию этой байды, чем попытаться понять, что курил Страуструп (и уж тем более читать его книжонки).

Макросы генерят быстрый, оптимизированный код за меня :) И никаких шаблонов не надо.

Цитироватьв чём проблема?
В том, что людям надо программный продукт делать, а не обработку исключений, наследование, виртуальные методы, ..., ну ты понял.
О да. Эти люди лучше потратят ВРЕМЯ и ДЕНЬГИ на обучение работников цпп-галлюцинациям (не удивлюсь, если к тому же цпп-программист стоит дороже, чем с-онли-программист), нежели они потратят ОДИН день и ОДНОГО адекватного человека на написание простого фреймворка, который реализует практически ВСЕ свистелки и перделки, за которые на цпп покупаются.
肏! Τίς πέπορδε;

myst


Triton

Цитата: myst от ноября 11, 2009, 13:34
Цитата: Алексей Гринь от ноября 11, 2009, 12:49
Хедеры это вообще-то элемент хорошей, годной архитектуры отделения интерфейса от реализации. Почему это круто — см. гугл.
Годной?! :o
Механическая вставка файла в файл препроцессором — это самый наикостыльнейший костыль. Как и препроцессор в целом...
+100.


Цитата: Алексей Гринь от ноября 11, 2009, 12:49
Шаблоны это самые обычные допотопные сишные макросы, только типизированные — и всё.
Цитата: Алексей Гринь от ноября 11, 2009, 12:49
Хедеры это вообще-то элемент хорошей, годной архитектуры отделения интерфейса от реализации.
Взаимоисключающие параграфы детектед.

Цитата: Алексей Гринь от
Они идиоты: осилили раздельную компиляцию *.cpp-файлов в *.o файлы с последующей общей линковкой, но сделать что-то подобное с шаблонами не осилили, а ведь могли сделать формат *.tem, который бы тоже делался в некий объектный метакод, а потом линкером всё бы скреплялось. Ан нет, такого нету.
Они это кто: Кернинган и Ричи, Страустрап, стандартизаторы ISO, разработчики компиляторов?.. К кому обращено ваше праведное негодование?


Если по уму, то Си и Си++ в чисто прикладных задачах давно пора закопать, и пользоваться нормальными языками, а системные или требовательные к производительности модули вполне хорошо пишутся и на чистом Си, Си++ там даже вреден. Честно говоря, не вижу никакой ниши для этого языка.
Глядя, например, на приложения на QT, компилирующиеся по 10-15 минут, хочется сделать с разработчиками библиотеки что-нибудь радикальное. Хотя они не виноваты, просто компилятор судорожно пытается прожевать метры кодов, полученные в ходе обработки "хорошей, годной архитектуры" заголовочных файлов, да еще при этом борясь с неоднозначностью грамматики Си++.
Молиться, поститься и слушать радио Ватника

Алексей Гринь

»
Цитата: Triton от ноября 11, 2009, 16:06
ЦитироватьШаблоны это самые обычные допотопные сишные макросы, только типизированные — и всё.
Цитата: Алексей Гринь от Сегодня в 13:49
ЦитироватьХедеры это вообще-то элемент хорошей, годной архитектуры отделения интерфейса от реализации.
Взаимоисключающие параграфы детектед.
Человек, не отличающий понятия «хедер» от понятия «макрос», детектед.

Цитата: Triton от ноября 11, 2009, 16:06
Они это кто: Кернинган и Ричи, Страустрап, стандартизаторы ISO, разработчики компиляторов?.. К кому обращено ваше праведное негодование?
Если реализация шаблонов никак не оговорена в стандартах, то разработчики компиляторов. Comeau же умеет. А Кернинган и Ричи тут вообще причём?

Цитата: Triton от ноября 11, 2009, 16:06
Глядя, например, на приложения на QT, компилирующиеся по 10-15 минут, хочется сделать с разработчиками библиотеки что-нибудь радикальное.
Да-а, что самое забавное, ДВУХпроходные компиляторы зачастую компилируют быстрее, чем ОДНОпроходные сишные.

Цитата: Triton от ноября 11, 2009, 16:06
Глядя, например, на приложения на QT, компилирующиеся по 10-15 минут
А кто вас заставляет производить полную перекомпиляцию?
肏! Τίς πέπορδε;

Алексей Гринь

Ещё вчера я вон, набыдлокодил макросы для быстрого протипирования классов (а то много ручной работы выходит).

/* 2934834 это TypeId, надо, к сожалению, самому генерить (хешем в питоне делаю) */
CF_CLASS(cfChild, cfParent, 2934834)
   CF_FIELD(int blabla)
   CF_FIELD(bool lala)

   CF_VIRT_METHODS(cfChild)
        CF_VIRT_METHOD(MSG_KILL_KENNY)
        {
             int fstArg = CF_NEXT_ARG();
             printf("%d\n", fstArg);
        }
        CF_END_VIRT_METHOD
   CF_VIRT_END_METHODS

  CF_CTOR(cfChild, cfParent, int blabla, int bla)
  {
       self->blabla = blabla; self->bla = bla;
  }
  CF_END_CTOR
   
CF_END_CLASS

/* Опа! Тут и наследование, и подсчёт ссылок и прочая и прочая уже готовое. Юзайте на здоровье! Макросы уже сгенерировали всё, что нужно: */
int main(void)
{
   cfChild* child = cfChild_Create();

   /* апкаст с рантайм-проверкой возможности приведения,
       иначе выкидывается исключение: */
   cfObject* parent = CF_CAST(child, cfObject);

   /* Посыл сообщения ака виртуальный метод. */
   CF_VIRT_CALL(parent, MSG_KILL_KENNY, 666);

   return 0;
}

О да, называйте меня садомазером :D
肏! Τίς πέπορδε;

Triton

Цитата: Алексей Гринь от ноября 11, 2009, 17:32
Человек, не отличающий понятия «хедер» от понятия «макрос», детектед.
Человек, не знающий, чем занимается команда cpp, детектед.


Цитата: Алексей Гринь от ноября 11, 2009, 17:32
А кто вас заставляет производить полную перекомпиляцию?
Там и частичной хватает выши крыши, чтобы начать оглядываться в поисках топора.

Цитата: Алексей Гринь от ноября 11, 2009, 17:32
ДВУХпроходные компиляторы
Хм, компиляторы чего?
Молиться, поститься и слушать радио Ватника

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр