Вы видите копию треда, сохраненную 8 сентября 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый - https://2ch.hk/pr/res/1028033.html (М)
Не, это другой язык, и с Си совместим через ж.
Надо запилить локализованную версию ISO EBNF на русском, сделать на ней конпилятор конпиляторов, и разрабатывать синтаксис уже в EBNF.
А чтобы не изобретать велосипед, можно транслировать этот метаязык в LEX/YACC просто. Вот и вротенд. А для бэкэнда - LLVM.
с лмбдами!
C++ это си с классами от Страуструпа, шаблонами от Степанова, с лямбдами от Черча, со стандартной библиотекой от Плаугера, c метаклассами от Саттера, с программной транзакционной памятью от Найта... вы не заскучали? A то уже новый стандарт подоспел:
https://en.wikipedia.org/wiki/C++20
Там будет еще тысяча новых свистоперделов, чтобы вы НИКОГДА не смогли выучить этот ебланский язык.
Пока навелосипедил несколько мелких структур для не полных наборов, и одну общую для полного набора (с конструкторами для инициальзации из не полных наборов)
struct TRIV { int v; };
struct TRIVT { int v; int t; };
struct TRIVN { int v; int n; };
struct TRI
{
int v = 0;
int t = 0;
int n = 0;
TRI() { };
TRI(int V, int T, int N) : v(V), t(T), n(N) { };
TRI(TRIV t) : v(t.v) { };
TRI(TRIVT t) : v(t.v), t(t.t) { };
TRI(TRIVN t) : v(t.v), n(t.n) { };
};
и соответствующие парсеры для считывания этих вариантов.
Идея в том, чтобы получить возможность считывать неоднородные данные, и затем приводить из к определенному виду.
Если гонять парсеры по отдельности, все нормально работает, но когда смешиваю их в одно общее правило, спирит не может привести все к одному виду:
d:\libs\boost\boost\spirit\home\x3\support\traits\move_to.hpp(181): error C2665: 'boost::spirit::x3::traits::detail::move_to': none of the 3 overloads could convert all the argument types
1>d:\libs\boost\boost\spirit\home\x3\support\traits\move_to.hpp(150): note: could be 'void boost::spirit::x3::traits::detail::move_to<TRIV,Dest>(Source &&,Dest &,boost::spirit::x3::traits::variant_attribute)'
1> with
1> [
1> Dest=TRI,
1> Source=TRIV
1> ]
Как это разрешить? Полный текст: https://pastebin.com/2cp5NziH
Пока навелосипедил несколько мелких структур для не полных наборов, и одну общую для полного набора (с конструкторами для инициальзации из не полных наборов)
struct TRIV { int v; };
struct TRIVT { int v; int t; };
struct TRIVN { int v; int n; };
struct TRI
{
int v = 0;
int t = 0;
int n = 0;
TRI() { };
TRI(int V, int T, int N) : v(V), t(T), n(N) { };
TRI(TRIV t) : v(t.v) { };
TRI(TRIVT t) : v(t.v), t(t.t) { };
TRI(TRIVN t) : v(t.v), n(t.n) { };
};
и соответствующие парсеры для считывания этих вариантов.
Идея в том, чтобы получить возможность считывать неоднородные данные, и затем приводить из к определенному виду.
Если гонять парсеры по отдельности, все нормально работает, но когда смешиваю их в одно общее правило, спирит не может привести все к одному виду:
d:\libs\boost\boost\spirit\home\x3\support\traits\move_to.hpp(181): error C2665: 'boost::spirit::x3::traits::detail::move_to': none of the 3 overloads could convert all the argument types
1>d:\libs\boost\boost\spirit\home\x3\support\traits\move_to.hpp(150): note: could be 'void boost::spirit::x3::traits::detail::move_to<TRIV,Dest>(Source &&,Dest &,boost::spirit::x3::traits::variant_attribute)'
1> with
1> [
1> Dest=TRI,
1> Source=TRIV
1> ]
Как это разрешить? Полный текст: https://pastebin.com/2cp5NziH
Когда уже мелкомягкие вытащат filesystem из эксперименталки?
Два часа работы на перле и 10 дней ебанины на С++. Зато будет работать за 5 мс. Охуительная выгода.
На перле импортер моделей не напишешь.
Медленнее.
Зря ты перл упомянул. Местные макакены никогда с ним не работали, но точно знают что он хуже чем js/peton/любой другой язык нейм.
Местные макакены, которые с ним работали, ещё точнее знают, что он хуже чем js/peton/любой другой язык нейм.
Щас бы понтоваться знанием юзлесс некроговна некромамонта в 2017 году. Может еще коболом попонтуешься, или там PL/1 ?
Что точно делает std::thread::join()? Переустанавливает EIP на первую инструкцию кода потоковой функции? Почему называется join? Почему после выполнения join вызывающий код ждет завершения потока?
> Почему называется join? Почему после выполнения join вызывающий код ждет завершения потока?
Потому что ждет, когда поток присоединится заджойнится к нему.
Дурик, перл изучают в универах британии на ай ти факультетах.
Обосрался? Подотрись и уйди молча.
учу кресты
знаю Си
ПОЖЕЛАЙ МНЕ УДАЧИ
ГРУППА КРОВИИИИИИИИИИИИИИ
какие кодеки епт
берепт - береж и реализуешь какой-нибудь стек протоколов по передаче потокового видео в сетяй tcp/ip
там будут указаны и кодеки и все остальное
В каких случаях возвращать из геттера ссылку, а в каких значение?
Тому что ты плагин Clang Code Model не включил.
>>1037648
>Переустанавливает EIP на первую инструкцию кода потоковой функции?
Что, блядь? Где в стандарте плюсов есть слова "инструкция" и "EIP"?
>Blocks the current thread until the thread identified by *this finishes its execution.
http://en.cppreference.com/w/cpp/thread/thread/join
>>1037688
Нихуя не понял.
>>1037743
Нахуй тебе геттер, если ты ссылку возвращаешь?
Сделай конечный автомат, который либо пишет путь в стек, либо ссылки разворачивает.
Таки разобрался со спиритом. Даже если оба операнда вариативного парсера возвращают типы, которые могут быть неявно преобразованы друг в друга, он все равно вернет variant<A, B>. Пришлось сделать для него визитор на шаблоне, чтобы он внутри себя все преобразовывал в итоговый тип.
я хуй знает. qmake вызывать надо
Если на CMake, то все норм будет, иначе - никак. Они пока что даже не собираются нормальную поддержку редактирования CMake скриптов сделать, что уж говорить о других системах сборки (того же make, например, как самой простой и одновременно дурацкой системы сборки). Если подумать, если можно системой сборки сгенерировать проект для CodeBlocks, тогда и подключить CLion к нему плевое дело.
Реализуй WebRTC, нахуй изобретать что-то.
Вообще, насколько фанатично надо использовать const?
Ни в каких не надо использовать. Это страуструповый рак. Такое нужно лечить химиотерапией и полуторалитровыми клизмами.
>В каких случаях возвращаемое значение функции должно быть const?
Только в тех случаях, когда ты возвращаешь класс, который ты ну никак не разрешаешь менять. Тупой вопрос.
Время модификации скопированного файла где-то в прошлом.
2. Что почитать про разбор текстовых форматов файлов и вообще текста? Постоянно получаются чудовище на несколько сотен строк, примерно как на второй картинке. Можно, конечно переменные подписывать, но код и так очевидный по большей части, просто длиннее будет. Достаточно применение этих однобуквенных в начале указать. Тут для себя файлы с jps-ки запарсить, они изначально все верные, а если туда добавлять ещё проверки на корректность файла, то это же вообще ужас будет.
Потому что у каждой лямбды уникальный тип. Это во первых, во вторых лямбда - это объект класса, а ты пытаешься приравнять его к указателю на функцию.
Надо ли каждый метод перегружать const и не-const версиями, или достаточно сделать одну const версию?
Пиздец, можно задать такой вопрос о любой черте языка. Ты охуел?
>> std::function<int(huint)>
Попизди-ка мне тут. Открой стандарт и там написано, что лямбда представляет собой класс с определенным operator(), ну и еще некоторыми дополнениями, суть которых здесь не особо важна.
Стандартная библиотека лишь позволяет завернуть лямбду в std::function.
Я вообще не тот тип, которому ты отвечал Я мимокрокодил.
virtual имеет значение только тогда, когда ты пользуешься полиморфизмом указателей.
Если планируется его переопределять в подклассах, то виртуал, если нет, то нет, очевидно же.
auto cap= vector.capacity();
vector.clear();
vector.reserve(cap);
только без деаллоков-аллоков лишних.
>Вообще, насколько фанатично надо использовать const
Везде. Не слушай долбоебов. Запрещено все, что не разрешено явно - хорошая полиси, помогает освободить от множества головняков на последующих итерациях разработки.
>никогда не доверяй референсам на русском языке
Эмпирическое правило опять сработало. Стандартом это не оговорено. Implementation dependent короче.
>возвращай const-значение.
Еще забыл конст ссылку. Про откровенное петросянство речи не было.
В RFC все есть. Вообще это обычная практика в сетевых протоколах, зато моторолобояре довольны.
Пересобирать проект после замены файла пробовал?
В англоязычной версии написано то же самое и есть ссылка на ответ на стаке. Клир эквивалентен эрейзу от начала до конца, на стаке говорят, что эрейз не может менять капасити. В стандарте не нашёл:
http://eel.is/c++draft/vector#modifiers
>>1038736
>>1038707
Родина дала тебе itons и кучу всего другого.
Так неочевидно было, что порядок байтов разный будет. Вот и мучился. Теперь буду rfc читать все-таки.
>В англоязычной версии написано то же самое и есть ссылка на ответ на стаке.
Где нет внятного доказательства, что clear не меняет capacity.
> Клир эквивалентен эрейзу от начала до конца
Это до C++11 так было.
>Что почитать про разбор текстовых форматов файлов и вообще текста?
boost::spirit. Базарю еще захочешь.
Хреново. Стандартопетухи все тащят и тащят в стандарт все говно, что найдут вокруг. Прям, как Вован из пасты.
reinterpret_cast
> C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.Cpp.Redirect.14.props(46,3): импортированный проект "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.cpp.props" не обнаружен. Проверьте правильность пути в объявлении <Import> и убедитесь в наличии файла на диске.
Как фиксить? Файла-то там нет этого. Даже если подложить из Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets его - та же ошибка.
А, всё понял.
> The WDK is not yet compatible with Visual Studio 2017.
Заставляют жрать недоделанное говно.
Ну например так:
template<typename ... Args>
void fwd_call(Args ...args) {
some_fn(args...);
}
https://pastebin.com/A9g93esN
Не могу понять почему у меня count увеличивается даже когда значения a и a[j] не равны. Объясните пожалуйста почему? И как сделать цикл так что бы сверять значения друг с другом
Вот задача что бы понять контекст: Дан массив. Выведите те его элементы, которые встречаются в массиве только один раз. Элементы нужно выводить в том порядке, в котором они встречаются в списке.
Формат входных данных
В первой строке вводится количество элементов в массиве. Во второй строке вводятся элементы массива.
Формат выходных данных
Выведите ответ на задачу.
Мм, благодарю.
Была похожая задача на собеседовании (привести как можно больше способов узнать количество повторений значения).
На векторах сделать можно, но пердолинг выходит, попробуй сделать на std::map или std::unordered_map.
По твоему вопросу - ты не обнуляешь счетчик.
Можно оптимизировать присваивая счетчику сразу 1, а внутренний цикл начинать не с 0, а с j + 1.
https://stepik.org/lesson/13025/step/14?unit=undefined - эта задача
Идея в том что, если в массиве нету второго такого же элемента, то счетчик будет равен одному (когда его будут сравнивать с самим собой), но у меня почему то этот иф не работает и счетчик увеличивается каждый цикл независимо от значений, почему? А про обнуление это точно, спасибо
Кстати заметил, на этапе инициализации ты создаешь вектора размера n, а потом пушаешь еще значения. Создавай или пустые вектора или не пушай, а присваивай, обращаясь по индексу (a = temp).
Счетчик, походу, по этому и увеличивается.
Я хз как кодировать на Си, но алгоритм такой:
Берем первый элемент X далее пробегаемся по массиву X+1 и делим каждый на X если резуьтат деления 1 без остатка. значит мы нашли повторяющийся элемент.
ну и сообственно от этих данных строим массив.
Если результат деления не 1, то пустое значение, если результат 1, то пишем элемент.
Как то так.
На питоне бы ебанул на СИ хз как
Это квадрат, нахуй такое решение. Даже предварительное упорядочивание и проход по упорядоченному массиву будет значительно быстрее.
какой нахуй квадрат. ты береш первый элемент массива и делишь все элементы, потом второй и так далее.
> ты береш первый элемент массива и делишь все элементы
(n-1) операций,
> потом второй
(n-2) операций.
> и так далее
(n-3)
...
1
Сумму сам найдешь?
n(n-1)/2 ~ O(n^2).
Тогда как эту задачу можно решить за O(nlogn).
Кроме того, зачем использовать деление, если можно тупо сравнивать элементы?
Да по алгоритмам и структурам данных что-нибудь стандартное почитай. Тут от матана только логарифм и O-нотация.
Просто гугли "алгоритмы и структуры данных". Там видео, статьи, книги, вики. Что нравится больше, то и изучай.
Какой интересный сайт, первый раз такое вижу, 10/10 идея.
Есть что-то такое в несколько раз сложнее? Я с другого языка перекатываюсь, и мне бы стоило попривыкать к стандартной библиотеке. А то всё руки тянуться вручную все массивы на указателях делать и прочее такое.
А тут попробовал для твоей задачи std::unordered_map из поста выше (я никогда ничего такого не использовал — в моём языке любой двухсвязный список вручную нужно было для каждого типа, шаблонов то нет. Максимум, у меня была обёртка вокруг указателей, так что указываешь размер типа и он создаёт для неё этот список. Но при обращении к любому элементу нужно использовать приведения типов. И ещё там куча лишних вызовов функций возникает и куче другого мусора.) и это бесподобно, в три тысячи раз удобнее - решение за минуту пишется, где раньше пришлось бы или насиловать массивы, или копировать откуда-то код для аналога std::map изменяя все типы.
На крестах не то, чтобы легко работу найти. Или легко, но разгребать какое-нибудь легаси на пару с Delphi.
Если есть желание, то можешь какой-нибудь другой язык учить. Даже если кресты останутся твоим основным языком, изучение языков даёт пощупать другие концепции и подходы, что улучшит твои навыки программирования в целом .
Там если этот один стандарт читать и пытаться понять его займет столько времени, что уже новый стандарт выйдет. Касательно работы, есть множество контор, некоторые требуют глубокого знания языка (SFINAE и прочие шаблонные ништяки), в других случаях хватает только поверхностного знания языка (что такое деструкторы, порядок инициализации, время жизни, и др), короче, база, потому что шаблоны, конечно, полезны, но никто подход OOD еще не отменял, поэтому, кроме случаев контейнеров, бывает, обходятся и без них.
Вообще, посмотри на Python, например, он вообще, в целом универсальный, выразительный и простой язык, в дальнейшем его понимание может пригодиться для постройки прототипов (а прототипы зачастую нужны, чтобы проверить, верна ли твоя теория по поводу склеивания паттернов или нет или еще каких), да и с крестами вяжется вполне нормально, так что его преимущества можно будет тоже подтянуть.
Ну а фреймворки - это дело такое, их пиздецки много (если речь идет не о монструозных, наподобие Qt), там уже по интересам, куда пойдешь, может будешь всю жизнь макакой писать GUI для макдака, или, например, уйдешь в сетевое программирование (а там уже придется изучать системные вызовы), так что тут дело неоднозначное.
>>1040123
Спасибо за ответы. Я собираюсь идти по пути C++/Java/python. С++ скорее для себя изучаю, как основу программирования. Там где я живу(Кипр) вряд ли есть работа для мидлов и джунов на С++. Тогда продолжу заниматься по учебнику, наверну Effective C++ потом есть книга про 47 задач в С++ и перейду к Джаве, она будет у меня еще в университете.
Число с плавающей запятой представляется с использованием мантиссы, показателя степени и знака. Это ДВОИЧНОЕ число, скорее всего, ты не сможешь представить его в виде конечной десятичной дроби, поэтому при вычислениях выходит пиздец сколько знаков. Точное значение дает только оригинальное двоичное представление в формате (+/-) M * 2^F.
Пиздец какой-то, пожалуй я пропущу этот момент.
Сколько реализовано, столько и хранят. float и double - числа в формате IEEE 754.
http://en.cppreference.com/w/cpp/types/numeric_limits
Пришло время читать 754 стандарт.
Если правильно помню, то для float вроде бы около 26 цифр после запятой максимум. Алсо printf майкрософта не умеет их все напечатать.
Float 7 значащих, double 15. Число цифр после запятой нельзя предсказать. Ну что же вы, плюсисты!
На практике похуй, сколько там десятичных циферок после запятой (тем более, это сложно определить и зависит от компилятора и от самого числа). Ты для чего такой вопрос задаешь? Какая у тебя задача?
Если они используются только этим методом - это его локальные данные, и в классе они на хуй не нужны. Чтобы не пересоздавать - кури мануалы по кейворду static.
Если я правильно понимаю, то со словом static все экземпляры класса будут разделять эту переменную, мне это не нужно.
т.е.
class huias {
private:
//...
struct {
int huint;
std::string huing;
std::vector huector;
} p_myMethodData;
//...
};
Решения проблемы всего два: ты либо сохраняешь данные в объекте, либо не сохраняешь. Сохранение в отдельной структуре просто минимизирует засерание интерфейса.
И, потом, как ты их инициализируешь? Как узнаешь, что они не инициализированные? Что возвращает метод?
s += sprintf(s, " %s", (param) ? cliopt : "no-"cliopt);
ошибка: невозможно найти оператор строкового литерала «operator""cliopt» с аргументами «const char [4]», «long unsigned int»
Я не шарю в cpp, мне только скомпилировать прогу, msys2 ругается.
while (std::cin >> value)
{
a+=value;
}
cout <<a;
Но у меня эта программа не работает. После ввода чисел ничего не происходит. Почему так?
Алсо, сейчас вроде уже c++20 выходит, а учебник по 11 версии, это сильно плохо?
C++11 считается хипсторским новшеством, которое до конца ещё не все компиляторы поддерживают. Т.е., даже на C++17 писать ещё рано.
Если добавить букву в конце то и у меня работает, просто в книжке про это написано не было, просто ввод чисел и заебись, вот я и подумал, что сделал что то не так
Маня, везде уже С++14, кроме несчастных людей, с поддержкой WinXP и прочим некроговном некромамонта.
Везде это где? MSVC только с 17 более менее начала стандарт поддерживать, gcc с 5 (учитывая что актуальная для RHEL версия - 4.8.5).
Я скажу по другому - единственная контора, где был C++98, это чуваки, делающие что-то для военки под WinXP. Во всех остальных конторах, о которых я знаю - минимум С++14. В том же Яндексе - Шланг 4.0. У меня в конторе - чуваки балуются с g++7, хотя в продакшене 5.4 (которая умеет в 14). На прошлом месте работы я писал в 2015 студии, которая умела в практически весь 14. И везде так. Самое сложно было лет 5 назад уйти с говнокомпиляторов на что-то модерновое, с поддержкой 11. А сейчас это уже проще.
Во всех более менее крупных конторах тем не менее 11 это предел мечтания, опять же потому что энтерпрайзные линуксы держат маааксимум 138-139 ABI. Соответственно остается ubuntu, но там денег нет как таковых чтобы под нее продукты делать в 2к17.
В Яндексе возможно, эти жополазы всегда славились любовью к бете альфы последнего гцц в продакшене.
MSVC15 поддерживает 14 стандарт на пол шишечки. https://msdn.microsoft.com/en-us/library/hh567368.aspx
Если кто-нибудь объяснит тупому, буду благодарен
забыл вывод
А может быть ты знаешь? Я не очень хорошо в этом разбираюсь, может быть что-то очевидное пропустил.
Есть DirectDraw. Если выводить двухмерную графику через него, то даже на древнем ноутбучном целероне без видеокарты оно выдавало 60 фпс, даже если там в два слоя экран зарисовать. Если я просто вывожу что-то размером с экран на том же ноутбуке через openGL, то выше 40 фпс мне не оторваться, даже если отключить все линейные интерполяции и корректность перспективного преобразования поставить в минимум. Там же все эти матрицы преобразования и прочий мусор считаются для каждого пикселя, никаких оптимизаций от 2d оно не использует.
Сейчас эта проблема ушла в прошлое, конечно, но всё-равно, пустое opengl-окно загружает ядро процессора где-то на четверть, когда полноэкранная directdraw-программа где-то на 2-3% (да и не пустая тоже, если посмотреть на древние dd-игры).
Есть glRasterPos/glDrawPixels которые решают эту проблему, но там вроде как только масштабирование и простейшие фильтры на цвета есть, а я совершенно точно видел в играх плавные повороты в 2d. И новые версии opengl в общем-то вовсе не содержат эти glDrawPixels. Как быть? Эту dd-производительность можно вытащить не используя gl-контекст версии 1.1?
в опенгл рисуй с ортогональной матрицей трансформации. А вообще - забей на древние универские компы, в которых стоит железо, на которое насрать вообще всем. Если надо что-то показывать - спизди любой ноутбук с коре2дуо, там уже опенгл 3.х работает
А что конкретно этот макрос должен делать? Похоже на какую-то отладочную фигню. Можно попробовать просто выпилить его тело, или заменить на 's+="foobar"'
>Foo(std::string&& _s) :s(std::forward(_s))
У _s тип rvalue-ссылки, но само по себе _s - это lvalue-значение (к нему можно обратиться по имени, потыкать что-то, поменять). Получается & && => &.
DirectDraw сами майки давно закопали, сейчас ЛЮБОЕ 2d на самом деле 3d, без матрицы искажения перспективы.
Тормозит, потому что пишешь через легаси, на огле не имеет смысл писать если его версия старше 3.0 (нужны свежие драйверы видюхи, и может не взлететь на совсем некроговне). Учи пайплайны и шейдеры, чтобы не быть батхертом, и пиздуй в огл-тред /gd.
Не плохой старт можно освоить через opengl-tutorial.org
есть функция с тремя аргументами вида:
someClass::func (int a, bool b = false, int c = -1);
Как видно, "b" и "c" имеют дефолтные значения.
Можно ли как-то сделать так, чтобы третьему аргументу (с) надо было обязательно присваивать значение при вызове функции в том случае, если явно задается второй (b)? Помимо перегрузки, конечно.
Суть в том, что мне нужно, чтобы аргумент "с" обязательно был задан, только когда b = true, для случая, когда b=false, значение "с" просто не используется.
Большое спасибо
А зачем тебе тогда b? Сделай две перегрузки, первую только с параметром a, а вторую с a и с. Общий функционал вынеси в отдельный метод. Если не хочешь светить его, можешь объявить в анонимном пространстве имен внутри сорца.
>сейчас ЛЮБОЕ 2d на самом деле 3d
Ой ли? Почему тогда Age of Empires II 2000 года всё ещё задействует ядро максимум на 2-3%? Тогда как ремейк AoE II HD (сделанный уже как 3d для совместимости с win7 и старше) ядро полностью загружает, при том, что скриншоты почти 1 в 1 совпадают? Ясно конечно, что они намутили с двойной буферизацией и из-за ожидания буфера там ядро полностью загружается даже пустой сценой. Но даже если это исправить в своём коде - меньше 25% ядра ну никак не выходит загружать (если выводить хоть какое-то изображение на весь экран в "3d режиме" с матрицами).
>Тормозит, потому что что пишешь через легаси, на огле не имеет смысл писать если его версия старше 3.0
Я знаю как использовать новые версии гл. Почему не имеет смысла, объясни пожалуйста? Создавая древний 1.1 контекст мне всё-равно доступен весь функционал 3.0+ через расширения без потери производительности и с сохранением древних функций.
Я сейчас переделал одну небольшую хрень с 1.1 на 3.0+, загнал свои glBegin/glEnd в VAO и всё такое. Разницы - никакой вообще, только появилось много лишних строк для этих массивов вершин и шейдеров-заглушек. Ради чего мне использовать 3.0+ сейчас? Я не собираюсь писать под телефоны на GL ES, и мне есть чем заняться, кроме как писать обёртку вокруг вершинных массивов (для того чтоб получить удобный аналог glBegin/glEnd на 3.0+). Имхо, это всё-таки удобно, когда нужно три треугольника для мелкой детали интерфейса нарисовать, чем каждую точку хранить в массиве или буфере.
>>1040428
>сли правильно помню, то для float вроде бы около 26 цифр после запятой максимум.
>Float 7 значащих, double 15.
В каком стандарте так написано?
>>1040457
>тем более, это сложно определить и зависит от компилятора и от самого числа
http://en.cppreference.com/w/cpp/types/numeric_limits
Единственное, о чём там не сказано - это denormalised-числа.
>>1040534
У тебя cliopt не определён. Когда он определён, у тебя будут соединены две строки. Когда он не определён, будет такая шняга, как эта (компилятор ищет user-defined literals).
Нужно больше кода, тогда подскажу. Олсо:
> the \ character must be the last character on the line.
>>1040552
operator>> объекта std::istream возвращает другой std::istream. std::istream преобразуется в bool (как того требует использование выражения в скобках около while/if) следующим образом:
http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool (снизу табличка)
>>1040548
>которое до конца ещё не все компиляторы поддерживают.
ГЦЦ и кланг поддерживают, а Студии всегда насрать на это.
>>1040559
>учитывая что актуальная для RHEL версия - 4.8.5).
https://gcc.gnu.org/gcc-4.8/cxx0x_status.html
С++11 там есть.
>>1040621
Выбирается идеально подходящий оверлод конструктора - принимающий ссылка на конст-строку, никакого мува там быть не может, аргумент-то:
1) конст
2) лвалью, то есть для него будет вызван деструктор в другом месте программы, и будет пиздец
Даже если бы ты сделал не const-ссылку, то никакого мува там бы не было по причине 2, там было бы копирование. Мув применяется только для рвалью, а передать лвалью в качестве рвалью-ссылки без std::move() ты не можешь.
>>1040635
>Есть DirectDraw.
Это же, типа, рисование во фреймбуфер процессором? Попробуй так же делать в ОпенГЛ.
https://open.gl/framebuffers
Про ДиректДрав что-то знаю, про 3Д ничего не знаю.
>я совершенно точно видел в играх плавные повороты в 2d
Это всё вычисления на процессоре.
>>1040671
Клион - это не компилятор.
>>1040684
Жир - часть рациона.
>>1040725
>Можно ли как-то сделать так, чтобы третьему аргументу (с) надо было обязательно присваивать значение при вызове функции в том случае, если явно задается второй (b)? Помимо перегрузки, конечно.
Нет.
Но если тебе прям очень сильно хочется выебнуться, то ты делаешь следующее:
http://coliru.stacked-crooked.com/a/e453ba6921447a67
Я лишь не смог защитить функцию от передачи в неё строки.
>>1040428
>сли правильно помню, то для float вроде бы около 26 цифр после запятой максимум.
>Float 7 значащих, double 15.
В каком стандарте так написано?
>>1040457
>тем более, это сложно определить и зависит от компилятора и от самого числа
http://en.cppreference.com/w/cpp/types/numeric_limits
Единственное, о чём там не сказано - это denormalised-числа.
>>1040534
У тебя cliopt не определён. Когда он определён, у тебя будут соединены две строки. Когда он не определён, будет такая шняга, как эта (компилятор ищет user-defined literals).
Нужно больше кода, тогда подскажу. Олсо:
> the \ character must be the last character on the line.
>>1040552
operator>> объекта std::istream возвращает другой std::istream. std::istream преобразуется в bool (как того требует использование выражения в скобках около while/if) следующим образом:
http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool (снизу табличка)
>>1040548
>которое до конца ещё не все компиляторы поддерживают.
ГЦЦ и кланг поддерживают, а Студии всегда насрать на это.
>>1040559
>учитывая что актуальная для RHEL версия - 4.8.5).
https://gcc.gnu.org/gcc-4.8/cxx0x_status.html
С++11 там есть.
>>1040621
Выбирается идеально подходящий оверлод конструктора - принимающий ссылка на конст-строку, никакого мува там быть не может, аргумент-то:
1) конст
2) лвалью, то есть для него будет вызван деструктор в другом месте программы, и будет пиздец
Даже если бы ты сделал не const-ссылку, то никакого мува там бы не было по причине 2, там было бы копирование. Мув применяется только для рвалью, а передать лвалью в качестве рвалью-ссылки без std::move() ты не можешь.
>>1040635
>Есть DirectDraw.
Это же, типа, рисование во фреймбуфер процессором? Попробуй так же делать в ОпенГЛ.
https://open.gl/framebuffers
Про ДиректДрав что-то знаю, про 3Д ничего не знаю.
>я совершенно точно видел в играх плавные повороты в 2d
Это всё вычисления на процессоре.
>>1040671
Клион - это не компилятор.
>>1040684
Жир - часть рациона.
>>1040725
>Можно ли как-то сделать так, чтобы третьему аргументу (с) надо было обязательно присваивать значение при вызове функции в том случае, если явно задается второй (b)? Помимо перегрузки, конечно.
Нет.
Но если тебе прям очень сильно хочется выебнуться, то ты делаешь следующее:
http://coliru.stacked-crooked.com/a/e453ba6921447a67
Я лишь не смог защитить функцию от передачи в неё строки.
Прямо так, нельзя. Было предложение в стандарт, чтобы ввести пустые аргументы через зяпятые (типа как for. Foo(fuck, , you), но не взлетело.
Ну, под клионом я и его бекенд подразумевал, он может и в нативный код с оптимизациями.
1) кривой порт, той игры, например?
2) с пустым окном конечно разницы не будет. Попробуй на легаси реализовать отложенное освещение, например.
3) нужно не обертки делать, а думать над архитектурой рендерера
Блин, точно, я clang имел ввиду
Ну да, клион - это make-файлы, gcc - это ide, а grub - компилятор, ты все правильно понял.
Я же ниже пофиксился
2) Почему бы и нет, попробую на днях. Почту, телеграмм? Куда написать о результатах, если тебе интересно?
Почему бы не в этот тред?
>Если кто-нибудь объяснит тупому, буду благодарен
Ты, как и многие ньюфаги, путаешь типы с категориями значений.
В s(_s), _s это lvalue с типом std::string. lvalue не биндится к rvalue-ссылкам, поэтому перемещающий конструктор вызван быть не может, т.к. у него параметр — rvalue-ссылка.
Если написать s(std::move(_s)), то перемещающий конструктор будет вызван, т.к. std::move(_s) это xvalue типа std::string.
Обе работают, но forward преобразует в ссылку, соответствующую типу, таким образом предпочтительнее в таких случаях.
>то есть для него будет вызван деструктор в другом месте программы, и будет пиздец
Какую-то хуйню я написал, могу я сказать после чтения доков.
Подредактировал, но теперь, когда в массиве есть повторяющиеся значения он добавляет в новый массив 0. Откуда он берется не понимаю. Не можешь подсказать откуда он появляется и как от него избавиться?
>>1039440
>попробуй сделать на std::map или std::unordered_map.
Такие штуки я пока еще не проходил))
Я у мамы сишник, но вопреки всему такое решал весьма неоптимально (2^n грубо округляя). Если оптимизации не пытаться делать, то задача простая
Потому что на не-девелоперском RHEL'e за добавление rhscl расширений велика вероятность получить дроп лицензии, стоит, которая, на секунду, не мало даже для небольшого 16-сокетного сервера.
http://www.linuxcenter.ru/shop/distros/linux-distros/Red_Hat_Enterprise_Linux_for_IBM_POWER_Premium_16_sockets_Up_to_120_LPARs_with_Smart_Management_3_Years/
>деплоится
Если я правильно понял твоё хуесосовское наречие, ты говоришь о запуске.
Для запуска важна версия libstdc++, а не gcc.
lvalue-ссылку преобразует в lvalue-значение, rvalue-ссылку преобразует в rvalue-значение.
В крестах кроме rvalue-lvalue-ссылок есть ещё аналогичная таксономия значений, которая принимает участие во всей этой мишуре с rvalue-lvalue дичью.
Сам я всю таксономию тоже слабо осознаю.
>https://www.justsoftwaresolutions.co.uk/cplusplus/core-c++-lvalues-and-rvalues.html
>Finally, a named object declared with an rvalue reference (declared with &&) is also an lvalue. This is probably the most confusing of the rules, if for no other reason than that it is called an rvalue reference. The name is just there to indicate that it can bind to an rvalue (see later); once you've declared a variable and given it a name it's an lvalue. This is most commonly encountered in function parameters.
>>1040948
Может Мейерс и прав.
https://stackoverflow.com/a/15602073
> 2) Statically linking libstdc++ would work around the problem, but you don't need to, because that's what the Red Hat Developer Toolset (devtoolset) does for you anyway. The whole point of devtoolset is that it allows you to use a newer GCC and newer libstdc++ but without creating any run-time dependencies on the newer libstdc++ library. The compiled executables only need the system version of libstdc++.so that is always present on RHEL/CentOS, even systems without devtoolset installed.
Збс, ты решил задачу для laba1, теперь слинкуй статически все зависимости чтобы не было ABI-конфликтов.
>Сам я всю таксономию тоже слабо осознаю.
Там всё очень просто. Как только осознаешь, что у выражений есть 2 свойства: тип и категория значения.
Ну и пройдя полный цикл ты таки сам родил что придется отказаться от нового ABI. Браво.
А можешь пояснить откуда в ауте нули берутся
Например я ввожу :
5
1 2 3 2 3
И мне вместо того что бы выдать просто 1, выдает 1 0 0 0 0
Откуда эти 0 берутся и как их пофиксить?
>Подредактировал
Код показывай.
Но наперёд могу предположить что вектор с результатом у тебя сразу на n элементов, ты не можешь знать сколько их будет.
Хуй его знает, вот тебе мое всратое рабоче-крестьянское решение. В ТЗ сказано тупо вывести уникальные элементы, а не копировать их в отдельный массив.
> for (int i = 0; i < n; i++)
в цикле, в котором ты выводишь элементы вектора b, условие продолжения цикла неверное.
Правильно так:
for (int i = 0; i < b.size(); i++)
Или так:
for (const auto& i: b)
мимо другойанон
Есть файл с данными вида:
header число
type число
type число
type число
Как из него выделить все числа и обработать их соответствующим образом, как указано в префиксе? Паттерн state machine и регэксы?
Ты что-то пытался кукарекать про установку devtoolset для деплоя... Короче, обтекай молча.
Надо делать структуры и передавать функциям поинтер на них. Никаких глобальных переменных, они хуёвые.
struct huiuct {
int huint;
char huiar;
} huiuct_t, *phuiuct_t;
bool huiunc(phuiuct_t object, int param, int huiam) {
if (!object) {
return true;
}
return false;
}
В хедерах перед объявлениями добавь extern (без определений!), в исходниках сами определения.
// fuck.h
extern long long YRMOM;
// fuck.c
#include "fuck.h"
YRMOM = GetYrMom();
// somewhereelse.h
#include "fuck.h"
void fuckYrMom()
{
. short yrDick;
. PutIn(yrDick, YRMOM);
}
И да, в зависимости от архитектуры программы, это может быть очень не хорошим решением.
В хедере объявляешь переменные "extern". Для каждого хедера с глобалами/статиками делаешь .c-файл, в которой ты пишешь то же самое, но без extern.
А как мне собственно попроще сохранить на диске все данные, которые располагаются в различных экземплярах классов ( или как правильно называть?). Мой байтоебский мозг ничего лучше, чем напрямую скинуть байтики, не придумал.
я к тому, что руками придется писать то, что нужно, это тебе не жаба.
Smalltalk
Если класс trivial (т.е. все данные в нём интегральны) - сохранение класса на диск путём копированием из памяти будет правильным.
Eiffel.
std::string s = "......";
auto it1 = s.begin() + pos1;
auto it2 = s.begin() + pos2;
it1 = it2;
?
И как обстоят дела с работой на С/С++ за рубежом.
да ты что, серьёзно?
а потом на другой архитектуре прочитаешь?
а если собрать с другими опциями выравнивания?
нубяра, уходи, велосипедаст.
Прочитай вопрос ОПа, уёбок.
>как структуру в Си?
Если тебе не нравится fwrite, то напиши об этом автору вопроса а не мне, рептилоид.
Как сделать по уму, чтобы данные из крестовых контейнеров попали в эту функцию?
Пока не вижу альтернативы впиливанию буфера из std::array, заполнению его итераторами из контейнера, передаче через c_ptr в ту функцию, и выпиливанию этого буфера.
1. C std::vector всё просто, берешь поинтер на первый элемент и передаешь его: &huector.front(). Или, если у тебя проект >= С++11, то там даже есть специальный метод для получения ссылку на массив сырых данных: huektor.data()
2. Списки-хуиски надо сначала преобразовать в векторы-хуекторы, затем см. п. 1.
С чего начать, с Си или С++?
Читал что лучше с Си, потому что С++ это типо расширенная версия с классами.
Тебя обманули. C++ не требует знаний С и его можно учить независимо.
Учи С конечно же. Сеплэплас это язык для индусо-макак.
Вон одна уже пишет что даже Си знать не надо. Пердолить Страуструпские говноабстракции
что угодно кроме крестов
Выходит, я не могу просто описать наличие типа в .h, а в .cpp уже полностью раскрыть функциональность.
А если таки сделать в .h полное описание структуры, то:
Можно определить метод прямо в структуре или же можно объявить его в структуре, а определить в другом .cpp файле. То есть, варианта определить метод после структуры в .h нет.
Ещё хуже ситуация со статическими методами, их вообще можно только внутри структуры определять.
Аналогично с функциями, inline-функции определять прямо в .h (иначе они будут вовсе и не inline на самом деле, если я правильно понял это всё), а реальные функции в любом случае определять в .cpp, объявлять в .h. Даже если две функции с точки зрения логики программы делают что-то схожее, но одна из них inline, то описать их рядом нет возможности.
Не знаю, какую-нибудь простую идею модульности нельзя внедрить за столько лет? Типа, в каждом файле две части. В первой объявлены все глобальные переменные, функции и структуры для использования из других модулей. Во второй части структуры и функции использующиеся только внутри этого модуля и код для всего из первой части - для inline-функций, для не inline-функций, для статических методов, чтоб всё было однообразно и легко читалось. Так как пары объявлений-определений будут всегда строго в одном файле, всяким компоновщикам-линковщикам не придётся ругаться на множественные определения в разных единицах трансляции и прочие искусственные проблемы. В началах первой и второй части указываются другие востребованные для объявлений или определений внешние модули.
Можно даже обёртку вокруг текущего с++ сделать, которая будет засовывать все определения методов прямо в структуры, распиливать определения inline и не-inline функций в .h и .cpp файл - а для программистов всё будет выглядеть красиво и в одном месте.
> inline
Лел, G++ вообще игнорирует эту байду и инлайнит, что ему захочется, а что не захочется - не инлайнит, вне зависимости от того, пишешь ты inline или нет.
Спасибо, убежал учить Си
определить смерть не забудь
inline не совсем для встраивания функций придуман на самом деле. В крестах это к ODR, а компилятор и без inline может функцию сделать встроенной. Для этих дел есть __forceinline (MSVC) и __attribute__((always_inline)) (GCC, ...)
Но если кресты с твоей точки зрения умирают, что к чему столько ненависти? У тебя же конкурентов меньше, одни профиты.
а сколько ненависти у пяти крыс в жестяном ведре когда им кидают краюху хлеба на всех?
Начни с хаскеля.
>Не знаю, какую-нибудь простую идею модульности нельзя внедрить за столько лет?
Тем, кто привык, по-большому счёту до фени. Остальным не до фени - доля плюсов сокращается.
Ты рвешься ровном месте, это просто факт. Хотя может для тебя это и оскорбление.
>> inline
>Лел, G++ вообще игнорирует эту байду и инлайнит, что ему захочется, а что не захочется - не инлайнит, вне зависимости от того, пишешь ты inline или нет.
Говорят, что это зависит от уровня оптимизаций. До -O3 он инлайнит (или нет) только inline-функции, а не-inline функции никогда не инлайнит. При -O3 может инлайнить любые.
Стоит, но можно же так скачать
Как же? Я нее могу нагуглить ничего.
Единственное что могу придумать - обернуть через "#ifdef opr_metod" определение метода в .h , и в одном из .cpp файлов перед #include прописать "#define opr_metod". Но это костыль ещё более кривой и толстый...
Ребята, не думали что компилятор может перехватывать ваши данные и кроме компиляции отправлять их кому следует?
Все ищут вирусы не там где нужно, а на обычный компилятор вряд ли кто то подумает.
Как вам идея?
Помогите, пожалуйста, разобраться с одной вещью.
Меня напрягает необходимость объявления fout в 15 строке
и 31.Можно ли как-то это объявить в одном месте?
Такая же история и с переменными(29,30 строчки). Возможно ли их куда-то поставить в ОДНО место?Для повышения читабельности кода и его структуризации.
Заранее благодарю.
http://ideone.com/ZWkBrv
В 31 fout не требуется, ты же её вообще не используешь.
>Такая же история и с переменными(29,30 строчки). Возможно ли их куда-то поставить в ОДНО место?
Мм? Ты о чём? Они же и так в одном месте - на соседних строчках. Технически, можно написать в одну строчку, но читаемость от этого не повыситься.
Очень непонятно спрашиваешь, я даже приблизительно не могу предположить что ты имеешь ввиду под "одним" местом. Какой-нибудь пример, как это могло бы выглядеть. Может быть в каком-то другом языке было так, как ты имеешь ввиду?
Самое читабельное, что могу тут придумать - разместить красивый комментарий. Но эдак далеко не уплывёшь.
Писал бы хоть уровень знаний. Складывается впечатление, что ты не слышал даже про глобальные переменные и упоминая их не совсем ясно, то ли это будет оскорблением и тебе покажется, что тебя за дурака держат, то ли ты в самом деле не знаешь о них.
Может объявить один раз в файле глобально fout (и все остальные переменные) вне функций на 9..10 строчке (перед ними придётся прописать строчку "class MainProgramCore;", чтоб можно было объявить переменную objMainProgramCore) и потом использовать всюду, как cin/cout. Не делай этого.
хуясе ты ТЗ описал. Давай-ка поконкретнее.
>>1042297
т.е. винда отправляет - похуй, android отправляет - похуй, хром отправляет - похуй, подозрение на компилятор - не похуй?? Ты ведь можешь поглядеть в сетевой активности, что там куда и чего отправляет, и убедится.
>>1042314
fout объявленный на 31 строке не используется дальше, разве компилятор не уведомляет тебя об этом?
Не знаю что там может быть не понятного, я привёл ссылку которая указывает на строку исходного кода которая выглядит подобным образом - "_glfw.x11.xi.available", так вот мне не понятно, где вообще находятся эти "x11" и "xi"? Я слабовато понимаю в исходных кодах и вообще имею мало опыта в программировании, у меня не получилось найти эти элементы в исходных кодах, может быть вы подскажите?
>_glfw.x11.xi.available
Обычно такие вещи с передней нижней чертой обозначают кишки библиотеки, которые клиентам видеть не надо.
Собственно зачем ты туда лезешь? Возникает какая-то конкретная ошибка?
Ничего кроме вопроса на мой вопрос я и не ожидал. Мне нужно разобраться как функция работает на нижнем уровне.
Ты на линуксах? Эта штука явно откуда-то из xinput достает доступны ли устройства ввода.
Если работаешь в ide, разберись как у неё работает поиск определения (в visual studio это Go to defenition)
>fout объявленный на 31 строке не используется дальше, разве компилятор не уведомляет тебя об этом?
Нет, не уведомляет. Спасибо.
>>1042316
Я просто хочу понять этот принцип("разделение обязанностей" через функции).
>>1042314
Вот, понял, когда засыпал думал как раз про глобальные переменные. Сейчас изучу материал, спасибо.
В одно место имелось ввиду объявить один раз в коде и дать объяснение по поводу их назначения. Сейчас я понял то, как это реализовать. Спасибо. Если можешь, ответь на вопрос выше!
Везде в примерах какие-то сложные классы, клиенты...
27-30 строчка. Получился "блок", в котором я объявляю переменные. Я правильно всё понял?
http://ideone.com/iL54Ev
QNetworkAccessManager *huenager = QNetworkAccessManager ();
QNetworkRequest huequest(QUrl("http://huesite.ru));
QByteArray huiarray;
huiarray.append("param=Hello&");
huiarray.append("huiam=world");
huenager>post(huequest, huiarray);
> QNetworkAccessManager *huenager = new QNetworkAccessManager();
> QNetworkRequest huequest(QUrl("http://huesite.ru"));
Фиксики.
Да, так сделать можно. Зачем оно только тебе?
А вот правильно это или нет, это как посмотреть. С одной стороны всё работает и с этой точки зрения это верно.
А с другой у тебя может быть переменная требующая явной инициализации. Например, тебе внутри функции нужно изображение. Но в первых строчках функции размер изображения ты ещё не знаешь. Если изображение не умеет менять размер (а даже если и умеет, зачем лишний раз грузить машину изменением размера?), то тебе придётся объявлять переменную не в самом начале, хочешь ты того, или нет.
"for (int i = 0; i < number; i++) " тебя же не мешает, насколько я понял. Доводи до абсурда тогда уж - напиши "int i" в начале, а цикл поменяй на "for (i = 0; i < number; i++) ", лол. Или даже объяви i как глобальную переменную первой строчкой кода до начала любых функций, тогда тебе одного объявления хватит на всю программу. Только будут проблемы с рекурсией, вложенными циклами или многопоточностью. Ну да этого пока что нет, верно?
нужно обладать конкретными скиллами, кресты тут будут только инструмент
например, быть способным написать бота, что работает в обход gameguard
или быть способным в течении нескольких часов написать рабочий эксплойт на предоставленную 0day уязвимость что не будет валится на каждый чих и по быстрому интегрировать его в предоставленный эксплойт пак или что еще
или же пытаться устроится на toptal, crossover и прочее, но тут надо быть монстром с 10-15 годами опыта в офисе и тереть на инлише более-менее свободно
в ЛЮБОМ случае все это требует просто невьебенных скиллов, вкатывальщикам в 2к17 лучше сразу обоссать самим себя, так будет быстрее и эффективней
Понял, спасибо. Мне просто было интересно конкретно про ту ситуацию, когда одна переменная используется несколько раз в коде(=глобальная). Офк есть ситуация, когда переменная нужна только в рамках одной функции(=локальная), и её нет смысла объявлять в том блоке.
У меня появился небольшой вопрос.
Смотри, допустим, что у меня формат записи в текстовой файл такой:
Name:Price$ (/n ).
Идея такая: я делаю счётчик проданных книг( получается, что я просто считаю кол-во строк через
[code]iout.getline(str, 1024, '\n'); [/code]
Теперь я хочу сделать счёт по полученным деньгам(они стоят в текстовом файле через ":" после имени). Подскажи, пожалуйста, как запилить такое, чтобы считывалось только ПОСЛЕ ":" и до "$"?
Я понял принцип работы getline, но не могу найти нужную функцию для реализации задуманного.
Если знаешь, подскажи, пожалуйста. (ещё лучше будет, если сможешь подсказать где можно подробней прочитать про работы с файлами ввода/вывода в C++, читал на каком-то русском сайте, но очень мало информации про то, что нужно. Только в общих чертах)
Общий код, чтобы было понятно: http://ideone.com/6VPl4Q (37-39)
Я тебе не подскажу функцию которая прям сделает всё за тебя (гугли функцию поиска подстроки), очень плохо разбираюсь в этих стандартных функциях. Что мешает сделать такую простую штуку вручную, тебе же только какое-то двоеточие найти?
У тебя же есть str на каждой итерации. Вот и добавь там функцию на три строки (перемещаю u, пока не дойду до двоеточия. Потом прыгаю ещё на символ вперёд и считываю число. atoi - из строки извлекает число, то немногое стандартное, что я помню.).
Можно конечно вручную вырезать именно кусок строки до "$", но я думаю цена там в любом случае в числом представлении и atoi будет достаточно.
>Я слабовато понимаю в исходных кодах
Вот пиздец. Ладно, рассказываю.
_glfw.x11.xi.available - это член available класса (или структуры) xi класса x11 класса _glfw. Найти эти классы та можешь либо текстовым поиском в том же репозитории (если только с форматированием кода не намудрили):
_glfw;
это конец объявления или
_glfw =
это инициализация
и так далее с другими классами.
>>1042477
Попробуй, но ты же опять придёшь сюда и будешь никакующие вопросы задавать.
С учётом их скромного объёма и мелкой структурированности - стоит.
struct StructName {
/type/ operator() (/arguments/)
{
//...
return /something/
}
};
Оно бывает шаблоном и constexpr. И у меня вопрос, в чём отличие от простой функции?
Потому что для функций недоступна, например, частичная специализация шаблона, а для класса со статической функцией - доступна.
constexpr дает подсказку компилятору, что значение выражения можно подсчитать во время компиляции. А так как у тебя тут шаблон, то:
>> A constexpr function must satisfy the following requirements:
>> ...
>> there exists at least one set of argument values such that an invocation of the function could be an evaluated subexpression of a core constant expression (for constructors, use in a constant initializer is sufficient) (since C++14). No diagnostic is required for a violation of this bullet.
То есть возможно существование значений параметров шаблона, при которых выражение бы могло быть помечено constexpr. Так так в теле метода не создается нелитеральных типов (например std::string/vector и т.д., но, к примеру std::unique_ptr - это литеральный тип) тогда, предположительно, ничего не мешает таким значениям быть.
std::less используется в качестве шаблонного параметра для std::map или std::set, к примеру, чтобы упорядочивать ключи в деревьях. Более того std::less имеет constexpr конструктор, поэтому создание экземплятора компаратора имеет нулевую сложность (фактически, он не создается, поскольку нет виртуальных методов, наследуемых классов), а вызов operator(), скорее всего, заинлайнится, потому что он представлен оберткой для другого метода.
>> Потому что для функций недоступна, например, частичная специализация шаблона, а для класса со статической функцией - доступна.
operator() не статический и статическим быть не может
функции могут быть частично специализированы, а шаблонные структуры и классы - нет
Как будто это сейчас представляет сколь-либо значимую проблему.
Есть член типа Bitmap. При инициализации необходимо указать его размер, который в момент инициализации становится известен не сразу.
Хотелось бы написать примерно как на первой картинке. Это немного искусственная ситуация, но суть в том, что сначала выполняется какой-то код (чтение размера из файла) и только потом становится известен размер. Но в таком случае оно выдаёт ошибку (мол нужно после двоеточия указать инициализацию как "img(char fname):bmp{size,size}{..}".
Но даже если написать так, оно упадёт с ошибкой, так как до вызова GdiplusStartup() использовать Bitmap нельзя вообще. Как и удалять его в деструкторе после вызова GdiplusShutdown(). Можно как-то явно указать в какой момент в конструкторе вызывает конструктор для bmp и то же самое для деструкторов? (если явно вызвать деструктор bmp.~Bitmap(), то ошибки компиляции нет, но деструктор суммарно вызывается два раза - второй раз автоматически)
Приходит в голову только решение с указателем со второй картинке. Но это как-то неэстетично. Мне не нужен этот указатель и его возможности. Лишняя переменная и лишний раз мучаю менеджер памяти.
>Но даже если написать так, оно упадёт с ошибкой, так как до вызова GdiplusStartup() использовать Bitmap нельзя вообще.
Ну и? Значит надо вызвать эту функцию перед созданием объекта класса img, а функцию GdiplusShutdown() после удаления этого объекта.
>Приходит в голову только решение с указателем со второй картинке. Но это как-то неэстетично. Мне не нужен этот указатель и его возможности. Лишняя переменная и лишний раз мучаю менеджер памяти.
И в каком месте это лишняя переменная?
И вообще, твой код нихуя не правильный. Нехуй вызывать функцию для инициализации чего-либо gdi в твоём случае в конструкторе. Если ты создашь 10 объектов img, ты 10 раз инициализируешь эту библиотеку, что, как мне кажется, не есть верно. Точно также, уничтожив один объект img, ты сломаешь все остальные.
Так что убирай их нахуй из конструктора и деструктора
>Но это как-то неэстетично
Тоже мне, блядь, эстет нашёлся
Скажите, если имеется определение глобальной функции в программе, то область памяти для нее выделяется заранее или когда происходит вызов данной функции, к примеру, из main?
Это не лисп, это компилируемый язык, для любой функции есть:
- место хранения в образе
- место хранения в адресном пространстве программы для статических переменных
- место в стеке
Как ты мог догадаться, из всего этого что-то выделяется в начале выполнения, а что-то - в момент вызова. Догадайся.
>функции могут быть частично специализированы, а шаблонные структуры и классы - нет
Просто иди на хуй.
>Значит надо вызвать эту функцию перед созданием объекта класса img, а функцию GdiplusShutdown() после удаления этого объекта.
Эта функция инициализирует gdi+. До неё любая попытка создать Bitmap (он тоже относится к gdi+) и вообще использовать любую функцию gdi+ на сработает.
>И в каком месте это лишняя переменная?
Заместо непосредственно одного объекта Bitmap на стеке у меня один Bitmap в динамической памяти, один указатель на стеке и ещё лишняя запись про Bitmap в менеджере памяти. Не считая всего того, что порождает Bitmap внутри себя.
>ты сломаешь все остальные.
Написал же, что пример немного искусственный. Оно не так работает, остальные не ломаются на деле. Но да, по хорошему нужно статическую переменную сделать, где будет количество живых Bitmap и так далее.
Ещё костыль придумал. Если сделать дочерний временный класс, где в инициализации я получу размер из файла и запущу библиотеку, то в момент после двоеточия будет уже всё готово. Правда, выключить библиотеку после удаления Bitmap это всё-равно не поможет (но это можно сделать в третьем материнском для этих двух классе, лол).
Хрен с ним, нет альтернативы двоеточию - будут планировать всё так, чтоб и не возникали такие потребности.
Если она не заинлайнена или ещё какой понос - да, на каждый вызов требуется некоторое количество памяти. У функции нет своего места в стеке, у ВЫЗОВА функции есть своё место в стеке.
В самом деле, затупил. Спасибо, что ткнул носом.
Что такое ЧАСТИЧНАЯ специализация? Часть аргумент шаблона определена, а другая - нет?
Честно говоря, я так чувствую себя в плане программирования более увереннее. Вот например знаешь как выглядит схема массива изнутри при определении и я себе это представляю, мне так проще. Также и с функциями для меня
Да.
Или даже все не определены, но у них более специализированная форма. Например, вместо T std::vector<T>
>Ну и протокол я реализовывал по Википедии, да
@ Один долбаёб как смог объяснил на пальцах суть rfc в википедии
@ Домохозяйка из Рязани, исправляя орфографические и стилистические ошибки в статье, дополнительно извернула смысл
@ Третий долбаёб по этой статье реализует протокол
Меня обоссут, но в винапи поиск по шаблону есть вроде как. Если не форточки - не знаю
http://man7.org/linux/man-pages/man3/readdir.3.html
Для *nix ов прокатит, как в шиндус хуй знает. Вообще, можешь воспользоваться boost::filesystem
Оно уже даже в последней студии есть, люль.
Иначе тащи boost::filesystem — то же самое, в другом неймсепейсе.
Небось ещё глянцевый экран, который годится разве что в качестве зеркала.
Без буста и последнего стандарта — портабельно никак от слова совсем.
дзен заключается в том что "сделать портабельно" - это значит захуярить кривой порт на винду с линукса
взять тот же pidgin или qtorrent, парадоксальная ситуация: абсолютное большинство пользователей на винде, но изначально это напердолено под линукс
и так с любым так называемым "кроссплатформенным софтом"
Есть абстрактный класс сущности. От него наследуются другие сущности (например, предмет, какая-то область на карте, противник, сам класс игрока делаю игру и тд).
При старте читается файл карты в котором сущностей для уровня: тип, имя если есть положение на карте и тд.
Например:
type item_health
origin 32 64
Так вот, тип внутри игры представлен строкой, можно ли как-то избежать кода вида
if( str == "item_health" ) { ent = new Item(); } ??
2. Что почитать о системе типов в C++?
3. Чем отличается перегруженный оператор от функции?
>glob.h
Заинклудил в студии и получил ошибку, потому что хедер не найден. Если это не часть библиотеки C++, нахуй надо.
Алсо если не читать просто стринговый тип, а юзать сущности объектов на карте, то в абстрактном классе сущности можно сделать абстрактный метод получения нового инстанса конкретной сущности, который реализуют все наследники. Тогда тоже не придется ебашиться с кучей ифов.
>Тогда тоже не придется ебашиться с кучей ифов
Про рефакторинг и замену условий полиморфизмом слышал?
Долбоеб, я как раз такое и расписал.
>> Как рассматривать все эти записи?
>> Как числа
Очевидно же
>> Есть файлы, в которых записаны десятичные цифры, двоичные, и числа, записанные словами (например, nine).
По идее, если бинарное представления числа имеет какой-то префикс, например 0b, тогда там все очень просто: проверяешь префикс и определяешь метод для парсинга числа, заносишь число либо во временное хранилище либо, к примеру, в мульти-множество или хэш-контейнер.
>По идее, если бинарное представления числа имеет какой-то префикс, например 0b
Не имеет. Три файлы содержат строки типа 0100, 432, twenty.
Пашел нахуй, макакен
Проиграл
>Какой интересный сайт, первый раз такое вижу, 10/10 идея.
У меня для тебя http://www.codeabbey.com/
Буст - это и есть портабельно. Если доступа к ФС нету в языке, ничто тру портабельное с использованием доступа к ФС написано быть не может, расслабь булки.
>>1043590
>в моей версии MinGW не подвезли.
Стандарты переключать не умеешь? Посочувствовать твоему безультернативному использованию допотопной версии GCC?
>>1043756
Все свойства объекта (реально все) определяются через его тип и размазаны по стандарту. Уёбище - это ты. Есть куча других недосказанностей в стандарте, про которые ты не спрашиваешь.
>>1043871
Лол. -> >>1043764
>>1043938
>Как написать обобщенный алгоритм, который отсортирует числа в каждом файле?
Напиши operator>> для того типа, в который это всё будет помещаться, в котором ты будешь делать выбор представления числа в зависимости от того, какие символы ты получаешь. Сортировать строки ты будешь точно так же, как и считывать в числа, так что хранить в строках нахуй не надо.
>>1043958
>Не имеет.
Что значит не имеет? Если тебе дают числа, из которых надо выбрать двоичные просто по наитию, шли таких людей нахуй.
>так что хранить в строках нахуй не надо.
Точнее, хранить в строках нужно только для сохранения исходного написания числа.
Ну его нахуй ваше ООП, оно блять для академиков. Пойду дальше на Сишке предолиться.
Проблема в том, что приходится дружить Google Tests & Mocks с Qt мордой и кое-каким промежуточным слоем. Хочется сделать малой кровью и кое0что вынести для себя.
>Если это не часть библиотеки C++, нахуй надо.
Шапку читал?
> "Как мне сделать Х на чистых крестах без библиотек" идут на хуй
Хачу вкотиться в кресты, есть ли учебник по типу теория - упражнение
гляну, спс
для "тупого устройства на работу" изучать с++ крайне не рекомендуется
>изучаю С++
С++ джуны нахуй никому не нужны. Даже в НИИ батрачить за доширак только по блату возьмут.
с каждым годом количество вакансий сокращается
те это не обвал, но систематическое уменьшение
по крайней мере в россии так
в сша если судить по форумам где русскоязычные кодеры отписываются, такая же ситуация
тут, кажется какая проблема: в крестах нету стандартизированного abi, следствием чего невозможно организовывать динамическую горячую загрузку-выгрузку классов, невозможно без геморроя пробрасывать иключения через динамически подгружаемые библиотеки, крестовые шаблоны отличаются от дженериков в ява и шарпе, но эти же дженерики также позволяют грузить-выгружать классы, как следствие всего этого на крестах не построить сложные энтерпрайз системы, которые по сути и основаны на возможности сделать программу-конструктор из плагинов
(а то что было сделано, было основано на сишном abi, поверх которого зачастую сооружались либо самописные компонентные системы, либо пользовались чем то готовым типа com или gtk, НО ведь это возврат в каменный век, тогда сразу же становится на границе динамически загружаемых модулей отказыватся от всех вкусностей крестов, и возвращатся к си, по сути)
была надежда на веб-сервисы, типа думали что будут писать относительно независимые компонены системы, которые общаются через эти самые протоколы веб-сервисов, тогда уже похуй на чем писать, и тупо думали что кресты зайдут
НО как раз именно что и похуй, и теперь и веб-сервисы тоже предпочитают реализовывать на чем-нибудь более легком, например, на каком-нибудь варианте серверного ява-скрипта, потому что оказалось что производительности достаточно, а важнее скорость запила фич и наличие обезьян готовых это кодить на рынке
крестам пиздец, это они становятся нишевым инструментом, например, неплохо заходят в игрострое, потому что позволяют сочетать нативное быстродействие с возможностями ооп (тк игры по большому счету это моделирование, а опп как раз и подходит для задач моделирования, симуляции чего-то)
[code lang="c++"]
initscr();
//refresh();
Wlog = newwin(LINES / 5, COLS, 4 LINES / 5, 0);
box(Wlog, 0, 0);
wrefresh(Wlog);
[/code]
Глаза протер, а так и не увидел в документации, почему без refresh() до newwin()* не отрисовываются границы. Что я делал не так?
meh, разметка
>потому что позволяют сочетать нативное быстродействие с возможностями ооп
В играх почти без ООП пишут, там сишка с чуть подсахаренная шаблонами:
https://youtu.be/rX0ItVEVjHc?t=1h23m50s
Можешь на указанный ip отправить сообщение и потом посмотреть arp-таблицу, чтение из некоторых файлов позволяет на никсах посмотреть ее https://codereview.stackexchange.com/questions/58097/parsing-arp-cache-in-c . В принципе, можно захватить вывод программы arp.
Тебе нужно создать UDP сокет и послать, просто послать пакет на рандомный порт узла назначения, после этого твоя таблица гарантированно будет иметь MAC адрес назначения (хотя он может уже находиться в кэше ARP'а), потому что такова суть IP, нужно сначала получить MAC и потом только отправлять пакет с указанным адресом и маком в хэдере Ethernet. Здесь тебе и понадобится винсок.
Потом делаешь что-то вроде такого:
https://stackoverflow.com/questions/14147138/capture-output-of-spawned-process-to-string
То есть вызываешь arp и перехватываешь вывод приложения, и затем уже, как тебе нравится (регекспом или посимвольным считыванием) определяешь необходимый тебе MAC для адреса.
На никсах это делается очень быстро, даже если бы мне пришлось получить вывод от ARP, но тут какой-то пиздос.
Возможно, есть какой-то системный сокет, который позволяет общаться с ядром и запросить ARP таблицу без этих изъебств, но тут я не помощник даже.
Кстати, вот ту в пару тычком мышкой нашел https://msdn.microsoft.com/en-us/library/windows/desktop/aa366398(v=vs.85).aspx
Похоже, все делается в один вызов, так что удачи. Винсок не нужен даже.
Архитектура мне ясна. Просто как запросить эту самую ARP-таблицу на винсоке?
Спасибо. Добра тебе
в играх часто требуется реализовывать полиморфное поведение при реализации взаимодействия предметов, персонажей и мира
чтобы ручками vtable не эмулировать по старинке, гораздо проще воспользоватся виртуальными функциями в крестах
Ну так я и начал с просмотра сорцов, но чёт не выдержал. Вот сейчас выяснил, что QEventLoop должен быть запущен в каждом потоке и процесс сигнализации в этом контексте не совсем тривиален.
Проблема в том, что не оч правильно завязывать на конкретную реализацию, как в случае файлами с суффиксом _p.h.
Сейчас не ясна другая деталь. Как вкладываются QEventLoop'ы? Как вложенный цикл сообщений понимает, что он должен обрабатывать событие, а не другой?
>int QEventLoop::exec(ProcessEventsFlags flags = AllEvents)
http://doc.qt.io/qt-5/qeventloop.html
>Как вкладываются QEventLoop'ы?
КутыВиджетс - однопоточная хуйня, пока ты сам ручками на треды не разделишь, всё происходит в одном треде. Когда ты делаешь exec() евентлупа - всё замирает, и выполняется этот эвентлуп.
То есть, например, когда ты блокирующим вызовом открываешь новое окно, и твоя программа ждёт результата этого окна, где-то создаётся эвентлуп, так как иначе всё застывает.
http://doc.qt.io/qt-5/eventsandfilters.html
Такая же жопа в винапи: всё в одном треде, и пока ручками треды не сделаешь, ничто не поменяется.
Но чтобы отслеживать свою скорость мне нужно узнать сколько там еще говна надо разобрать.
Мне нужна программа, чтобы умела считать число C++ классов в файле, число функций в классе. Посоветуйте что-нибудь.
Тогда считай вручную, хули как лох
Как боженька смолвил
>Такая же жопа в винапи
Писал на этом по малолетке. Вообще концепция event loop шире. Сейчас есть в любом довольно универсальном языке от петна до f#. А вот в плюсах нативного нет? Я так понимаю в новых выпусках(стандартах) появится? Корутины ведь тоже на event loop завязаны? Есть какие-нибудь фундаментальные основы, оч заебало читать маны и исходники, чтобы по крупицам собрать общую картину.
> Когда ты делаешь exec() евентлупа - всё замирает, и выполняется этот эвентлуп.
С этим ок. Есть main thread c loop'ом, который создан QCoreApplication, затем тут же я создаю новый QEventLoop. Так вот вопрос: кто будет обрабатывать мои сигналы? Тот же вопрос, но, если я соеденю слот QEventLoop::quit() с каким-нибудь сигналом?
>"тормознее" блядь
Ты думаешь, что виртуальный вызов бесплатный? Что классы по 20 килобайт с нехуевой цепочкой наследований бесплатные? Что дереференс указателя ничего не стоит? За ООП приходится платить.
Сорян, боюсь наврать, а погружаться в это сейчас не хочу. Попробуй книгу найти. Можешь проверить предположение: обрабатывает только те эвенты новый луп, которые заданы флагом, который я упомянул, а остальные дропаются (т.е., никогда не буду накоплены движения мышкой, например).
http://doc.qt.io/qt-5/threads-qobject.html#per-thread-event-loop - попробуй ещё это, я понял чуть больше после прочтения.
Мне кажется, что в игровом мире не так много объектов, чтобы высасывать столько производительности, скорее, это проблема физического контекста, то, действительно, может откусить очень и очень весомый кусок процессорного времени. За ее пределами не будет такого абсолютного выигрыша в производительности.
Мы знаем что си код компилится в машиный код
А можно ли машиный код скомпилить в сишный?
Есть ли приблуды для этово? Если написать что то такое то взлетит?
Конечно взлетит.
>си код компилится в машиный код
ида и подобные ему инструменты умеют и "восстанавливать" машкод в сишный, но делают хуево
реверсеры чаще всего дизассемблированный код анализируют
да щас наверное все компиляторы, не только шланг в промежуточное представление сначала перегоняют код
так что ж он прав
Ага, 12й год уже. C компилится обычно в ассемблер, реже в roc. Если бы он компилился в машинное коды то ты бы имел необходимость на каждой машине перекомпилировать свое поделие заново.
Разве код, написанный на языке ассемблера, не отображается в машинный код 1 к 1?
ты, сука, дебил, правда 12 лет хуячишь кодером и с серьезным лицом тут вещаешь что си в ассемблер компилится?
да иди ты нахуй, лол
Без оптимизаций возможно, но чтобы провернуть все механизмы, которые есть в современных кококомпиляторах нужно строить AST или что-то еще в этом роде.
Насколько я знаю, это так. Сам факт возможности перевести команду ассемблера вручную в двоичный код это символизирует.
Не думаю, что у лексера есть какие-то другие задачи, чем высрать кучку токенов по требованию. Парсер разбирает входные токены и строит семантическое дерево, потому что даже с постоянным захватом токенов еще не вполне понятно, что с ними нужно делать. А с этим деревом хоть ебать, хоть сохранять, хоть завернуть ... все, что угодно можно делать.
Не могу понять что за RTL такой, был бы признателен, если бы ты скинул хоть какую-то инфу.
А ну действительно, вспомнил про препроцессор. Лексер с парсером тоже участвуют, стало быть.
RTL - это регистровый псевдоязык.
https://en.wikipedia.org/wiki/Register_transfer_language
Как он участвует в оптимизации:
https://gcc.gnu.org/onlinedocs/gccint/RTL-passes.html
>>1044454
Послушал я этого Эктона и только отчасти с ним согласен. Естественно, любая программа занимается только трансформацией разного рода данных. Естественно, если мы заранее знаем, с какими типами данных нам придётся работать, и какое железо будет всё это обрабатывать, то городить лишние абстракции нет необходимости. Но штука в том, что на суперкомпьютерах, серверах, рабочих станциях, десктопах, планшетах и смартфонах РАЗНОЕ ЖЕЛЕЗО (в т. ч. внутри класса устройств), которое работает под РАЗНЫМИ ОПЕРАЦИОННЫМИ СИСТЕМАМИ, и далеко не всегда данные можно представить какой-то структурой фиксированного размера или массивом структур. Поэтому многое из того, что этот мужик там говорил про data-oriented design неприменимо даже при разработке только под какую-то одну ОС. Про кросс-платформенную разработку вообще молчу.
Какие-то дебильные куски кода там пытался разбирать с точки зрения работы с кешем. Давайте теперь все сядем и при написании любой тулзы, приложения или движка будем думать о том, что там и как работает с кешем на хуевой туче устройств.
Вообще этот Эктон какой-то балабол зашоренный - сидит со своей консолью, в которой железо годами не меняется, и ничего вокруг не видит и не хочет видеть. Ему там пара чуваков задавали хорошие вопросы:
1. Как они избегают дублирования кода (они не используют шаблоны), который должен одинаково обрабатывать разные типы данных?
Ответил, что, мол, люди изобретают вещи (подразумевая, бесполезные вещи), приводящие к дублированию кода, а потом изобретают вещи, помогающие решать проблему дублирования кода. И вообще, обработка шаблонов в C++ - это просто обработка текста посредственным текстовым обработчиком (не такой уж он и посредственный, т. к. позволяет, всё-таки, надёжно обеспечить type-safety), и что там, где разумно использовать шаблоны, лучше ГЕНЕРИТЬ КОД СПЕЦИАЛЬНОЙ ТУЛЗОЙ, которая с этим справится лучше компилятора.
Ну и кто скажет, что он не дебил после этого.
2. Есть программа, и заранее неизвестно, под каким железом и осью эта программа будет работать. Где тут место для data-oriented design?
Ответил, что предъява о том, что характеристики железа могут быть заранее неизвестны - это всё НИПРАВДА. Что всегда нужно думать о том, под какое железо ты пишешь программу, и что портабельность в общем смысле недостижима и для дураков.
3. Вот написали они движок под железо PS3, а потом бац и его надо переписывать под PS4. И, поскольку железо совершенно разное, то старый движок оказывается почти бесполезным, т. к. у ких там везде используются определённые структуры данных под железо PS3. И не показывает ли это, что весь этот data-oriented design себя не оправдывает?
Ничего конкретного не ответил. Нёс какую-то херню.
Нахер таких дебилов-болтунов, короче.
>>1044454
Послушал я этого Эктона и только отчасти с ним согласен. Естественно, любая программа занимается только трансформацией разного рода данных. Естественно, если мы заранее знаем, с какими типами данных нам придётся работать, и какое железо будет всё это обрабатывать, то городить лишние абстракции нет необходимости. Но штука в том, что на суперкомпьютерах, серверах, рабочих станциях, десктопах, планшетах и смартфонах РАЗНОЕ ЖЕЛЕЗО (в т. ч. внутри класса устройств), которое работает под РАЗНЫМИ ОПЕРАЦИОННЫМИ СИСТЕМАМИ, и далеко не всегда данные можно представить какой-то структурой фиксированного размера или массивом структур. Поэтому многое из того, что этот мужик там говорил про data-oriented design неприменимо даже при разработке только под какую-то одну ОС. Про кросс-платформенную разработку вообще молчу.
Какие-то дебильные куски кода там пытался разбирать с точки зрения работы с кешем. Давайте теперь все сядем и при написании любой тулзы, приложения или движка будем думать о том, что там и как работает с кешем на хуевой туче устройств.
Вообще этот Эктон какой-то балабол зашоренный - сидит со своей консолью, в которой железо годами не меняется, и ничего вокруг не видит и не хочет видеть. Ему там пара чуваков задавали хорошие вопросы:
1. Как они избегают дублирования кода (они не используют шаблоны), который должен одинаково обрабатывать разные типы данных?
Ответил, что, мол, люди изобретают вещи (подразумевая, бесполезные вещи), приводящие к дублированию кода, а потом изобретают вещи, помогающие решать проблему дублирования кода. И вообще, обработка шаблонов в C++ - это просто обработка текста посредственным текстовым обработчиком (не такой уж он и посредственный, т. к. позволяет, всё-таки, надёжно обеспечить type-safety), и что там, где разумно использовать шаблоны, лучше ГЕНЕРИТЬ КОД СПЕЦИАЛЬНОЙ ТУЛЗОЙ, которая с этим справится лучше компилятора.
Ну и кто скажет, что он не дебил после этого.
2. Есть программа, и заранее неизвестно, под каким железом и осью эта программа будет работать. Где тут место для data-oriented design?
Ответил, что предъява о том, что характеристики железа могут быть заранее неизвестны - это всё НИПРАВДА. Что всегда нужно думать о том, под какое железо ты пишешь программу, и что портабельность в общем смысле недостижима и для дураков.
3. Вот написали они движок под железо PS3, а потом бац и его надо переписывать под PS4. И, поскольку железо совершенно разное, то старый движок оказывается почти бесполезным, т. к. у ких там везде используются определённые структуры данных под железо PS3. И не показывает ли это, что весь этот data-oriented design себя не оправдывает?
Ничего конкретного не ответил. Нёс какую-то херню.
Нахер таких дебилов-болтунов, короче.
>> англоязычный форум по крестам
https://translate.google.com/translate?hl=en&sl=ru&tl=en&u=https://2ch.hk/pr/res/1036675.html
>А можно ли машиный код скомпилить в сишный?
Абсолютно точно можно - каждую инструкцию можно портабельно переписать на C. Вопрос лишь в одном - нахуя? Олсо - компиляция - это ещё и линковка, т.е. сборка объектных файлов в один. Зачем делать то же самое с экзешником в обратную сторону? Наверное, ты говоришь о симуляции или трансляции.
>>1044851
Не, это не то, они пытаются оптимизировать и сделать код читаемым. Просто сделать трансляцию в C - запросто.
>>1044865>>1044854
Начнём с того, что компилировать машинный код нельзя по определению компиляции, так что вопрос изначально дебильный. С другой стороны, структура процесса компиляции во время обратной трансляции не имеет вообще никакого значения.
блядь, все компляторы сейчас компилят в промежуточное представление, но на выходе в исполняемом файле будет машкод под конкретную архитектуру
и, да
>12й год уже [кодинга]
>C компилится обычно в ассемблер
просто напиши сколько зарабатываешь, чтобы мне окончательно жопу разорвало
ты пишешь полную чушь, просто пиздец
Такое ощущение что какой то синиор из силиконовой долины вкинул вопрос и сам же толстит на него отвечая.
>байтовый ассемблер
какой нахуй "байтовый ассемблер"
ты троллишь что ли? это такая тонкота что ли?
ассемблеры - это семейство языков программирования, компилируемых в машинный код, такие же яп как и си, и с++, и паскаль семейства, и вообще любая хуйня что может генерировать машкод, вплодь до некоторый реализаций лиспа
Примеры то охуительного компилятора кроме силанга в режиме анализа будут с промежуточным представлением?
Если просто - позволяет ограничивать параметры темплейтов без хаков вида enable_if и SFINAE.
https://stackoverflow.com/questions/15669592/what-are-the-differences-between-concepts-and-template-constraints
и gcc и майкрософтофский компилер тоже используют промежуточное представление
да все используют
фишка llvm была же не в том что они первые сделали это, а в том что предоставили легкодоступное программное api на доступ к ir (intermediate representation)
и наверное мне здесь стоит прекращать просветительские посты, тк судя по постам, сегодня дурной контингент в этом треде
один только специалист с 12ти летним стажем упорно доказывающий что сишка компилится в ассемблер чего стоит
> Если бы он компилился в машинное коды то ты бы имел необходимость на каждой машине перекомпилировать свое поделие заново.
а вот от этого вообще на смех пробивает
Долго еще будешь продолжать троллинг тупостью?
Вот тебе линк для альтернативно одаренных:
http://cs-fundamentals.com/c-programming/how-to-compile-c-program-using-gcc.php
Где ты здесь видишь свое промежуточное представление?
нет, блядь, это ты необразованное уебище
в gcc целое семейство промежуточных представлений, с той же ссаной википедии
the historical Register Transfer Language (RTL)
the tree language GENERIC
the SSA-based GIMPLE.
Standard Portable Intermediate Representation SPIR/SPIR-V
LLVM Intermediate Representation
HSA Intermediate Layer
другое дело что к ним нет общедоступных программных апи, как у шланга поверх llvm
> с той же ссаной википедии
Попробуй почитать что-то сложнее, базарю, заходит. Возможно даже начнешь трансформацию во что-то разумное.
>the historical Register Transfer Language (RTL)
>the tree language GENERIC
>the SSA-based GIMPLE.
Вот эти три хуевины нужны для преобразования препроцессированного кода в ассемблер.
>Standard Portable Intermediate Representation SPIR/SPIR-V
Это низкоуровневое представление для трансляции в GPU/CPU команды которое использует OpenCL/Vulkan и другие подобные стандарты.
>LLVM Intermediate Representation
Ну, я думаю даже такая тупая макака как ты слышала что это.
>HSA
Надстройка над ассемблером для серверных GPU.
Как все это тобою высранное относится к компиляции си, лол? Ты всегда когда обсираешься начинаешь кидать все до чего дотянешься из википедии?
>Ну, я думаю даже такая тупая макака как ты слышала что это.
То есть LLVM не относится к компиляции Си? То есть это не промежуточное представление? Или что вы хотели этим сказать?
У LLVM в процессе компиляции есть еще один дополнительный шаг, которого нет у других компиляторов, если на пальцах.
>препроцессированного кода в ассемблер.
>в ассемблер
просто скажи мне, сучка, что ты троллишь
иначе нельзя быть таким упоротым
КАКОГО ТАМ "ШАГА" НЕТ?
llvm, блядь, это ir с публичным программным api, что и отличает его от предшественников
Нет, его отличает от предшественников четкое деление на бекенд и фронтенд. Посередине есть маняпредставления для перебрасывания кода между языками, но это отдельный разговор. Входы и выходы у всех компиляторов примерно одинаковые.
Давай, еще раз запусти шутейку со своим "промежуточным" представлением. Чую к следующему треду ты и виртуальную си-машину родишь со своим форком джаваскрипта.
Подтягиваемся к стандарту самих плюсов
>Ничего кроме ассемблера твоя кора дуба не может исполнить напрямую.
блядь, ты пробиваешь дно, или все же троллишь?
Ты чо дебил?
Во что может компилироваться си, как не в асм? В какой-то другой язык? Асм же и выполняется на процессоре напрямую, без трансляций
Манюша, я тебе ещё раз повторяю, открой любой бинарник в дизассемблере и прекрати обсирать портки.
машкод и есть асм, ебать ты тупой
каждая асм мнемоническая инструкция равносильна одной машинной команде
Но это уже в железе и зависит от процессора. Принимает он именно классический 86 бинарник.
char array = "1111";
int p = (int*)array;
Позволь чуть добавить: это мнемоническая запись обернутая в метаданные, но так оно и есть.
В инт запихивается ( а точнее пишется ворнинг/еррор) значение указателя (адрес).
"дизассемблер" поэтому и называется дизассемблером что "восстанавливает" с той или иной степенью успешности машкод в тексты ассеблера
я повторюсь, ты троллишь так?
И чем же по твоему являются машинные коды? Или ты у нас убежденный фортранщик?
>с той или иной степенью успешности
Для x86 степень успешности составляет 100% ибо у инструкций ассемблера и опкодов имеется соответствие 1 к 1.
мимоаллигатор
Просто не нужно выучивать язык до корки. Зачем знать о специфических вещах, которые используют разве что всякие MPL программеры. С++ крут своей моделью памяти, а не сахарком.
meta
А ты хорош
>машкод и есть асм
Нет, конечно. Ассемблер - текстовый язык, который транслируется в машинный код. При этом транслятор ассемблера делает еще дохуя работы вроде сборки бинарника, размещения ресурсов, проставления всех адресов для джампов.
>Почему?
Потому что это адресс, по которому лежит твоя строка (или половина байтов адреса, если компилируешь под х64).
>И чем же по твоему являются машинные коды?
Машинные коды - последовательность байт, программа на ассемблере - текстовый файл. Ты эту разницу способен осознать?
>100% ибо у инструкций ассемблера и опкодов имеется соответствие 1 к 1
Ну и какому опкоду соответствует строчка jmp pizdatvoeymamki? Какому из этих девяти http://x86.renejeschke.de/html/file_module_x86_id_147.html, например?
>ибо у инструкций ассемблера и опкодов имеется соответствие 1 к 1.
Про псевдоинструкции слышал? В х86 тоже есть.
Т.е. байтовый ассемблер (с метаданными на регистры) - это уже не ассемблер, это МАГИЯ
инструкция ассемблера это строка
например
>mov eax ebx
ее машинный код, это всего два байта
>0x66 0xA1
И алсо, у множества архитектур, есть валидные недокументированные опкоды, которые ты никогда не выразишь на языке ассемблера, но при этом они вполне себе могут быть исполненны процессором.
Суть ассемблера не в тексте, а в том, что он собирает программу, то есть вместо меток проставляет адреса переходов, вместо имени ресурса ставит его адрес и т.д. То есть если ты пишешь в машкодах и какая-то функция поменяла расположение, то надо пройтись по всему бинарнику, и поменять адрес на новый. Ассемблер делает это автоматически.
Это здорово что у тебя есть половина понимая работы ассемблера. Ну да не суть, оригинальный вопрос был - во что компилируется си, если я правильно понимаю. Вот он как раз компилируется в то, что ты называешь текстовым ассемблером, а затем в зависимости от бекенда или насмом или гасом ассемблируется в "бинарные волшебные строки".
>Вот он как раз компилируется в то, что ты называешь текстовым ассемблером
Правильный ответ - си компилируется в объектные файлы. Никаких текстовых ассемблеров и бинарных строк.
Компилятор си использует для этого сторонний ассемблер. Был DragonEgg который пытался собирать сразу бинарники из сей минуя rtl и ассемблер, но получалась хуита. Иди читай документацию, если не веришь тому что тебе говорят.
>Компилятор си использует для этого сторонний ассемблер
Да какая разница что он использует, и какое у него промежуточное представление? Компилятор принимает на вход текстовый файл и выдает объектный. Результат работы компилятора си - объектный файл. Си компилируется в объектные файлы. Точка.
Мамка набирает конкурентов на борщи?
>Си компилируется в объектные файлы.
Ага, джаваскрипт тоже компилируется в исполняемые файлы, ну браузер же он исполняемый.
- Стабильного ABI
- Нормального синтаксиса
- Нормальной производительности
- Нормальной масштабируемости
- Нормальных тимлидов
- Нормальных компиляторов
Нет.
Чтобы не стать умственным инвалидом на дно-должности мидла а то и джуна.
Чтобы не быть ограниченым одним языком и нихуя не уметь.
Есть несколько подсистем, которые держат какие-то ресурсы, и освобождают их при вызове деструкторов. Обычно при удачном завершении main().
Но где-нибудь в другом месте может случится ошибка, после которой желательно все бросить, и заняться освобождением ресурсов.
Как вот это все
>- Стабильного ABI
>- Нормального синтаксиса
>- Нормальной производительности
>- Нормальной масштабируемости
>- Нормальных тимлидов
>- Нормальных компиляторов
Связано с вот этим вот:
>Чтобы не стать умственным инвалидом на дно-должности мидла а то и джуна.
>Чтобы не быть ограниченым одним языком и нихуя не уметь.
Или ты из инвалидов, которые умеют одну джаву или шарп, и идут выебываться на кресты?
Ну хорошо, мысль твоя ясна, кто твоя мать тоже. Что сам предлагаешь? На чем нативные аппликухи писать?
>C для системщины
Итак.
>игр, графики
Было, не взлетело.
>go для сервисов и нетворкинга
go не может ни в первое ни во второе. Даже его создатели скоро его дропнут, новые проекты все на питоне (который он должен был убить, лол)
На stack overfow говорят что это хреновый подход.
Безосновательный вскукарек. Поясняешь за плюсы своего goвна относительно крестов, и тогда, так и быть, сможешь уйти их треда с обоссаной лишь головой.
Читанул я на досуге, значит, что там принимают... Сетевая библиотека, рейнджи, концепты, параллелизм, и еще какое-то говно, которое возможно добавится в список ебанутых вопросов на собеседованиях. Среди этого всего самое полезное это концепты, а остальное лишь библотэки, которые к тому же УЖЕ ЕСТЬ. Так вот нахуя пихать то, что есть, и никому нахуй не упрется, разве что каким-то хипстерам, которые "STL - One Love". Где моя сериализация, суки?! СТАТИЧЕСКАЯ ебать вас в рот, никто не просит динамическую сериализацию, блять, предложения давно висят, сука, а они только BYTE ORDER высрали!!!!1!111
Вилли, убирай добрый кнут, доставай жестокий кнут!
ПЕРЕКОТ https://2ch.hk/pr/res/1045411.html (М)
ПЕРЕКОТ https://2ch.hk/pr/res/1045411.html (М)
ПЕРЕКОТ https://2ch.hk/pr/res/1045411.html (М)
не увидел там рефлексию, или все же есть
Найс порвался.
Дык, все кроме аби есть.
Вы видите копию треда, сохраненную 8 сентября 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.