LINUX.ORG.RU

Сломал мозг

 


0

4

Возвращаясь к предыдущей теме: http://www.linux.org.ru/forum/development/9153691

Этот подход получился неудачным.
Поэтому попробую заново сформулировать вопрос по-другому.

Есть 10-20 материалов, у которых есть свойства p1, p2, ...
(в зависимости от материала набор этих свойств может отличаться).
Это можно задать через struct mat{...}. Также у каждого материала есть вычисляемые функции, т.е. методы (у каждого они разные).
Можно все это обернуть в class на основе виртуального класса.

Все эти материалы нужно будет передавать в процедуру.
Т.к. количество материалов может быть разной,
то необходимо их передавать либо в виде списков, массивов или еще как-то.

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

Каким методом все это реализовать, чтобы получался код наглядным и простым?
С помощью каких элементов с++ это лучше всего будет сделать. В основном интересует сам подход.

З.ы. Если это возможно, то в рамках стандартного с++98.

★★★★★

Ответ на: комментарий от indie

У меня тут появилось часик, чтобы расписать тебе лалке твои фейлы.

В контесте задачи, раз ты так любишь контекст,

Ну давай я тебе теперь объясню в чем смысл твоего кода:

Смысла в шаблонах там нет, ибо ты не осилил алокаторы.

typedef struct {
  uint16_t acc;
  uint8_t val[0];
} __attribute__ ((aligned(8))) type_t;

Так делают про пацаны и не получают оверхеда на типы, а почему они не получают? Патамучто после 2-х байт acc будет 6нулей, а что будет если мы сложим 6 нулей? Правильно - ничего.

Т.е. наша функция пишется так: acc + (val[0] + ... val[5]);

Форич заменяется на вайл, поэтому не нужен. Вектор тоже не нужен.

В твоём ущербанском тесте 50% занимает ранд, что какбэ говорит о многом.

В конечном итоге - твоя портянка заменяется на рекативную:

typedef struct {
  uint16_t acc;
  uint8_t val[0];
} __attribute__ ((aligned(8))) type_t;

type_t * pull, * end;

inline void call_f(void) {
  for(type_t * it = pull; it != end; ++end)//for_each сешлворю 
    it->acc = (it->val[0] + it->val[1] + it->val[2] + it->val[3] + it->val[4] + it->val[5]);
}

Даже эта портянка - шлак и заменяется на на 2строчки и uint64_t и масками.

Но даже это работает примерно так же, как мой универсальный код, который не зависит от функции, кол-ва аргументов и прочее.

Запись елементов ты не осилил запилить вменяемо, но даже тут у тебя шансов нет с твоим подходом.

Так же, гцц из твоего говна гинерит почти мой код, а в реальном мире - это будет нагромаждение говн, ибо сайзы векторов будут не константы и т.п.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

гцц из твоего говна гинерит почти мой код

когда ты это писал, ты кого хотел обидеть то?

anonymous
()
Ответ на: комментарий от anonymous

Я не хотел обидеть. Мы виде тотальный слив пациента, который тотально переделал свой код и написал его на сишке.

Он плюнул на все те догматы, которые он мне проповедовал 10повтов назад инаписал на сишке, выпилил различия между структурами и заюзал чары, чтобы не получить 50байт оверхед на елемент.

А он его получит, ибо мои типы были uint64_t - он наврал, схалтурил и слился.

ГЦЦ гинерит такой код ибо он написал халтуру, а реальный его С++ щит гцц бы не смог спасти. Ну ты не поймёшь почему.

Он написал ранды, когда я говорил ему их не писать.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Ну я переписывал свой вайл в его ворич в броузере, чтобы он понял, что его форич писать не быстрее не форича.

Магия копи-пасты находится за горизонтом твоих познаний. Хуево тебе живется.

anonymous
()
Ответ на: комментарий от superhackkiller1997

For each, в частности, полезен для того что бы такие криворукие ебланы типа тебя не «пиреписал» ++end.

anonymous
()
Ответ на: комментарий от superhackkiller1997

который тотально переделал свой код и написал его на сишке.

ссылку на первый вариант кода можно? почему его код является кодом на языке си?

Ну ты не поймёшь почему.

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

anonymous
()
Ответ на: комментарий от anonymous

