Author Topic: Имбецилы  (Read 19594 times)

0 Members and 1 Guest are viewing this topic.

Offline Karakurt

  • Posts: 20128
  • Gender: Male
Reply #25 on: November 8, 2009, 19:06
Компилятор какбэ не телепат.
Вы не ответили на вопрос:
Внимание, вопрос: кто имбецил?
;)
͡° ͜つ ͡°

Offline myst

  • Posts: 35581
Reply #26 on: November 8, 2009, 19:09
Компилятор какбэ не телепат.
Вы не ответили на вопрос:
Внимание, вопрос: кто имбецил?
;)
: Не хотелось бы никого обижать...

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

  • Blogger
  • *
  • Posts: 24117
  • Gender: Male
Reply #27 on: November 9, 2009, 02:20
Ну так скажите, что исправить? Сильно заморачиваться тихим бредом датского имбецила не хочется.

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

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

Offline myst

  • Posts: 35581
Reply #28 on: November 9, 2009, 03:04
Я пытаюсь понять, что я сделал не так...
Не удосужился прочитать учебник. Марш читать Страуса! (Поторопись, он уже идёт в сарай за лопатой... ;))

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

  • Blogger
  • *
  • Posts: 24117
  • Gender: Male
Reply #29 on: November 9, 2009, 03:07
Не удосужился прочитать учебник. Марш читать Страуса! (Поторопись, он уже идёт в сарай за лопатой... ;))
Не-а, я делаю всё правильно. Имбецил тут, похоже, Code::Blocks. Потому что если в main.cpp вместо

   #include "MyCoolClass.h"

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

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

Reply #30 on: November 9, 2009, 03:09
Только что КодеБлокс вылетел с Segmentation Fault. O shi~ :(
肏! Τίς πέπορδε;

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

Reply #32 on: November 9, 2009, 03:59
Я плачу кровавыми слезами. Мы предположили, что имбецил — КодеБлокс, потому что почему-то не видит файлов реализации, а хедеры видит. Ок, для интересу я определил функции прямо в хедерах:

   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 ===|

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

Reply #33 on: November 9, 2009, 04:46
Всё понял. Я ранее недооценивал уровень ущербности Сиплюса. Надо шаблоны реально писать в хедерах. Писец. Маразм крепчал.

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

Offline Triton

  • Posts: 5744
Reply #34 on: November 9, 2009, 09:37
Гринь, извините, но прежде чем называть кого-то имбецилом, не помешает прочитать инструкцию на пользуемый инструмент.
Шаблоны надо писать именно в хэдерах, потому что они по своей сути - макросы, подставляемые во время компиляции. Вынести их cpp не представляется возможным.

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

Offline myst

  • Posts: 35581
Reply #35 on: November 9, 2009, 14:33
Шаблоны надо писать именно в хэдерах, потому что они по своей сути - макросы, подставляемые во время компиляции. Вынести их cpp не представляется возможным.
Можно, но надо помнить: первое, выхлоп компилятора — машинный код, никаких шаблонов в объектных файлах уже нет; второе, компилятор создаёт только экземпляры шаблона, необходимые в данной единице компиляции. Если нужен экземпляр шаблона для другой единицы, надо сказать об этом компилятору. Так как это зело негибко, это почти не практикуется, и шаблоны хранят в заголовочниках.

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

Offline Triton

  • Posts: 5744
Reply #36 on: November 9, 2009, 16:42
О том и речь. Так же как теоретически можно и вручную в cpp вписать объявления нужных внешних функций и описания типов данных, а практически они хранятся в h.
Молиться, поститься и слушать радио Ватника

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

  • Blogger
  • *
  • Posts: 24117
  • Gender: Male
Reply #37 on: November 11, 2009, 13:49
Гринь, извините, но прежде чем называть кого-то имбецилом, не помешает прочитать инструкцию на пользуемый инструмент.
Не, когда используешь некий инструмент, 90% времени идёт руководствование ЗДРАВЫМ СМЫСЛОМ (некие общепринятые стандарты, интуитивность интерфейсов и т. д.), когда же в 10% ЗДРАВЫЙ СМЫСЛ отсутствует, нужно читать маны. Когда же у какого-то инструмента всё ровно наоборот — костылей больше, чем здравого смысла — то это уже херня на постном масле, а не «инструмент».

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

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

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

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

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

Offline myst

  • Posts: 35581
Reply #38 on: November 11, 2009, 14:33
Они идиоты: осилили раздельную компиляцию *.cpp-файлов в *.o файлы с последующей общей линковкой, но сделать что-то подобное с шаблонами не осилили, а ведь могли сделать формат *.tem, который бы тоже делался в некий объектный метакод, а потом линкером всё бы скреплялось. Ан нет, такого нету.
Вот тебе статья на злобу дня.
А вот тебе прямая ссылка на компилер, который умеет раздельную компиляцию шаблонов: http://www.comeaucomputing.com/

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

Reply #40 on: November 11, 2009, 14:38
Поэтому я снова возвращаюсь к сяхе, попытка полюбить цэпэпэ не удалась.
О да! Си — это предел совершенства, когда нужно загубить несколько тысяч человеко-лет.

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

  • Blogger
  • *
  • Posts: 24117
  • Gender: Male
Reply #41 on: November 11, 2009, 14:54
А вот тебе прямая ссылка на компилер, который умеет раздельную компиляцию шаблонов: http://www.comeaucomputing.com/
Что-такое про него слышал, но его покупать ещё надо :) И не знаю, насколько он совестим с gcc, а люблю расширения gcc.
И, кстати, что насчёт компиляции шаблонов в стандарте? Это как-то оговаривается, или implementation-dependent?

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

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

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