ссылку на первый вариант кода можно? почему его код является кодом на языке си?

Первая страница. Там есть наследования, нет указателей на функции, нет енумов, юнионов и т.п. Тут даже классов нет.

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

Ну если тебе не понятно, что конпелятор может изимодную лажу за тебя подправить из-за изимодных условий, то да да - извиняй.

superhackkiller1997
()
Ответ на: комментарий от anonymous

И да, ещё раз повторю - он не заюзал ни одной нужной С++ фичи в своём коде.

Функторы - это банальные указатели на функции, а вернее методы которые по умолчанию вызвает форич - т.е. он их юзал ради форича.

Шаблоны он туда впихнул только из-за своего неосиляторства - он тупо заменил 1-й аргумент функции/елемент класса на шаблонный аргумент, который нидал ему ни единого профита.

Вектор тут не упал, ибо это не «динамический массив» и его вектор конпелятор тупо заменил на мой вайл.

Т.е. он написал код на чистых сях и заюзал форич только ради того, чтобы показать, что это типа С++, но пацаны-то знают.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

ссылку на первый вариант кода можно?
Первая страница.

вот список сообщений пользователя с именем indie с первой страницы:

visitor pattern же http://en.wikipedia.org/wiki/Visitor_pattern
indie * (23.05.2013 18:02:00)

vector<A*> a(2);
a.at(0) = &b;
a.at(1) = &c;

почему не

vector<A*> a;
a.push_back(&b);
a.push_back(&c);

?
indie * (29.05.2013 13:17:04)

А что изменится кроме замены struct на class и добавлением «public A» вместо «A» при декларации B и C?
indie * (29.05.2013 14:40:58)

что из этого является первым вариантом кода?

anonymous
()
Ответ на: комментарий от superhackkiller1997

Вектор тут не упал, ибо это не «динамический массив»

вектор - не динамический массив?

его вектор конпелятор тупо заменил на мой вайл

структуру компилятор заменил на цикл?

И да, ещё раз повторю - он не заюзал ни одной нужной С++ фичи в своём коде.
Т.е. он написал код на чистых сях и заюзал форич только ради того, чтобы показать, что это типа С++, но пацаны-то знают.

ещё раз повторю, компилятором си оно не соберется, это не си код, как бы ты не аргументировал это.

anonymous
()
Ответ на: комментарий от anonymous

Тотальный разбор:

Сломал мозг (комментарий) - сам написал на си вместо плюсов.

Сломал мозг (комментарий) - не плохо запилил и пытался мне это доказать - принял код.

Даже по теме ещё тысячи таких же фейлов, где он описывает правильный код, где он соглашается с тем, как написали другие - он считает, что так писать правльно.

Пациент доказывал мне про то, что мой код былокод, а потом написал так же( по-ущербански правда) и оправдал это моими же словами. Налицо чистый 100% слив.

superhackkiller1997
()
Ответ на: комментарий от anonymous

вектор - не динамический массив?

В коде нет «динамики».

структуру компилятор заменил на цикл?

Ну твои познания меня смешат. Из вектора там юзается только 2указателя, а форич и есть вайл.

ещё раз повторю, компилятором си оно не соберется, это не си код, как бы ты не аргументировал это.

Почитай 2-ю страницу. Это Си код, в который были впихнуты НЕНУЖНЫЕ с++ фичи просто для галочки.

И ещё раз повторю - я моу выпилить оттуда шаблоны, форич и код не изменится - кактак?

Моя аргументация неуязвими и тебе даже не колыхнуть её, не то, что сдвинуть.

superhackkiller1997
()
Ответ на: комментарий от anonymous

И да, жабистик. Си и С++ код - это не тот, который валиден для конпеляторов. Есть Систайл плюсы, есть новомодные плюсы( которые проведует данный пациент). Пациент явно проповедуя новомодные плюсы кинул их и заюзал Си-стайл плюсы(это свичи вместо виртуальных методов и т.п.).

Плюсы состоят из Си на 80%, а остальные 20% - это некоторые делати + стл.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

ни в одной из приведенных ссылок нет кода пользователя с ником indie. максимум что там есть, это указание на код пользователя Zodd-а. где первый вариант кода пользователя indie?

anonymous
()
Ответ на: Ещё раз для неразумных. от superhackkiller1997

Пациент заюзал СИШНЫЕ аналоги С++ фичей

покажи конкретный код

вернее С++ аналоги сишных фичей.

то есть код написан на си++, а не си?

anonymous
()
Ответ на: комментарий от superhackkiller1997

вектор - не динамический массив?
В коде нет «динамики».

замечательный аргумент.

Почитай 2-ю страницу. Это Си код, в который были впихнуты НЕНУЖНЫЕ с++ фичи просто для галочки.

можно точнее указывать? там 3 кода больших. как мне догадываться что ты имеешь ввиду?

И ещё раз повторю - я моу выпилить оттуда шаблоны, форич и код не изменится - кактак?

тоже чудесный аргумент, давай тогда все называть ассемблером или лучше машинным кодом.

anonymous
()
Ответ на: комментарий от anonymous

Да балаболка, у тебя нет шансов.

Указание типа в структере, не юзал проповедуемое наследованеи, классы и почти все С++ фичи.

Т.е. его структура - это копипаста с моей, когда он так явно говорил, что щас так никто не пишет. Написана на чистов Си.

Методы которые он юзал являются тупо функциями в структере, а в структуру он их записнул, чтобы сработал кастыль с шаблоном.

И ещё тысячи фейлов.

то есть код написан на си++, а не си?

Нет, балабол. Он юзал СИШНЫЕ аналоги С++ фичей, которые(С++ аналоги) явзяются аналогами СИшных фичей.

superhackkiller1997
()
Ответ на: комментарий от anonymous

замечательный аргумент.

Да балабол - это аргумент, с твоим уровнем это не аргумент, но я как-то клал.

можно точнее указывать? там 3 кода больших. как мне догадываться что ты имеешь ввиду?

Я кидал 2 порятнки - на сях и на «плюсах»( которые заметь тоже соберались в С-конпеляторе, но пациент доказывал, что это не С++).

тоже чудесный аргумент, давай тогда все называть ассемблером или лучше машинным кодом.

Причем тут ассемблер? Он поделил своим кодом на ноль, хотя ты жалкий жабист - откуда тебе знать, но я разжею тебе:

enum type_t { TYPE_A, TYPE_B, TYPE_C, TYPE_D };
 
template <size_t Size>
struct data
{
uint8_t val[Size];
uint16_t acc;
 
template <typename T>
inline void visit(T& visitor)
{
visitor(*this);
}
};
 
typedef data<3> data_a;
typedef data<4> data_b;
typedef data<5> data_c;
typedef data<6> data_d;
 
struct element_type {
type_t type;
union
{
data_a a;
data_b b;
data_c c;
data_d d;
} data;
};

Он создаёт шаблонную структуру, в которой шаблоном является длинна массива val. Т.е. смысл шаблона в том, чтобы конпелятор создал 4разны по размеру структуры.

Потом он 4разных по размеру структуры помещает в юнион - который имеет размер самой большой структуры.

Дальше он юзает классы лишь для того, чтобы конпелятор собрал его код.

Т.е. шаблоны и классы не имеют смысла и выпиливаются как бесполезный код.

В конечном итоге остаётся чистый сишный код.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Он юзал СИШНЫЕ аналоги С++ фичей, которые(С++ аналоги) явзяются аналогами СИшных фичей.

где он использовал «СИШНЫЕ аналоги С++ фичей»? код пожалуйста.

anonymous
()
Ответ на: комментарий от anonymous

Тут дело не в коде, как в портянке написанной тобой, жалкий жабист, а подходе к написанию кода( и разговор изначальной был об этом).

Так же, он говорил, что мои аргументы, аля «мой код быстрее и понтовей, чем это С++ фуфло» отвечал тем, чо он пишет такое же С++ фуфло и оно работает так же. И именно это он и хотел доказать.

Твоё жалкое понимание меня не интересует.

superhackkiller1997
()
Ответ на: комментарий от anonymous

Я уже тебе говорил, жабист, что он не юзал наследование и виртфункции( которые есть замена тип+свич).

Да и в его коде нет С++ фичей ниодной. Если ты ещё раз, мистер анскильность, заикнёшься о фориче, который к делу отношения не имеет, то уж прости модераторы тебя не защитять от гнева царя.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Т.е. шаблоны и классы не имеют смысла и выпиливаются как бесполезный код.
В конечном итоге остаётся чистый сишный код.

но его исходный код является си или си++ кодом?

anonymous
()
Ответ на: комментарий от superhackkiller1997

Я кидал 2 порятнки - на сях и на «плюсах»( которые заметь тоже соберались в С-конпеляторе, но пациент доказывал, что это не С++).

у тебя они обе (1 и 2) собрались с помощью «С-конпелятора»?

anonymous
()
Ответ на: комментарий от superhackkiller1997

Я кидал 2 порятнки - на сях и на «плюсах»( которые заметь тоже соберались в С-конпеляторе, но пациент доказывал, что это не С++).

indie * (30.05.2013 11:49:50)

А у тебя говнокод, т.к.:
* смесь ц и цпп

anonymous
()
Ответ на: комментарий от superhackkiller1997

Я вот не пойму, ты пидор? Тебе блять удовольствие доставляет когда тебя ебут? Сливаешь тут только ты, голубок. Запахни ебало или сосни хуйцов, на которые тебя тут регулярно сажают. Иди тухес себе штопай, сучара. Супер бля пизденыш отъебаный 1997 раз.

anonymous
()
Ответ на: комментарий от anonymous

Он является Си кодом по определению. Блин, это слишком сложно для жабиста. Ты не понимаешь, что такое Си, что такое плюсы. Как можно говори Си или С++ кодом, когда Си есть С++ код по определению.

superhackkiller1997
()
Ответ на: комментарий от anonymous

Заюзана ещё одна бесполезность, которая к коду отношения не имеет.

Т.е. если я возьму линукс-вебдро, впихну туда везде наймспейсы - оно будет С++ кодом? Иди поспи, жабист.

superhackkiller1997
()
Ответ на: комментарий от anonymous

Жалкая балаболка. Ладно, прощу тебе твою анскильность и напишу тебе, как неосилятору.

Он писал говнокод, ибо его код - это смесь ц и цпп. Сам себя обвинил.

Дак вот, ты можешь балаболисть сколько угодно, но запомни ты слишком анскилен, слаб, твой уровень аргументации, твои сопливые тезисы - просто детсад, и ниодного шанса у тебя нте.

superhackkiller1997
()
Ответ на: комментарий от superhackkiller1997

Он является Си кодом по определению.

приведи текст определения которым ты руководствуешься.

Ты не понимаешь, что такое Си, что такое плюсы.

назови отличия.

Как можно говори Си или С++ кодом, когда Си есть С++ код по определению.

приведи текст определения которым ты руководствуешься.

anonymous
()
Ответ на: комментарий от superhackkiller1997

Он писал говнокод, ибо его код - это смесь ц и цпп. Сам себя обвинил.

он писал про твой код. можешь пройти по ссылке и посмотреть кому оно адресовано было. сам себя он не обвинял. поправь меня, возможно я ошибаюсь. приведи ссылку на сообщение, где он себя обвинял в создании смеси кода си и си++.

anonymous
()
Ответ на: комментарий от superhackkiller1997

++end, залупа ты красная наша, голубок ты ненаглядный.

anonymous
()
Ответ на: комментарий от anonymous

Реально? Т.е. по твоему for(a : b) является не С++ кодом, ибо не осбирается в с++ конпеляторе?

type m[0] является тоже не Си кодом, ибо не собирается Си конпелятором?

А если код собирается на 2-х конпеляторах, то каким кодомо н будет считатся?

superhackkiller1997
()
Ответ на: комментарий от anonymous

приведи текст определения которым ты руководствуешься.

В детсад, хотя куда тебе в детсад без /dev/brain. Есть код - он считается С++ кодом только тогда, когда он реально использует особенности ЯП, которые данный код не использует.

назови отличия.

Отличия чего?

приведи текст определения которым ты руководствуешься.

ANSI C

superhackkiller1997
()
Ответ на: комментарий от anonymous

Не заюзал наследование и виртметоды - основной патерн С++. Заюзал свич и тип в структуре - основной паттерн Си построения аналогов С++ наследованию и виртметодам.

superhackkiller1997
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.