Offline myst

  • Posts: 35581
Reply #42 on: November 11, 2009, 15:08
И, кстати, что насчёт компиляции шаблонов в стандарте? Это как-то оговаривается, или implementation-dependent?
У меня нет стандарта. По-моему, жадные стандартизаторы его зажали.

Reply #43 on: November 11, 2009, 15:12
в чём проблема?
В том, что людям надо программный продукт делать, а не обработку исключений, наследование, виртуальные методы, ..., ну ты понял. :)

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

  • Blogger
  • *
  • Posts: 24117
  • Gender: Male
Reply #44 on: November 11, 2009, 15:25
Единственное, что меня огорчает в сишных макросах, так это отсутствие возможности макросом генерить другие макросы, напр. что-нибудь вроде так:

#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) по вызываемым методам и полям. А если полей вообще не вызывается? Как ограничить типы только для примитивных? Мне это надо!

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

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

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

Offline myst

  • Posts: 35581
Reply #45 on: November 11, 2009, 15:28
Хочешь мощных макр — бери CL.

Offline Triton

  • Posts: 5744
Reply #46 on: November 11, 2009, 17:06
Хедеры это вообще-то элемент хорошей, годной архитектуры отделения интерфейса от реализации. Почему это круто — см. гугл.
Годной?! :o
Механическая вставка файла в файл препроцессором — это самый наикостыльнейший костыль. Как и препроцессор в целом...
+100.


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


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


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

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

  • Blogger
  • *
  • Posts: 24117
  • Gender: Male
Reply #47 on: November 11, 2009, 18:32
»
Quote
Шаблоны это самые обычные допотопные сишные макросы, только типизированные — и всё.
Цитата: Алексей Гринь от Сегодня в 13:49
Quote
Хедеры это вообще-то элемент хорошей, годной архитектуры отделения интерфейса от реализации.
Взаимоисключающие параграфы детектед.
Человек, не отличающий понятия «хедер» от понятия «макрос», детектед.

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

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

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

Reply #48 on: November 11, 2009, 18:52
Ещё вчера я вон, набыдлокодил макросы для быстрого протипирования классов (а то много ручной работы выходит).

/* 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
肏! Τίς πέπορδε;

Offline Triton

  • Posts: 5744
Reply #49 on: November 11, 2009, 19:21
Человек, не отличающий понятия «хедер» от понятия «макрос», детектед.
Человек, не знающий, чем занимается команда cpp, детектед.


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

ДВУХпроходные компиляторы
Хм, компиляторы чего?
Молиться, поститься и слушать радио Ватника

 

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Note: this post will not display until it's been approved by a moderator.
Name: Email:
Verification:
Type the letters shown in the picture
Listen to the letters / Request another image
Type the letters shown in the picture:
√49 Напишите ответ строчными буквами:
«Сто одёжек, все без застёжек» — что это?: