Это копия, сохраненная 16 сентября 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы:
- http://en.cppreference.com/w/
- http://www.cplusplus.com/reference/
- http://www.open-std.org/JTC1/SC22/WG21/
Обосрал весь перекат.
Тут тред по C++ или нет?
Нахуя нужны поинтеры и референсы, если можно просто использовать pass by reference?
Поинтер хранит адрес.
Референс хранит адрес.
Поинтер отличается от референса только тем, что его можно инициализировать и переприсваивать.
У переменной, на которую будет ссылаться левый поинтер или референс, уже есть адрес. Нахуя мне нужен ещё один референс, если переменная является референсом на себя же. И нахуя мне нужен поинтер?
Потому что референс должен всегда указывать на валидный кусок данных, что противоречит идее выполнения адресной арифметики с ним. Даже в расте ссылки и указатели - разные типы. Просто указатели считаются небезопасными и их использование ограничено.
поинтер - это объект, а ссылка - нет
открой липпмана или прату и прочтай внимательно про поинтеры и референсы
>Потому что референс должен всегда указывать на валидный кусок данных, что противоречит идее выполнения адресной арифметики с ним.
Почему же противоречит? Скорее наоборот, поинтер может хранить совершенно нерелевантный адрес, что ставит под вопрос целесообразность арифметики над мусорными данными.
Если, конечно, я правильно представляю область примерения поинтерной арифметики. Которая для меня ограничивается, перебором массива данных.
>>30658
>объект
В каком смысле объект?
Насколько я понимаю, поинтер - это тупо 4не обязательнобайта, которые банально хранят адрес.
> Почему же противоречит?
Потому что к указателю ты можешь прибавить произвольное число и получаешь абсолютно валидный указатель, который может указывать куда угодно (даже на несуществующий кусок памяти).
> Которая для меня ограничивается, перебором массива данных.
Для этого указатели (как и арифметика с ними) не нужны совсем. Лично я указательной арифметикой только в embedded пользуюсь и то очень редко.
>Потому что референс должен всегда указывать на валидный кусок данных, что противоречит идее выполнения адресной арифметики с ним.
Адресная арифметика тоже определена только для валидных поинтеров (на элементы массива).
>Потому что к указателю ты можешь прибавить произвольное число и получаешь абсолютно валидный указатель, который может указывать куда угодно (даже на несуществующий кусок памяти).
Написанное в стандарте тебя неприятно удивит.
>В каком смысле объект?
>Насколько я понимаю, поинтер - это тупо 4 (не обязательно) байта, которые банально хранят адрес.
Указатель всегда занимает какое-то место в памяти (зависит от разрядности системы) и там хранит адрес.
Что из себя представляет референс - решает компилятор и стандарт его в этом никак не ограничивает. Поэтому к нему нельзя применять арифметику. Также sizeof(T&) != sizeof(T*), потому что для ссылки отдельные правила.
Чем удивит? Что разыменовыване подобного указателя это UB и компьютер может выебать мою мамку и это не будет противоречить стандарту?
Мне лень читать эту портянку и выискивать все неоднозначности в ней. Всё равно я указатели почти не использую. Если тебе лень или ты сам не в курсе, то ладно. Пусть это останется тайной.
>Мне лень читать эту портянку
Ну тогда сиди тихо под шконкой, не вылазей со всяким
> референс должен всегда указывать на валидный кусок данных
Ладно-ладно, хранитель бессмысленных знаний, успокойся. Ты победишь любого в "своей игре" если тема будет "UB в языка C++".
Вопрос такой: предстоит что-то отвечать по теме Network Programming в C++. До этого читал Страуструпа, начал Коплиена и так, пару курсов прошел. Нигде о нетворке ни полслова. Что мне нужно будет знать и где это можно узнать?
Шапку смотрел, гугл гуглил, нашел только пикрелейтед. Что скажете, хорошая книга, может лучше с чего другого начать?
А в чём ценность этих знаний? У тебя хоть зарплата выше средней?
Ты не пойми меня неправильно, на самом деле у меня действительно баттхёрт из-за того что я не знаю все обстоятельство при которых код на C++ выдаст мне UB. Это так ужасно. На самом деле ведь тебе меня жаль и поэтому ты пытаешься пополнить меня этим знанием, чтобы сделать меня сильнее. Ты как сенсей в этих старых фильмах про боевые искусства.
>Потому что референс должен всегда указывать на валидный кусок данных
Та не, можно висячую ссылку создать и по ней зайти в невалидный кусок данных.
int& f() { int i = 12; return i; }
int& ref = f();
ref += 1;
>А в чём ценность этих знаний? У тебя хоть зарплата выше средней?
>
Он C++ в каком-нибудь вузике преподаёт или в школе учителем информатики трудится. Зарплаты у них сам знаешь... Вот и бесится.
Да, отрицание — это распространённая психзащита в наше время.
> У тебя хоть зарплата выше средней?
Видимо, этот вопрос должен намекать, что твоя-то выше (несмотря на то, что ты не можешь читать стандарт из-за незнания языка), а значит ты прав.
Но само твоё пребывание на сайте анимешников и битардов (даже спец. разделы тут на соответствующем уровне) делает смешными попытки произвести подобное впечатление.
>>30692
>Он C++ в каком-нибудь вузике преподаёт или в школе учителем информатики трудится.
Семён не заметен)
Как раз в вузиках преподают, что к указателям можно прибавлять произвольное число и при этом значение указателя увеличится на sizeof указуемого типа умножить на прибавляемое число (или что-то в этом духе).
Если речь не идёт об оптимизации, то о таких глубинах глубин мне не ведомо.
> Да, отрицание — это распространённая психзащита в наше время.
Прежде чем использовать слова неплохо бы узнать их значение. Или это такая самоирония и ты сделал вид, что отрицаешь мою исповедь о том, что я действительно не знаю всех случаев когда C++ выдаст ub?
> Семён не заметен
А вот это уже паранойя. Осторожно, а то дальше будешь вместо собеседников видеть одних врагов.
>к указателям можно прибавлять произвольное число и при этом значение указателя увеличится на sizeof указуемого типа умножить на прибавляемое число (или что-то в этом духе)
А можно для дремучих, что здесь не так?
Тебе не понять всю глубину C++ если попытаться объяснить это кратко и простыми словами. Иди читай стандарт от корки до корки и пока не прочтёшь не возвращайся.
Если б он с картинками был или сюжет интересный - я б полистал.
А зачем тебе именно по плюсам книжка? С теорией и примерами на С должно быть много хороших книг. Спроси у красноглазиков.
Да вроде всё то же самое. В с++11 потоки добавили, а про сети пока что только разговоры идут - мол вроде и надо, но как-то не до этого.
Сам я не в теме, но вроде на голых плюсах только мазохисты пишут, а остальные используют сторонние либы типа boost.asio.
Ну по сути-то класс наследник агрегирует в себе экземляр суперкласса. Конструктор и деструктор суперкласса вызываются и отрабатывают между началом и концом работы конструкторов и деструкторов производного. Всё так?
Это как-то притянуто за уши.
Никакой отдельный экземпляр суперкласса не создаётся, насколько мне известно, хотя я не плюсоёб.
Да, конструктор суперкласса отрабатывает, но он просто делает свою часть работы с экземпляром данного (производного) класса.
И, обычно, при рассуждениях на тему ООП агрегация или композиция (+ делегирование, если нужно) рассматривается как альтернатива наследованию.
По сути - да. Но в НАСЛЕДОВАНИИ ты забираешь интерфейсы, а в агрегации ты пишешь свой собственный
Ну если скажу, что наследование частный случай агрегации и сделаю эти пару оговорок, плюс там про полиморфизм, то за это не отмудохают?
Ну тут такое.
Если у тебя базовый класс имеет хотя бы один виртуальный метод, то у него не может быть экземпляра. Если он читсто виртуальный, то у него нет ни данных ни реализации методов и его наследование не может быть агрегированием.
libpng, libjpeg - для хождения по внутренностям файлов. CImage маленькая, но предоставляет более высокоуровневое api.
Спасибо. Я как раз об этом не подумал. Короче, очень уж условное наблюдение, не ахти.
Попробуй посмотреть с другой стороны.
Если у тебя класс является агрегацией/композицией нескольких других, то можно же сказать, что он, в результате, наследует их свойства и поведение?
Но, так же никто не говорит.
Во всех этих случаях речь идёт о повторном использовании кода, но, технически это делается по-разному, и терминология это отражает.
OpenCV.
Ну да, только он же может агрегированное добро скрыть за интерфейсом. Хотя может и унаследованный метод перекрыть куда-то в защищенные уровни — и прощай типовый полиморфизм, хотя наследование, да, на месте кагбэ.
Блжад, почему же сложно всё так!
А бывает какая-то условно библия ООП, где это с самых базовых аксиом разжевывается? Что-то похожее мне попадалось в первых главах OOD&A, но там потом стремительно унеслось в дебри. А так чтобы подробная экскурсия по азам, чтобы «детки, вот так наследование не делайте, пнятненько» такое бывает вообще?
Конечно существует. Называется практика. Пара написанных программ под 3 к строк и вопросы про ООП исчезнут. Будешь так сказать на кончиках мыслей чувствовать какой подход правильный в ситуации.
спс, то что надо.
Есть вообще простой вариант: открываешь потоком файл, считываешь заголовок файла, потом заголовок пикчи, а потом в двумерный массив (вектор векторов) читаешь данные пикчи.
И работай, копируй нужный тебе кусок пикчи.
Косяк в том, что .bmp, например, хранится напрямую, а тот же .jpeg - уже не очень, то есть нужно либо курить организацию нужного формата, либо перегонять все в бмп.
отмудохают, потому что они рассматриваются как альтернатива друг другу.
С позиции времени жизни объектов: При наследовании объект базового класса будет создан и разрушен одновременно с объектом наследника. При агрегации агрегируемый объект может быть создан и разрушен вне агрегата, который хранит лишь указатель на него.
Также при наследовании тип объекта определяет его поведение. При агрегировании - нет. Например есть класс A и его наследники B, C. Если мы создаём наследника D от B, то он всегда будет вести себя как B. Если же D агрегат с конструктором D(A*), то он может вести себя как любой наследник A.
> Скажи, что по сетевому-то читать.
В стандартной библиотеке C++ сетей как бы пока нет (обещают сделать к 2023 году). Так что читать надо будет литературу по конкретным библиотекам, например Boost.Asio.
WSL
Можно ли как-то заюзать только dll-ки QtWebEngine-а так, чтобы не тянуть либы других модулей типа qtcore, qtnetwork и тд? они же блять статически сбилженые
Или может кто знает либы для отображения веб контента? Например, так как QtWebEngine основан на хромиуме, можно сделать свой виджет используя Chromium Embedded Framework (CEF). Но помимо овер 20Гб сурсов (это с самим хромиумом), его хуй скомпилишь. Плюс какое-то уебанское API или это я лох
Если потянешь матан, связанный с computer vision, то с крестами проблен не возникнет в принципе.
То, что кресты пиздец сложные - это миф. Они безусловно сложнее, чем динамикопараша, но божественное окружение (ты же не дебил копаться каким-нить code::blocks) и компилятор сильно облегчают задачу.
Для типичного вкатывальщика с сосача даже граблями огород прорыхлить неподьемная задача, т.к. он ленивый и тупой. Вот и пишут, что СЛОЖНА.
Я сегодня установил. Всё сделал по этой инструкции: https://www.youtube.com/watch?v=8Ib7nwc33uA
Заработало как часы. Зависимости никакой, брат жив.
>GCC
>на винду
Ну ёбанарот! У тебя на ПеКа не найдётся 20Гб на няшного пингвина? Покопаешься в консольке, поебёшся с Make'ом, поймёшь как эти самые программы собираются. А IDE это всё от лукавого, они скрывают от тебя процесс рождения программы. Поставь себе какойнибудь ебучий калькулятор. В лине можно преспокойнейше без всяких там ide кодить, среда оче дружественная для погромистов. Только читни для начала справочник по башу и какие виды пакетных манагеров бывают.
У нас в компании есть выделенный человек, который целыми днями занимается обслуживанием нашей билд системы - тонны CMake файлов и всяких скриптов.
Если у тебя дома под столом не сидит такой человек, то программировать под линуксом - боль и унижение.
Есть текстовый файл и в нём записаны пути к директориям
с:\mypath
c:\mypath2
Пробовал через system менять директорию, через chdir, но ничего не срабатывало.
Почему так может быть?
>Посылает нахуй пользователей единственной адекватной ОС
>Сидит в треде языка, чей предок ( Си) был создан, как раз для создания прародителя этой ОС ( Unix ).
Боже какая же ты мудаебина.
Вангую, ты ебаное днище максимум способное осилить формошлепство на JS.
Вот точно причину не назову, но есть предположение, что слэши неправильные - когда парсишь текст, используй класс path из <filesystem> - он сам делает нужные слэши, а потом уже делай system("cd "s.append(объект класса path.string())) - должно будет сработать
> <filesystem>
Почему-то гцц 8.1.0 отказался даже собрать программу с просто подключенным заголовком.
> но есть предположение, что слэши неправильные
Даже просто код system( "cd c:\\" ) тоже не срабатывает.
Ладно, с++ идёт нахуй.
Буду пробовать другими средствами.
Совсем не в ту сторону вангуешь, пердолик. И свой кусок говна для маргиналов с собой забери.
Выгоните этого >>31659 спермоглота уже из нашего треда.
Посоветуйте актуальный (C++11) справочник (не онлайн) по STL.
Он в семнадцатом стандарте только есть такой. В одиннадцатом тоже есть, но там ебля с ним откровенная
А если вручную передавать в качестве пути, тоже не работает? В другую сторону слэш пробовал?
> Он в семнадцатом стандарте только есть такой
Я в курсе.
Но я как-то раз ставил гцц 7 версии и там пример какой-то работал правда std::experimental::filesystem.
> А если вручную передавать в качестве пути, тоже не работает? В другую сторону слэш пробовал?
Уже по всякому пробовал. Вообще никак.
Попробовал даже вот так myprog тут просто вывод пути к директории | xargs cd
Но тоже не сработало.
цепепереференс можно официально выкачать архивом https://en.cppreference.com/w/Cppreference:Archives
>Даже просто код system( "cd c:\\" ) тоже не срабатывает.
В каком смысле "не срабатывает"? `system` порождает шелл и выполняет в нём команду.
На твоей программа изменение директории в другом процессе, естественно, никак не сказывается.
Потому что system ждёт завершения порождённого им подпроцесса, а подпроцесс при pause не завершается.
Как можно не понимать таких банальных вещей?
> Как можно не понимать таких банальных вещей?
Для этого есть ты, для этого есть Интернет чтобы напомнить.
бамп вопросу
Ответил на все вопросы и решил все задачи на 2-х часовом интервью.
Задавайте свои ответы.
c++ пиздос сложный когда работу на нем надо искать тысяч на 100, когда в нии прогать или для себя можно за пару недель освоить.
Позиция вроде на мидла или на сеньора я даже не посмотрел если честно.
Спрашивали много чего, начиная от типовых вопросов по С++, контейнеров, алгоритмов, многопоточности, и т.п. заканчивая задачками на алгоритмы и абстрактное мышление.
Самое забавное, что я нихуя не готовился даже, т.к. приехала тян и мы ебались 3 дня подряд.
Я боюсь, что они тоже могут тут сидеть и спалят меня, если я расскажу задачи.
Ну задачки такие как бы, про байтоебство, про алгоритмы, про сложности алгоритмов, про структуры данных, типа как что и где использовать, давали задачи, которые надо было решить с их помощью. Давали задачи на оптимизацию алгоритмов. Благо я задрот в этой теме и в байтоебстве тоже, не зря байтоебил на си долгое время и ковырял разные алгоритмы.
По плюсам я не так хорош, но походив на пару собесов я выучил всякие каверзные вопросы.
Ну мне повезло на вопросы на самом деле, я хз, но я откуда-то реально в этих вопросах и задачах хорошо шарил.
Помнится как-то устроился в крупную международную компанию на мидла. Прошёл перед этим 4 этапа собеса, растянувшегося где-то на неделю. А в итоге работа оказалась таким говнищщем, что я там и года не проработал. Так что сильно не обольщайся.
>Я боюсь, что они тоже могут тут сидеть и спалят меня, если я расскажу задачи.
NDA подписывал?
Та не, там первую форму допуска оформляют.
Потому что выучил пыху и жс, и сразу можешь что-то делать. А плюсы без предметной области нинужны. Ну сам подумай - сайт ты не сделаешь, парсер не сделаешь, брутфорс не сделаешь.
объясните мне пожалуйста, почему sizeof(Holder) равен 1 байту, а sizeof(DerivedHolder) равен 2 байтам, ведь оба этих класса содержат внутри только один класс?
бля это откуда такое говно? Почему вообще размер класса без методов равен 1? Так указатель на него хранится?
Потому что в крестах наследование (не виртуальное) работает как композиция структур.
Сначала идут данные базовых классов, потом данные наследника.
Например пикрил,
struct A { char c; };
struct B { int x; };
struct C: A, B { ... };
На твоем пике в DerivedHolder один байт занимает пустой базовый класс и один байт поле е.
DoubleDerived занимает один байт, т.к. два пустых базовых класса объединяются, как там и написано.
не ссы, братюнь, давай сразу, сколько примерно з.п. о чем спрашивали, ведь один хуй если знаний в голове не было то и не прибавится хоть здесь все ответы прочитал, какие алгоритмы задрачивал, слушай, скинь мне задачки на ax!!gnomad1488ANUSgmailZ<:PUNCTUMco(2!m, а я тебе свои скину, был на двух собесах, вот охуенно будет, пообщаемся за си++
При этом забавно выглядит каст указателей. Чтобы привести указатель на С к указателю на В его нужно сместить. Все это компилятор делает сам, так что можно не заебываться на этот счет.
С^ с = ...;
A^ a = static_cast<A^>(c);
B^ b = static_cast<B^>(c);
// (int)a != (int)b;
С виртуальным наследованием, конечно, компилятору приходится еще больше дрочить вприсядку, потому что появляются таблицы виртуальных методов, а также смещения указателей иногда неизвестны статически.
т.е. это все для того что если мы создадим указатель на пустой класс, он должен указывать на что-то в памяти, а не хуй знает куда? Четкая книжка или откуда эти сакральные знания?
Типы с нулевым размером вроде как обещали к C++20 сделать.
Чтобы разные объекты имели разные адреса в памяти. Размер же равен 1 байту, потому что байт это минимальный независимо адресуемый набор данных (для большинства систем).
Вроде в стандарте так написано. Хотя я уже точно не помню.
я сам себя могу так ублажить, не канает
Несмотря на то что класс пустой, ты все еще можешь создать его объект. И у этого объекта обязан быть адрес в памяти и чтобы адрес оставался валидным хоть какое-то место в памяти этот объект занимать должен.
> объясните мне пожалуйста, почему sizeof(Holder) равен 1 байту
An object has nonzero size if it
is not a potentially-overlapping subobject, or
is not of class type, or
is of a class type with virtual member functions or virtual base classes, or
has subobjects of nonzero size or bit-fields of nonzero length.
Otherwise, if the object is a base class subobject of a standard-layout class type with no non-static data members, it has zero size.
Otherwise, the circumstances under which the object has zero size are implementation-defined.
http://eel.is/c++draft/basic.memobj#intro.object-8
Применяешь это правило 2 раза. Один раз к мемберу Holder::e, который has nonzero size согласно первому пункту
(определение potentially-overlapping subobject http://eel.is/c++draft/basic.memobj#def:potentially-overlapping_subobject:
A potentially-overlapping subobject is either:
a base class subobject, or
a non-static data member declared with the no_unique_address attribute ([dcl.attr.nouniqueaddr]).
под которое мембер не попадает)
Потом к классу Holder: у него nonzero size по четвёртому пункту.
> sizeof(DerivedHolder) равен 2 байтам
Его base class subobject не должен иметь zero size, т.к. у отнаследовавшегося класса есть non-static data member.
Implementation определила, что у него должен быть nonzero size. И определила его равным единице. Итого, у DerivedHorlder 2 (неперекрывающихся) subobject-а размера 1. Поэтому он должен иметь размер минимум 2.
>> sizeof(DerivedHolder) равен 2 байтам
>Его base class subobject не должен иметь zero size, т.к. у отнаследовавшегося класса есть non-static data member.
>Implementation определила, что у него должен быть nonzero size. И определила его равным единице. Итого, у DerivedHorlder 2 (неперекрывающихся) subobject-а размера 1. Поэтому он должен иметь размер минимум 2.
Тут я наврал, конечно же. Объяснение неверное.
base class subobject имеет размер 0, т.к.
> Otherwise, if the object is a base class subobject of a standard-layout class type with no non-static data members, it has zero size.
Но он не может иметь тот же адрес, что и non-static data member того же типа, т.к.:
Two objects with overlapping lifetimes that are not bit-fields may have the same address if one is nested within the other, or if at least one is a subobject of zero size and they are of different types; otherwise, they have distinct addresses and occupy disjoint bytes of storage.
Итого, хотя base class subobject у DerivedHolder нулевого размера, но т.к. первый дата мембер имеет тот же тип, что и базовый класс, то между base class subobject и мембером есть ненулевой padding. Отсюда размер 2 байта: padding + 1 байт от размера non-static data member.
а что конкретно скрыто за "привести указатель" ?
вот есть указатель и есть его адрес
после
A a = static_cast(A)C
ведь адрес его не измениться, так?
Я так понимаю при вызове метода в метод передается адрес объекта(this) и соответственно доступ к данным организован через смещение от этого this. Как это в памяти выглядит?
>сайт ты не сделаешь
-
>парсер не сделаешь
-
>брутфорс не сделаешь
- Причем на плюсиках ты можешь не только веб, но и железки брутфорсить, каково, а?
Ясно что плюсы не для этого и перечисленные тобой вещи на них не делают. Но это не значит будто сделать их нельзя. Просто учебного материала скажем будет мало, а на пыхе под аналогичные задачи очень много всяких туторов-гайдов.
>ИИ сделаю.
>Еще вопросы?
Вопросов больше нет, так бы сразу и сказал что в AI хочешь. про питон не забудь
Вот этот вроде не совсем дебил.
Ну и нахуй тебе перемножать матрицы на си? Причем матрицы на си ты можешь перемножить и в питоне. Си надо изучить, написать пару десятков лаба.с, запилить какой-нибудь метод Гаусса, сортировки, вектор и дерево. А дальше надо нормальный язык брать.
>Надо написать софт с жёсткими требованиями по производительности и ресурсам. Ок, возьму java/python/c#, потому что это нормальные языки для серьёзных задач.
Всегда с таких даунов проигрываю.
На определенном масштабе развертки софта выгоднее нанять целый отдел крестобогов и все переписать с джавапараши на кресты. Т.к. это будет меньше по затратам, чем затраты на железо.
Блять, а кто тебе мешает выч. методы и алгоритмы на питоне писать? Для этого тебе си нужен?
Я всегда думал его в вузах учат на 1 курсе, чтобы объяснить, что такое ячейка памяти, указатель, стек, куча, зачем мусор собирать и прочее машинозависимое говнецо. Алгоритмы можно на чем угодно изучать.
Это другой вопрос. Парень хочет в ИТ вкатиться через си.
>Блять, а кто тебе мешает выч. методы и алгоритмы на питоне писать?
Святая толстота (или тупость?). Ну возьми ты тот же OpenCV и посмотри для чего там используется c++, java и python. Сразу поймёшь с каким языком место у параши, когда дело касается вычислений.
Боже ебаный ты шизойд.
Я посмотрю на тебя макака тупая, как ты напишешь какую-нибудь real-time хуйню на своей ЖАВЕ или ПИТУХОНЕ, с недетерменированными задержками со всякими их GC и прочей хуитой.
Откуда же такие дауны берутся я хуею.
Из питона и джавы можно вызвать программу на си. Например можно разделить проект на две части - та, которая не треубет производителности будет написана на джаве питоне, а производтиелньная на си крестах
Ну если уж на то пошло, то тогда надо Fortran брать. Он как раз для математиков был спроектирован. Там, кстати, многое заточено под работу с матрицами и векторами.
И нахуя этот гемор нужен? Джава - это язык для других задач.
Если ты какой-то неосилятор, то действительно можешь юзать NumPy и хуячить на питончике, те части, которые не требуют производительности. Так кстати и делают многие.
Ну и что ты уже написал свою либу для выч методов, сука? Я еще раз говорю, для вката си не очень, если ты не из вуза начинаешь в работать.
Да, я писал вычметоды на плюсах в коммерческом проекте. А что касается войтивойти, то тут уж кто на что способен и куда вкатывается. На чём ты будешь вкатываться в те же embedded systems?
Это прокатывает, пока на одной машине помещается. А они знаешь ли не резиновые.
Поставить несколько машин рядом? Ок, добро пожаловать в мир распределенных транзакций. Правда думаешь это легче, чем на C++ переписать?
Пробую поставить этот boost.
Вначале он доёбывал какими-то придирками к аргументу --prefix="C:/Program Files/boost/installed" (Я пробовал писать и с одинарными кавычками и с двойными и с обычным слешем и с обратным и с двойным обратным — результат один ошибка и несколько строк с моим путем, где каждый раз слеши в разную сторону) психанул и без аргументов вызвал этот бутстрап, а потом сразу ./b2 install
Вот теперь то, что на картинке. При чем уже очень давно (пара часов, наверное) и конца и края нет. Я что-то сделал не так?
Внутри MVS при подключении в свойствах проекта автозаполнятор инклюдов видит boost, предлагает напечатать #include <boost/asio.hpp>, но потом не собирается и требует какую-то кучу букв.lib
Пример из бустовского туториала, где предлагают #include <boost/lambda/lambda.hpp>
у меня работал еще до запуска скрипта с установкой и сейчас работает. Из строки собрать не выходит, не видно путей.
Что делать?
Не скомпилируется.
Дописать в свойствах проекта путь бустовским библиотекам. В C:/Program Files/boost/ уточни, где они конкретно лежат. Если буст собран динамически, то еще и в переменную PATH добавить путь к его dll (или ручками скопировать в папочку, куда итоговый исполняемый бинарник твоего проекта выкладывается).
А вообще почитать нужно, как приложение компилируется и линкуется. Именно как происходит запуск cl.exe и link.exe. И с какими параметрами. А то привыкнут в этой вашей винде мышкой тыкать, а как чуть что по другому, так в лужу садятся))
Nginx
> А то привыкнут в этой вашей винде мышкой тыкать, а как чуть что по другому, так в лужу садятся))
Если на винде, то можно всё это сделать (почти) двумя тычками мышки. Буст элементарно ставится через vcpkg и его можно поставить с глобальной видимостью, что значит все его хедеры автоматом станут доступны во всех проектах вижуал студии.
Ты о чем? Я разве предлагал ручками в консольке набирать команды по-пол экрана?
Иметь представление о том, что происходит под капотом один фиг нужно. Хотя бы потому, что мир на VS и Windows не заканчивается.
>>33153
Вариант. Еще и Nuget для этого есть.
Лично я использую Conan с автозапуском из CMake, ибо кросплатформеность нужна.
Я очень проебываюсь по этой теме и вот сейчас хочу наверстать. Собственно, поэтому и буст через консольку запустил ставиться.
Знаю, что обычно пишу в Makefile что-то типа
all:
отступ табуляцииgcc -o test test.c
или для ++g++ -std=c++11 -o plus plus.cpp
А потом могу запускать прямо в MinGW, набрав test или plus соответственно.
С хидерами проблем пока что не возникало, но это были максимум <algorithm> или что-то еще из STL, как он их находит, не знаю. Хочу сделать, чтобы #include <boost/asio.hpp> при таком подходе тоже нормально подтягивалось и не нужно было писать в мейкфайл еще кучу длинных строк с путями к бусту. Это вообще возможно?
И почему он до сих пор мне показывает черный экран с надписями, он реально так долго ставится или пора отменять установку? (Он вообще на винду ставится или нет?)
Заранее прошу прощения, если вопрос мой дурацкий. Читал FAQ и Tutorial заметки от буста и нихрена из них не понял. То, что он выдавал по запросу --показать-библы вообще не содержало пункта asio, да и на сайте там его в списке нет. Если есть какой-то нормальный материал с ответами на мои вопросы, ткните в него носом.
asio header-only библиотека, ее не нужно компилировать (а вот ее зависимости нужно).
https://www.boost.org/doc/libs/1_67_0/doc/html/boost_asio/using.html
>Он вообще на винду ставится или нет?
Ставиться, ставиться. Разве что под WinXP не все части собираются.
>он реально так долго ставится
У него дофига заголовочных файлов. Если винт тормозной, то не удивительно.
Спасибо, собралось VCPKG. Оно советует буквально следующее
>simply need to add it onto your CMake command line as -DCMAKE_TOOLCHAIN_FILE=[vcpkg root]\scripts\buildsystems\vcpkg.cmake
А куда это — не понимаю. У меня в папке с CMake файлов нет, в подпапке bin есть Cmake.exe, Cmake-gui.exe, cpack.exe, ctest.exe и cmcdelps.exe
Все кроме гуя запускаются на долю секунды. В гуе копировать эту строку особо некуда. (В configure попробовал, заругало)
Что это он хочет?
>>33289
Таки-да, 10246 какой-то херни установило, когда Я Ctrl+C нажал, 102 не успело установить. Брюс Уиллис, ёба. Пофиг, удалил.
Теперь тебе нужно разбираться с cmake хе-хе. Если ты работаешь в vs погугли как создавать cmake-проекты в вижуал студии.
О, господи, нахера?
Я зазубрил 1.5 команды написания CMakefile как раз чтобы ни с чем не разбираться да, зря, видимо, получается, vcpkg мне что-то там на тему симейка предлагает только на случай, если мне захочется в симейке делать, на остальные случаи это не повлияет?
А зачем мне вообще может понадобиться симейк в MVS? Я понимаю, вместо MVS: написал себе эти все CMakeLists.txt, запустил cmake -H. -Bbuild потом им же построил типа как cmake --build build и сидишь довольный, а в среде он нахрен сдался, если среда сама всё построит?
Если твой проект на симейке - сделай то, что дядя сказал.
Если твой проект - студийный солюшен, то все автоматом подсосется. Ты же сделал vcpkg integrate, как на гитхабе написано, да?
>А зачем мне вообще может понадобиться симейк в MVS?
Ну типа писать портируемый проект в mvs со всеми удобствами ide. Под невиндой ты его открываешь в каком-нибудь QtCreator и также уютненько продолжаешь писать.
Конечно сделал, сейчас результаты такие же, как в самом начале: autocomplete видит boost/asio.hpp, но собираться проект с ним не хочет. Если поменять на какой-то boost/regex.hpp как в примере Getting Started, то всё нормально собирается. В чём дело?
Из командной строки тоже не видит, может чего дописать надо или еще доинсталлировать?
Пересоздал новый проект, та же херня.
1> ... error MSB3030: не удалось скопировать файл ...\boost_system-vc141-mt-gd-x32-1_67.dll - файл не найден.
1>Сборка проекта "Boost — still does not work.vcxproj" завершена с ошибкой.
boost_system-vc141-mt-gd-x32-1_67.dll
Какого хера он ее в упор не видит?
Не знаю, что ты делаешь, но проверь разрядность и debug/release, а также попробуй прописать путь к используемой dll через настройки проекта. Может она тянет за собой соседей и её просто так нельзя копировать.
Ещё vcpkg по-умолчанию компилирует 32-битные библиотеки, может он пытается использовать их с 64-битным приложением?
Спасибо за идею, проверил. Подобавлял везде папку с vcpkg (корень ведь, правильно?). Но не помогло ни хрена.
Вручную покопировал это boost_system-vc141-mt-gd-x32-1_67.dll во все внутренние папки решения, похуй, не видит в упор.
В файлы ресурсов в солюшнэкспройлере добавил уже зачем-то, один и тот же результат.
Я сдаюсь. В пдзу пргармирвоне
Лучше перекатывайся в C#. Там в .NET-мирке нет подобной ёбли со сборкой проекта в отличии от плюсов.
Пути к dll сразу для всех студийных проектов указываются в project->properties->vc++ directories->Library Directories. Для отдельных проектов Linker/Librarian->general->additioanl library directories.
Cам путь можно вбить туда абсолютный (ну типа c:\vcpkg\ или где там dll лежит). Если заработает, то потом запилишь константы и через $() переделаешь.
Это да. И цепляние сторонних либ через InteropServices там комфортное.
Да ладно тебе, ты ж только начал. Впереди не менее увлекательные задачи портирования и развёртки твоей laba2.cxx.
Кстати, в крупных конторах обычно есть макаки-инструментальщики, которые отдельно и целенаправленно ебутся со сборкой, портированием и развёрткой проектов. Ибо даже бывалые красноглазики не в состоянии с этим справиться.
ох бля, писал программу две недели и еще две недели писал под нее инсталлятор, проверяя ее на различном оборудовании, пиздец, из ldd просто не вылезал, весь по уши в bash и pituhon, ебля нон стопом, рили хард!
Спасибо.
Спасибо
Ну не скажи, для простого вебговна скорости хватает, для парсеров/брутфорсов тоже. А больше на питоне ничего и не пишут
Если ты знаешь стл буст алгоритмы потоки и tcp то можно идти юниором за нихуя.
>Ребят, где практики набраться , типо как стажером, но даже не за еду, ради скиллов и информации только бы. Сам студент.
>
всякие крупные компании предлагают позиции именно стажёров на неполную занятость. либо они организуют различные курсы для студентов на лето.
Блять, торопился, соре. как мне в методе класса сделать вывод имени инстанса класса?
class Ass {
public:
std::string name;
void println_name() { std::cout << name << '\n'; };
int main()
{
Ass ass { "ass" };
ass1.println_name();
}
Проебаал скобку после определения класса...
А без задания имени в конструкторе? С простой переменной можно это через макросы сделать,
#define GET_VARIABLE_NAME(Variable) (#Variable)
но как с указателем this я не знаю.
Лол, а что ты хотел? Чтоб компилятор каждому инстансу класса придумывал своё имя?
И фамилию (от базовых классов), и историю с неожиданной развязкой: Светила полная луна, итератор инвалидировался после реаллокации контейнера...
Используй cout << this, указатель у каждого уникальный
Всё проверил, везде абсолютный путь на папку vcpkg.
Проблема в другом: когда нажимаю собрать проект, в папочку с Debug подтягивается boost_system-vc141-mt-gd-x32-1_67.dll, но сам линковщик при этом ничего не собирает и кричит, что boost_system-vc141-mt-gd-x32-1_67.dll в этой самой папке не найден.
В чем проблема? в MVS? в VCPKG? в Boost? в прокладке между табуреткой и компом?
найти медиану из 3х чисел, которые могут идти в любом порядке и повторяться.
аля :
int median(int a, int b, int c)
{
// ...
}
Я короче сначала сделал, через тупой перебор всех возможных комбинаций типа
#define med(a,b,c) if(a <= b && b <= c) return b;
med(a,b,c)
med(c,b,a)
med(b,c,a)
med(a,c,b)
...
Он попросил оптимизировать, я написал половину а дальше затупил.
Короче сидел наверное час решал эту хуйню, он даже добавил дополнительное время мне, но полностью не решил.
Еще был вопрос каково будет время вставки N элементов в вектор через push_back
Я ответил n log(n), т.к n элементов и т.к. вектор увеличивается в 2 раза если не хватает места, то получается вроде log n, так что общая сложность n log n. Но я не уверен.
На задаче проебался, зато в треде трипл выбил.
По медиане я только что такую хуйню придумал, лень гуглить нормальное решение:
int median(int a, int b, int c)
{
return (a + b + c) - min(a, min(b, c)) - max(a, max(a, b));
}
Вставка в конец вектора в среднем О(1). Хотя размер реаллокаций растет экспоненциально, они происходят во столько же раз реже.
я так и не понял, что такое медиана. Но про вектор худшее время вставки это N, т.к. в зависимости от выбранного аллокатора - реаллокация может идти каждый раз. О - худшее время
я считаю вот так
> if (!body.size() % packet_length ) {
>packets_num = body.size()/packet_size;
>}
>else {
> packets_num = body.size()/packet_size + 1;
>}
Бля, в общем мне надо одно число на другое поделить и если результат не ноль округлить его до большего.
т.е. если пакет 3 байта, а массив 20, делим 20/3 и получаем 7 пакетов
есть мода - самое частое значение и медиана, такая хуета которая делит выборку пополам (но вообще я уже все забыл на хуй
int median(int a, int b, int c)
{
if (a < b) swap(a, b);
if (b < c) swap(b, c);
if (a < b) swap(a, b);
return b;
}
отсорировать значения и взять второе
как-то так:
int& refs[3] = {a,b,c};
if(ref[0]>ref[1]) swap(ref[0], ref[1]);
if(ref[0]>ref[2]) swap(ref[0], ref[2]);
return (ref[1]<ref[2]) ? ref[1] : ref[2];
С помощью достаточно мудацкого аллокатора можно и O(N) получить и мамку твою выебать, кто ж спорит.
Вопрос-то наверно был не про параллельные вселенные, а про стандартный вектор. На cppreference для push_back написано amortized constant.
чет как-то непонятно
размер пакета 5 байт
размер массива 10 байт
((int)10 / 5 ) + 1) * 5
мы вам перезвоним...
Ну тогды просто массив интов.
Просто ты не смог в настройку хрома.
Settings->Languages
Order languages based on your preference -> English
bool isPow2(int v) { / code / };
https://ideone.com/gDWSDK
Вместо ctz(v) можно написать (31 - clz(v))
Алсо, для msvc надо будет использовать другие интрисики.
Хотя хуй его знает насколько это оптимально. Возможно сейчас байтоёбы придумают что-нибудь попирформансней.
Как-бы у меня фирефокс, и как бы всё настроено. Просто сам гугл выдаёт результат уже с ru.
>inb4 почему гугл, а не DuckDuckGo
Не знаю
Отрицательные степенью двойки быть не могут, так что можно заменить v!=0 на v>0. А без ынтрынсыков решение выглядит так:
bool isPow2(int v) {
return v > 0 && (v & (v - 1)) == 0;
}
Используй DuckDuckGo.
У меня округление с шагом в большую сторону, если рамерности вот уже хватет впритык все равно делается +1 шаг. Чтоб пофиксить въеби проверку размера буфера под размер пакетов.
Люблю задачки.
Медиана:
std::vector<int> v{a,b,c}; std::stable_sort(v.begin(), v.end()); return v[1]; // это добро работает O(nlogn) по сортировке (stable для предсказуемого худшего случая)
Время вставки: амортизированная сложность бэкинсертера O(1), в худшем случае O(n), от тебя скорее всего ждали ответ O(n), т. е. сложность вставки кол-во элементов, ясен фалос берем амортизированную. Про мультипликативную реаллокацию ты был прав, хотя оптимально и не ровно вдвое, но это очень близко и на практическом уровне точнее значение не нужно.
(Положим, пи равно трём. Инженерная поговорка)
Почему переполнение? Разве внутри выражения в скобках эта байда не приведется к unsigned --> unsigned long --> long long --> unsigned long long по неявному приведению?
>Почему переполнение?
Потому что оно может быть при определённых значениях параметров.
> Разве внутри выражения в скобках эта байда не приведется к unsigned --> unsigned long --> long long --> unsigned long long по неявному приведению?
С чего оно будет приводиться так?
Ну чо ты STL'ем то по воробьям. Срамота то какая.
А зачем тебе для плюсов книга, предназначенная для обучения сям?
До сих пор в ахуе, и что самое хреновое свой тред репортнуть нельзя
обоснуй за округление в большую сторону? Кроме того вообще формула неверное, так-то получается по твоему алгоритму 15. Я вот такую хуету накодил пока
[code]
auto res = std::div(mBody.size(), PACKET_SIZE);
int packets_number = res.rem ? res.quot + 1 : res.quot;
[/code]
что бы мудаки-говноеды за его размер не вышли, в векторе есть проверка за выход за индекс, а в массиве нет. Смысл программирования - не задумываться, что бы не тратить время на такую хуйню, человек должен везде вектор на автомате использовать, за исключением байтоебщины и прочего казуала. Чем меньше мозг хуйней нагружаешь тем лучше.
(((( бля где-то прям здесь статью видел про это дело
>что бы мудаки-говноеды за его размер не вышли, в векторе есть проверка за выход за индекс, а в массиве нет.
??????
А это что https://en.cppreference.com/w/cpp/container/array/at ?
>Смысл программирования - не задумываться, что бы не тратить время на такую хуйню, человек должен везде вектор на автомате использовать, за исключением байтоебщины и прочего казуала. Чем меньше мозг хуйней нагружаешь тем лучше.
Многие узнавшие понятие "преждевременная оптимизация" не знают/забывают, что есть понятие "преждевременная пессимизация".
Динамическое распределение памяти вектором это преждевременная пессимизация.
Кстати, ты узнавал, можно ли функции median кидать исключения? Вектор может кидать исключения. Так что ты, как ананас с UB >>33679 , нарушаешь контракты своим решением с вектором.
я наверное другой анон, ну я свое мнение высказал т.к. тут критерии не указаны, то оно тоже верно, если в контексте задачи, собеседующий может порадоваться.
>тут критерии не указаны
Указаны критерии (требования) "найти медиану".
Вылетевший bad_alloc — это не найденная медиана.
Это сложно понять?
>Что надо знать про сокеты и всё такое?
Какие именно сокеты?
TCP/IP сокеты?
Unix Domain сокеты?
Сокеты беркли?
Сокеты Добрый и сокеты Я. Собес на программиста Агушу.
Да-да, вот про это всё говно. Что об этом нужно знать приличному программеру и где можно прочесть джентльменский минимум в максимально сжатом виде? Я хочу самую общую картину схватить, совсем незнаком с вопросом.
Ричард Стивенс, "TCP/IP в подлиннике".
вот тебя и пидорнули, т.к. ты даже тут понять не можешь, что найти медиану означает написать программу где ты уже все исключительные ситуации предусмотрел
Да решением с мин макс функциями не плохое, но я нашел получше решение через сортировочные сети, странно, что я не додумался об этом на собесе, но тот долбоеб меня сбил с толку, я сразу сказал типа отсортировать и выбрать 2-е, он начал типа без сортировки и т.п, хотя по сути это в любом случае сортировка.
У меня вышло так:
void cmp_swap(int& a, int& b)
{
if(a > b) {
int t = a;
a = b;
b = t;
}
}
int median(int& a, int& b, int& c)
{
cmp_swap(a,b);
cmp_swap(a,c);
cmp_swap(b,c);
return b;
}
>Хотя размер реаллокаций растет экспоненциально, они происходят во столько же раз реже.
Ну да по идее получается log2(n) реалокейтов, поэтмоу общая сложность n log n.
>>33900
Бля, из всех предложенных тут вариантов, твой самый ущербный. Ты представляешь на сколько это будет медленно работать?
>>33666 - анон
Да решением с мин макс функциями не плохое, но я нашел получше решение через сортировочные сети, странно, что я не додумался об этом на собесе, но тот долбоеб меня сбил с толку, я сразу сказал типа отсортировать и выбрать 2-е, он начал типа без сортировки и т.п, хотя по сути это в любом случае сортировка.
У меня вышло так:
void cmp_swap(int& a, int& b)
{
if(a > b) {
int t = a;
a = b;
b = t;
}
}
int median(int& a, int& b, int& c)
{
cmp_swap(a,b);
cmp_swap(a,c);
cmp_swap(b,c);
return b;
}
>Хотя размер реаллокаций растет экспоненциально, они происходят во столько же раз реже.
Ну да по идее получается log2(n) реалокейтов, поэтмоу общая сложность n log n.
>>33900
Бля, из всех предложенных тут вариантов, твой самый ущербный. Ты представляешь на сколько это будет медленно работать?
>>33666 - анон
Так а это что, не веб?
>>34202
Я могу лучше: то же самое, только с forward_list и еще в шаблон обернуть, добавить там проверок всяких на is_integral, проверить отдельно лидирующий ноль, можно еще шизонуться и написать многоэтажный свич или иф, можно стать воздушным асом, можно Можно стать воздушной планетой. И будешь уверен, что эту планету примут по учебнику. Значит, на пользу физики пойдет одна планета. Величина — оторванная в область медианы — дает свои колебания на всю медиану.
>Так твое возвращает значение, а мое меняет.
Третий свап не нужен. Первые два записывают в a минимальный элемент. Значит медиана это минимум из b и c.
Кстати, передавая всё по ссылке, ты портишь входные данные.
Вот вам ответ:
return std::max(std::min(a,b), std::min(a,b))
При желании max и min поменять местами.
Вообще же задача простая, кто хочет посложнее — возвращайте не медиану, а моду
Ты дебил? Вообще понял кому и на что отвечаешь?
>на 4 аргументах
На 4 аргумента обычно дают задачку о пересекающихся интервалах (найти общую часть).
Любой сборник задач по олимпиадной математике для школьников.
leetcode.com
https://career.ru/vacancy/25924198
>Опыт объектно-ориентированного программирования
А придешь, окажется, что надо иметь опыт минимум 10 коммерческих проектов, гитхаб с >1000 фоловеров, написать по памяти реализацию вектора а стл, иметь мягкий анус и глубокую глотку.
Что точно надо иметь в портфолио?
Так там же на 1С придётся "программировать".
Что касается опыта для стажёра - обычно достаточно рассказать про курсовую или лабу в которой ты использовал ооп. Потом тебя поспрашивают про основы языка и дадут задачку на смекалку. Всякую еботень типа написания своего sqrt или потокобезопасного контейнера с тебя не спросят.
В общем, да, но (b < c) ? b : c; это один хуй операция сравнения, единственное, что на 1 копирование меньше.
Ну так и требуется.
А вижу, в трех случаях пососал.
Ясен хуй он сделает ее inline она в 1 строчку. Более того, он скорее всего даже заоптимизирует и уберет лишнее копирование.
Нет конечно, я исправил.
Вот, я даже написал тест кейс для этой задачи.
int median(int a, int b, int c)
{
return std::max(std::min(a, b), std::min(b, c));
}
void test_median(std::function<int(int, int, int)>&& f)
{
std::array<int, 3> p1 = {1, 1, 1};
std::array<int, 3> p2 = {1, 1, 2};
std::array<int, 3> p3 = {1, 2, 3};
std::array<std::array<int, 3>, 3> w = { p1, p2, p3 };
for(int i = 0; i < 3; i++)
do
{
int a = w[0];
int b = w[1];
int c = w[2];
std::cout << "[" << a << " " << b << " " << c << "]";
int m = f(a, b, c);
if(m == 2)
std::cout << " median = " << m << std::endl;
else
std::cout << " median = " << m << " WRONG!" << std::endl;
} while(std::next_permutation(w.begin(), w.end()));
}
int main()
{
test_median(&median);
}
Вот вывод:
[1 1 1] median = 1 WRONG!
[1 1 2] median = 1 WRONG!
[1 2 1] median = 1 WRONG!
[2 1 1] median = 1 WRONG!
[1 2 3] median = 2
[1 3 2] median = 2
[2 1 3] median = 1 WRONG!
[2 3 1] median = 2
[3 1 2] median = 1 WRONG!
[3 2 1] median = 2
Нет конечно, я исправил.
Вот, я даже написал тест кейс для этой задачи.
int median(int a, int b, int c)
{
return std::max(std::min(a, b), std::min(b, c));
}
void test_median(std::function<int(int, int, int)>&& f)
{
std::array<int, 3> p1 = {1, 1, 1};
std::array<int, 3> p2 = {1, 1, 2};
std::array<int, 3> p3 = {1, 2, 3};
std::array<std::array<int, 3>, 3> w = { p1, p2, p3 };
for(int i = 0; i < 3; i++)
do
{
int a = w[0];
int b = w[1];
int c = w[2];
std::cout << "[" << a << " " << b << " " << c << "]";
int m = f(a, b, c);
if(m == 2)
std::cout << " median = " << m << std::endl;
else
std::cout << " median = " << m << " WRONG!" << std::endl;
} while(std::next_permutation(w.begin(), w.end()));
}
int main()
{
test_median(&median);
}
Вот вывод:
[1 1 1] median = 1 WRONG!
[1 1 2] median = 1 WRONG!
[1 2 1] median = 1 WRONG!
[2 1 1] median = 1 WRONG!
[1 2 3] median = 2
[1 3 2] median = 2
[2 1 3] median = 1 WRONG!
[2 3 1] median = 2
[3 1 2] median = 1 WRONG!
[3 2 1] median = 2
Кстати еще, на выходах типа 1 1 2, функция должна возвращать 2, а не 1.
>[1 1 1] median = 1 WRONG!
У тебя в проверке ошибка. Проверяет на 2 и пишет WRONG когда 1!=2 (почему не 3, не 265, не 1812, например?)
Нет, все равно не работает. Самое лучшее решение(оно не работает при 1 1 2 и других подобных сочетаниях )это
if(a < b)
swap(a,b);
return std::min(a, std::max(b,c));
>откуда прога знает определения используемых функций
Стандартные библиотеки по умолчанию линкуются. Можешь отключить флагами как libstdc++, так и libc.
>Эта книга предназначена для тех. кто еще никогда не программировал
первая страница книги Страуструпа, а уже разочарование
Двач, если я знаю си и питон, то какую книгу мне читать ? В шапке такого нет вроде практизы читать нет смысла, так как ц++ довольно сильно отличается от питона и си, но читать что такое переменная мне не оч хочется
Я знаю, что ошибка, просто лень было допиливать.
Проверяет на 2, т.к. из из набора 1 2 и 1 2 3, должна быть 2ка на выходе. надо пофиксить, чтоб из набора 1 была единица.
Как ни странно, TCPL
Мимо-джун.
Хочу запилить десктопный клиент для вконтактика на Qt, чисто на поиграться.
Как думаете, взлетит?
Уже есть vk messeger
делай что угодно, главное делай
1. Understanding and Using C Pointers: Core techniques for memory management
2. http://alumni.cs.ucr.edu/~pdiloren/C++_Pointers/
Может лучше личностные тренинги на тему "Как не обосраться от волнения"?
Не понимаю, чому не работает первый тест не находит "pen" и по 2 раза находит строки?
https://ideone.com/t0ynyV
Прочитал первое, вроде все знаю.
Бывает что там и дохуя слешей.
Скармливаю этот путь WinExec. Он ничего не делает. Методом проб и ошибок я установил, что проблема в том, что надо удвоить слэши.
Собственно сабж, как сделать это более мудро?
Почему не очень?
Кстати там ошибка, я по привычки юниксовые слеши написал, а тебе надо другие, тогда будет так: s/\\/\\\\/g
Окей. Скажем так, у меня VS2010 . регялрочки как ты знаешь подвезти успели в с++11
Ставь буст, ёпта.
Тогда
echo "C:\\path\\prog.exe" | sed -e "s/\\\/\\\\\\\/g"
или
echo "C:\\path\\prog.exe" | perl -pe "s/\\\/\\\\\\\/g"
Друг, я искренне сомневаюсь, что проблема в этом.
Может ты путаешь экранирование слэшей с чем-то другим? Или строку изначально неправильно задаешь?
Смотри. Я подаю tchar который я получил из GetModuleFileNameW, обрезал до слэша и добавив нужный мне .exe, скармливаю строку WinExec с (LPCSTR)(path), SW_SHOW ничего не происходит. Кормлю строкой с одинарными слэшами - пусто, даю с двойными - все норм. Хотя возможно проблема с приведением типа.
Подскажите в чем проблема.
Накатил Qt Creator. Поставил Qt, к нему Qt Web Engine, Qt стоит версии 5.9.2.
Для Web Engine нужен компилер MSVS 2017, оке. Поставил. Сажусь ваять свои нетленочки - и вот какую хуйню выдаеи компилятор в ошибках.
Собственно, как починить эти ебучие кракозябры?
Извечная проблемма. Компилер выдаёт текст в 866 кодировке по умолчанию в консоли стоит, а креатор воспринимает ее как 1251. Попробуй в китах поставить галку для вывода в utf-8.
Посмотрел где эта галка находится. А у меня ее там нет. Лол
If I were new to C++, I would not start learning C++ with this book. Rather, I would use these below three steps and the relevant books in this order:
1. Accelerated C++ by Andrew Koenig & Barbara Moo -- Read and practice example code and exercises from this book first.
2. Programming: Principles and Practice Using C++ (2nd Edition) by Bjarne Stroustrup -- Chapters 5,6, and 7 are gems in this book. You can in fact use this book in parallel with the Accelerated C++ book and
3. (a) The C++ Programming Language (4th Edition) by Bjarne Stroustrup, -- Definite reference book to have.
3. (b) The C++ Standard Library: A Tutorial and Reference (2nd Edition) by Nicolai M. Josuttis, -- Clear examples and very methodical
3. (c) C++ Templates: The Complete Guide by David Vandevoorde -- What can I say! This is simply a classic.
добавите же в шапку? :3
Анон помоги
http://doc.qt.io/qtcreator/creator-targets.html
тут у этих пидоров есть галка
у меня этой галки нет
как же заебало блять
хочешь сесть уютно покодить, а занимаешься какой-то хуйней
Прям такие дохуя умники сидят, лол, растопырив пальцы перед джунчиком. Хотя, вроде и ясно говоришь, что я вроде как только вкатываюсь. Но нет, блядь. Хуесос технический специалист прям устраивает с тобой ДУЭЛЬ блядь интеллектуальную. А если на чем-то подловит, то пизда, УХ БЛЯ, там ТРИУМФ, ваши знания СИ ПЛЮС ПЛЮС В ОБЩЕМ-ТО НИКАКИЕ.
Какие уебки, блядь.
Пошел на хуй
А чё ты ожидал? Схуяли кто-то должен знать ответ на твой вопрос и расписывать решение? Гораздо очевиднее что отвечать будут на то, что лучше понимают и что знает множество людей.
Потому что это блять С++ тред, в котором по идее должны сидеть умные люди с образованием и пониманием CS, а не горстка выблядков "ВОЙТИВАЙТИ", засирающих тред своими тупорылыми вопросами, на которые сука в гугле находятся ответы за 2 секунды.
Пиздец. Они еще ахуеваеют, что их хуесосят на собесах. Да вы же блять настолько тупорылые дауны, что вас не то что в джуны, вас блять даже в обслуживание кофе машины не возьмут.
Иди нахуй от сюда в /b/ и создавайте там треды как вкатиться в айти.
Вот этот >>35666 даун меня вообще выстегивает, сука ну почему ты настолько имбецил, что тебе блять в падлу загуглить вопрос, я даже не говорю о том, чтоб ты почитал книжку и нашел там ответ, т.к. заранее знаю, с твоим уровнем развития ты там большую часть слов не поймешь и не пройдешь дальше предисловия, но сука загуглить то можно, уебище? И так без тебя этот вопрос тут постоянно задают бесчисленные орды макак вкатывальщиков, которые думают щас они хело ворд из инета скапипастят и сразу пойдут устроятся Сеньором в яндекс на ЗП 400к в сек.
Просто блять эпик дауны.
Ну ладно, ладно. Вот решение на коленке.
const std::string sample("\\"), value("\\\\");
size_t pos = 0;
while ((pos = str.find(sample, pos)) != std::string::npos)
{
str.replace(pos, sample.length(), value);
pos += value.length() + 1;
}
>даунов
Один ты у мамы умный.
А знаешь что. Иди-ка ты на хуй отсюда. Со своими алгоритмами. В очко их себе загони петущара :3
>засирающих тред своими тупорылыми вопросами, на которые сука в гугле находятся ответы за 2 секунды.
Петушок, порешай мне за две секунды что делать с этой кодировкой ебучей в креаторе.
Спасибо.
Ты тут настолько воду замутил, что я не туда ответ влепил. Тебе, гондон, следует пройти нахуй, потому что ты предлагаешь дебажить твой сраный говнокод, да ещё в залупу лезешь.
:)
Бля, ну не знаю, может кретор древний. И зачем юзать GDB если есть нативный виндовый дебагер?
Я уже дохуя где посмотрел, прежде чем написать тут.
Я же не еблан, спрашивающий каждый пук на форумах.
Начни с мнемонического названия переменных (v,c,t,i,k,u - вот это вот всё говно что у тебя там), затем перейди к инициализации агрегатов (строки 39-46), потом почитай про чистый код (таб = 4 символа, мусор 136-144 нахуй). Тогда можно будет прочитать, где ты обосрался с реализацией алгоритма.
чёт вообще срал и ебал этот виндоуз, ещё раз этот чувак подойдёт, чтоб я его прого доделал, то я ему щи переломаю.
https://pastebin.com/pS09B68q
Вот куски кода, что отвечают у него за функцию.
Я почитал про эти TCHAR и прочее, и слава богу что код под окна с оконными функциями я писал года 4 назад.
В общем, какая тут может быть проблема? Я так понимаю, либо в приведении к LPCSTR, либо таки в слэшах, так как буфер получает их одиночными.
чёт ты токсичный, может ты школьник, который тоже хочет быть воннаби нормис? Алгоритм же книжный, вот и подгляди в книгах, подумай что у тебя не так? Книги по чистому коду читал? про рефакторинг знаешь? А стандарты кода читал?
Ты реально аутист или тролишь тупостью?
Хотя что тебе остается, ведь ты очередная манюнька мечтающая вкатиться в ойти и получать 200к/нс, ты стал изучать С++ т.к. слышал, что все крутые дядки и хакеры используют его и решил, что ты тоже станешь таким с твоей нулевой базовой подготовкой и ты реально думаешь, что алгоритмы и прочий матан вовсе не нужен сейчас, когда все можно спрашивать на форумах и копипастить со стековерфлоу. Ты думаешь, как только ты изучишь как работают циклы и условные переходы, ты сразу сможешь устроиться на высокооплачиваемую работу в ДС, ходить с важным видом по офису, потягивать смуззи, громко обсуждать различные модные айтишные темы используя максимальное количество заумных слов, чтоб все слышали какой ты умный.
Но спешу тебя разочаровать: всего этого не будет и твой максимальный уровень это laba1.cpp.
Так что пошел нахуй с моего треда, где должны сидеть только истинные задроты.
Нахуй иди со своими пидорскими названиями переменных и чистым кодом.
Там и так все понятно.
Цитата одного известного человека:
>C is a Spartan language, and so should your naming be. Unlike Modula-2 and Pascal programmers, C programmers do not use cute names like ThisVariableIsATemporaryCounter. A C programmer would call that variable tmp, which is much easier to write, and not the least more difficult to understand.
Ты тредом ошибся. Это CPP тред, да и стандарты кода, а так науки о коде не просто так высирали, а чтобы за тобой кто-то что-то мог прочитать, а главное ты.
Бля, ты тупая обезьянка, еще раз говорю я прочитал дохуя книг и статей по этому алгоритму и не могу понять ошибку. Короче, нахуя я в сотый раз распинаюсь тут перед тупорылым дауном?
>чистый код
>рефакторинг
>стандарты кода
Вот это все выдает в тебе макакена.
Я знаю про все это, но при прототипировании это обычно не используется.
>при прототипировании это обычно не используется
При прототипировании говном мажут экран и улюлюкают?
А ничего что ЦПП и Си очень близкие друг другу языки с многими общими областями применения.
А ты в курсе, что можно писать на ЦПП как на Си?
Это первое.
Второе:
>>35741
>>чистый код
>>рефакторинг
>>стандарты кода
>Вот это все выдает в тебе макакена.
>Я знаю про все это, но при прототипировании это обычно не используется.
Но типичный макакен даже не знает о прототипировнии и его главная цель в написании программки красивенько все оформить, чтобы тимлид хуем по губам провел и сказал маладец.
>WinExec
Смотрим мсдн:
Note: This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.
Нахуя ты юзаешь этого динозавра? Под виндовс 3 пишешь?
Если для тебя тот код кажется чем-то совсем непонятным, то у меня для тебя плохие новости.
ты не поверишь, но там WinExec с этой программой, что он использует запускает какую-то утилиту Windows, которая работает из консоли. Как я понимаю, ему важно, чтобы когда он её врубает, то у него было SW_HIDE. SW_SHOW уже поставил я.
так, оба.
Ты же видешь, что у него там наверху ifdef с юникодом?
потом он эту строку приводит к c_str()
а потом указывает пойнтер на ANSI?
Это точно нормальная практика программировать окна?
>Java
Ты реально дебил?
Вот известный сайт по алгоритмам откуда я взял часть кода:
http://e-maxx.ru/algo/aho_corasick
>inb4: ПИДАРАШИЙ ГОВНОКОД РЯЯЯЯ
Ладно вот держи расово верный англосаксонский вариант:
https://www.geeksforgeeks.org/aho-corasick-algorithm-pattern-searching/
This directory contains the C and C++ code solutions as coded in the
O'Reilly book "Algorithm in a Nutshell", Second Edition, by George
Heineman, Gary Pollice, and Stanley Selkow, (C) 2016.
Во всей книге си, а ты нашёл там в директории ПИТОН ДЖАВА и закукарекал
Ладно, я понимаю, что ты троллишь, но подыграю тебе:
Открываем первое попавшееся на С
https://github.com/heineman/algorithms-nutshell-2ed/blob/master/Code/Sorting/Ints/modifiedQsort.c
И что мы видим? Говнокодик с непонятненькими названиями переменных?
А где же ThisVariableContainTheSizeOfTheArrayWhichWeUsedToCountWorldInTheClassSortedWhichInhiritsClassBasInOutFouthLessonInMyPriviousBookWhichIwroteWhenIWas21AndMyDickCouldStillBeHard = 21?
Более того, глупо вообще сравнивать код из книги с кодом из реальной жизни.
похоже у тебя реально проблемы.
Там таки понятный код, потому что переменный не похожи друг на друга, а книги по рефакторингу или стандарты ты не читал.
А вот помогать тебе внедрять в банк поиск по списку террористов (медленное решение), когда есть другой алгоритм, и он проще и быстрее для такого дауна, как ты.
Если тем более у тебя реально пробела в алгоритме, то это ещё большая проблема, для тебя, так как ты не можешь его выразить на псевдокоде, чтобы найти ошибку. Так что тестируй.
Проиграл
с_str() это получение указателя на внутренние данные в соотвествии с типом строки. если #def unicode то у него строка wstring и будет const wchar_t. иначе string и const char_t.
В свою очередь LPCTSTR = const char or const wchar_t depending on _UNICODE, то есть там тривиальное приведение из char в char и wchar_t в wchar_t без преобразований. Другое дело, что UINT WinExec(LPCSTR , UINT ); не приспособлена для wchar_t*.
Но всё равно скорее всего дело в '\\' и в '\"'. Видимо он парсит строку как строковый литерал:
WinExec("\"C:\\Program Files\\MyApp.exe\" -L -S", ...)
Боже, что за поток создания ты высрал?
Боже, как таким идиотом вообще возможно быть?
1. У тебя что фикс на чистоте кода? Ты недавно прочитал Чистый Код и теперь пытаешься блеснуть своими знаниями в любом разговоре? Так вот знай, я читал чистый код и прочие книги по рефакторингу и скорее всего даже получше тебя в этом разбираюсь и знаешь что? Я ебал твою чистоту кода в ротешник. Как тебе такое? Если ты даун и не можешь понять что t[v] это доступ к вершине, что функция go это функция переходов конечного автомата по состояниям и out это функция перехода на листья в дереве, то это твои проблемы, ибо почти во всех источниках именно так этот код и выглядит в плоть до названия переменных.
2. Ты настолько тупой, что даже не понимаешь и не знаешь предназначения алгоритма Аха Корасика, что думаешь это для поиск по списку? Ты вообще отличаешь поиск по списку от паттерн матчинга? Ты просто невообразимо туп, так что лучше даже не лезь сюда.
3. Я сразу сказал, что проблема в алгоритме. Алгоритм выражен абсолютно правильно, дело в том, что есть его вариации специально заточенные под конкретные специфические случаи, детали этих реализаций четко особо нигде не описаны.
Скоро сможешь. К 23 году (если повезёт в 2020) обещают добавить модули.
>>123580
Я тебе сказал, у тебя не та вариация. Такой алгоритм какой тебе нужен называется по другому. И ты даун, чтобы в банках делали поиск по списку? Там паттерн матчинг
Ты же даже не знаешь задачу которую я хочу решить им и уже говоришь, что мне нужен другой алгоритм.
Я просто в ахуе с тебя.
Rust?
Бля точняк, спасибо бро.
Единственное что мне приходит в голову - передавать qml как строку.
Но это плохая идея. А как лучше?
> я хочу чтобы в exe рисовалось основное окно, а каждая dll отвечала за вкладку. Как я это сделаю?
Главный вопрос.
Зачем?
Интересно. Вот допустим я хочу чтобы каждый новый модуль был самостоятельным и мог отвечать за свой интерфейс и чтобы добавить в програму новый функционал можно было просто создать новый модуль и не трогать старые вообще никак
> Но это плохая идея.
Чем она плохая? Qt так и делает, только сначала достаёт строку из ресурсов, а потом передаёт парсеру.
Мне нужно сделать из него множество всех комбинаций без пересекающихся интервалов, типа
[0-3][4-8][9-11][12-16]
[0-8][4-8][9-11][12-16]
[0-8][4-11][12-16]
[0-3][9-11][12-16]
Как сделать лучше?
У тебя во 2 и 3 комбинациях есть пересечения. Напиши полный вывод для данного примера.
Есть ли вообще смысл использовать new вместо new [1]?
Зачем было так делить операции? Чтобы потом кто-то пердолился, думая, есть там [] или нет?
Да ещё и результат не определён в случае ошибки.
Каков здравый смысл?
Впрочем, понял, можно же конструктор не по умолчанию юзать для не-[]
а ясно, это просто 2^64-1. Зависит от разрядности ос
Ну короче чтоб из входного ренджа сделать список всех возможных комбинаций с непересекающимися ренджами.
Input: [0-3][0-8][4-8][4-11][9-11][12-16]
Output:
1 -[0-3][9-11][12-16]
2- [0-8][9-11][12-16]
3- [0-3][4-11][12-16]
4- [0-3][9-11][12-16]
Типа как-то так.
Дело было в том, что он не тот метод юзал. У него ничего не вызывалось изначально ( а приложение которое он мне дал реально было 16-бит), и оно вызывалось, поэтому я отловить не мог( особенно когда я переключал сборку на юникод). Переделал код под криэйтпроцесс и тепеоь работает все.
Пойду дальше писать свои драйвера.
Порекомендуйте сборник задач/задачник по программированию.
Посмотри на какие-нибудь online judges, вроде https://codesignal.com/ и https://codewars.com.
Короче решил делать бектрекингом, но я настолько туп, что не смог это в голове реализовать без графа.
Rational Rational::operator+(Rational p)
{
numerator = p.denominator;
p.numerator = denominator;
numerator += p.numerator;
denominator = p.denominator;
return this;
}
и
Rational& Rational::operator+(Rational p)
{
numerator = p.denominator;
p.numerator = denominator;
numerator += p.numerator;
denominator = p.denominator;
return this;
}
Только теперь проблема, найти максимальные уникальные последовательности. То есть чтоб на последнем выходе не было 1 элемент (12-16). Может я граф не правильно построил?
Тоесть по твойму последовательности типа:
Root -> (0-8) -> (4-8) -> (4-11) -> (9-11) -> (12-16)
это нормальные непересекающиеся интервалы?
Нет, это дерево для бектрейса, то есть мы идем от root -> (0-3) x-> (0-8) ->x, на (0-3) мы смотрим что (0-8) пересекается и уже не идем дальше отбрасывая все поддеревья с (0-8) и переходим в root -> (0-3) -> (4-8) -> ...
и так далее.
Есть еще тут народ участвующий там?
Вот ссылка
https://leetcode.com/contest/weekly-contest-95/
В условиях написано, что надо вывести число с точностью до 6 цифр после запятой, но при юзании дабла только 5, чяднт?
Да сделай свой список или вектор с
блекджекомитератором и мемным аллокатором, почитай про мапы, хеш мапы, сеты и прочую поебень, изучи std algorithms, хули там.
>>36536
Есть же такая хрень, как std::setprecision(определена в iomanip), которая позволяет задать произвольную точность вывода чисел с плавающей запятой.
Что трай-то даст?
>>36432
Короче бля при больших N это начинает пиздецово медленно работать, что не проходит по времени в задании.
Вот код
https://ideone.com/XZe2It
Кто знает как ускорить можно?
Я бы это задание делал через матрицы смежности. Над алгоритмом думай сам.
В чем проблема отсортировать отрезки а потом перебрать?https://ideone.com/BFrMSU
Тут все равно лучше чем 2N не получится, если конечно надо выписывать все непересекающиеся множества.
Спасибо
Система непересекающихся множеств поможет тебе.
https://acmp.ru/article.asp?id_text=170
ты тредом ошибся, паскаледед
Какой же я даун нихера не понимаю, как вообще вкатываться в сетевое программирование?
Читаешь таненбаума и вперед
Ну тип классическая задача и классическое решение. Два отрезка пересекаются, если их концы лежат по разные стороны от линий, которые они задают.
Там векторные произведения: v1 = B1B2 x B1A1, v2 = B1B2 x B1A2 - если точки A1 и A2 лежат по разные стороны от отрезка B1B2, то векторные произведения будут иметь разный знак, соответственно их произведение v1*v2 будет отрицательным. Потом то же самое проверяется для отрезка A1A2.
codeforces.com
Нет. Нет, блядь, нет!!!111
1. С != С++
2. Там где С пересекается с С++, в плюсовых стандартах происходит одно, а в сишных другое.
3. K&R написан вообще в достандартную эпоху.
Короче K&R это вредный совет в 2018 году, честное слово.
Для allocator_traits написано, что "rebind_alloc = Alloc::rebind<T>::other or if Alloc is A<X,...> then A<T,...>" Но я где-то проебался и оно не хочет компилироваться именно на том месте.
https://ideone.com/evpXbL
Полдня сижу над этой пиздой.
Читай ассемблер абеля для общего развития. Остальное приложится.
ApplicationWindow
{
//
//
Grid {
//
}
}
Каким образом я могу описать grid в другом файле qml и заинклюдить чтобы было типа Grid : myGrid? А то сам грид большой и отдельнго файла требует
Ну же, ну, где советы?
Седжевика почитай. Можно Кормена, но это оверкил.
Особо не тестил, только вот написал.
Можете постестить, буду признателен за выявленные баги.
А я пока пойду спать.
https://ideone.com/MAuUis
Дают немного нефти заранее.
откуда у тебя такие охуенные картинки бро? Поделись плс соусом и паком!!!
>mingw
Под виндой есть смысл только в CLion + mingw, либо vs community ну и qt creator. Остальное ненужно и почти не развивается
Хорошо, отвечу. Codelite - что-то вроде текстового редактора с подсветкой синтаксиса и глуповатым автокомплитом. Примерно на уровне vim/emacs с парой плагинов. Лучше уж взять codeblocks. Он тоже говно, но умеет гораздо больше чем codelite.
Можешь посмотреть на vs code, может понравится.
Но вообще везде используют студию или clion, может еще qt creator. Это единственные 3 человеческие ide для крестов.
Во, спасибо тебе
Потому что пока не поставишь 100500 ненужных библиотек, хуй он будет нормально работать. И он исключительно виндусовский, что автоматически его переводит в уровень рабов.
Давай считать:
1. Kernel.dll
2. .net
3. Обязательный пакет расширения для винды, обязательные компилы для линуховых
4. Для эмуляции, обязательно поддержка гипервизора
5. Powershell если пишешь под мобильники
6. Еще 10 штук пакетов Visual C++ от времен бородино до 2018.
И все это что бы нормально установить и работать в какой то сраной IDE.
Нахуй?
1. Что это вообще такое?
2. Установлен
3. Это нормально. В линуксах кернел-хедеры.
4. Не обязательно
5. Может быть
6. ставится один, текущий. Тем не менее - если ты пекой пользуешься, они уже стоят.
Какая-то _ОЧЕНЬ_ странная аргументация, если честно. У тебя ССД на 32 гигабайта, или что?
Ну и да, ИДЕ не сраная, а де-факто стандарт индустрии.
Что ты несешь?
1. Это и так в винде есть, дебич
2. .net - по дефолту в 10 винде уже он есть
3. Для линукса - да. Про пакет расширения никогда не слышал.
4. Не обязательно
5. По дефолту есть в 10 винде
6. Ставится 2017, никаких других не надо
Нормальная аргументация. Хотя судя по первому пункту с тобой даже говорить не о чем. Максимум с чем ты работал это очередной форк или hw.
Не проецируй, гений доморощеный.
Какая версия?
Я не уверен на все сто(компилятора под рукой нет проверить), но есть вот такая штука: https://en.cppreference.com/w/cpp/iterator/data
Могут перекрываться области видимости, из-за чего твой массив видится как эта функция.
Хотя чуйка мне подсказывает, что дело не в этом
Чулочника заебал сосач. Оно и к лучшему, тут и так клоунов хватает.
Есть такая по руби и js, есть ли аналог для спп?
>Есть такая по руби и js
Я почему-то не удивлен, особенно по JS. Во истину язык для даунов.
Захуй те ЦПП, если ты даун? Один хуй либо не осилишь, либо останешься на уровне хелоу вордов.
Уже нашёл несколько. лел
Перескакиваю, по сути, с pthreads на него. Говорят, что функционала меньше, но зато кроссплатформенность. Да и нативные средства по-прежнему можно вызывать.
С вас по сути только "отзыв", особенно если с другого API вкатились, как в сравнении оно...
На 1.png код при n = 10000000 выполняется за 470 мс. Ключи, как видно, предварительно запихнуты в вектор(или в массив, не важно, пробовал и так и так).
На 2.png код при таком же n выполняется за 1991 мс. Здесь вектор не используется, а ключи берутся непосредственно из счетчика цикла for.
В чем подвох?
>Примерно на уровне vim/emacs
Сейчас во всех редакторах LSP для автокомплита. Тот же самый, что в VS Code.
Прости, можешь объяснить поподробнее?
Я так понимаю, ключ все равно передается по ссылке и unordered_map использует его только для вычисления хеша. Так какая разница откуда мы передадим значение по ссылке?
Будет работать только с POD типами. Если у объектов есть конструкторы-деструкторы, то твой вектор устроит тебе большой и неприятный сюрприз.
um[v] - тут непрямое чтение из памяти пидорасит кэш процессора, из-за чего падает производительность.
>Так какая разница откуда мы передадим значение по ссылке?
При линейном обращении к um шанс, что нужное значение лежит в кэше гораздо выше. С массивом у тебя мало того, что обращение к памяти рандомное, так еще и опосредованное, в два приема. То есть процу сначала надо дождаться, пока придет значение из вектора, а потом еще пидорасить бинарный поиск в um.
Ну, вообще по логике так, да. Только, во-первых, в массиве и векторе соседние элементы лежат рядом, то есть вероятность того, что соседние элементы вектора есть где-то в кеше, тоже довольно большая. А во-вторых, что самое интересное, все с точностью наоборот к твоим словам. Ты перепутал скриншоты. По ним видно, что в случае вектора(скрин 1) доступ быстрее, чем линейный(скрин 2).
И, если подумать, последовательные ключи 1,2,3... будут иметь совсем разные хеши, т.е. могут лежать далеко друг от друга и попадание одного элемента в кеш не означает попадание туда соседа. Но все равно какая-то хуйня, я запутался.
>Доступ по ключу за константное время.
"Константное" время на практике очень сильно зависит от того, как идет обращение к памяти. Вплоть до того, что для небольших массивов линейный поиск может быть быстрее, чем хэш таблица.
Работал в визуалке 2017 года, работал с символьными динамическими массивами. На визуалке "программа" работает некорректно. Выводятся вообще рандомные символы. Как я понял, неправильный адрес берется компилятором. Скопировал код в Dev C++ и C++ Builder - все нормально. Как фиксить парашу от микрософта?
Вангую дело в кодировке
А есть ещё вот такие:
https://books.google.ru/books/about/Patterns_for_Parallel_Programming.html?id=LNcFvN5Z4RMC&redir_esc=y&hl=en
Этих паттернов понапридумывали ояебу сколько. Если ты на кодера собираешь устраиваться, то просто забей. На практике ты их все увидишь не раз, только названия знать не будешь.
Всем без разбору, где требования к языкам только C++. Я даже C знаю очень неуверенно, а о питонах всяких и речи не идет. Хочу уже куда-то устроиться, а не все сидеть и „вкатываться“. Так что с ГРАСПом-то?
Спасибо, буду хоть морально готов, что на ГРАСПЕ оно не заканчивается.
Теперь появилось такое желание попрогать под виндой.
Раньше сказать, я ненавидел С++ под виндой, ибо WinApi это просто пиздец, корявое уебище по сравнению с красивым и удобненьким linux api + Студия говно, но я нашел Resharper C++ попробовал его вроде годно.
Единственное, что до сих пор смущает - это отсталый компилятор у студии, в котором мало того, что много чего из новых стандартов не реализованно, так еще и нету всяких санитайзеров, что просто киллер-фитча, который я постоянно пользуюсь в gcc, которая позволяет находить различные сложные баги. Плюс вывод ошибок у студии уебищный и не понятный по сравнению с gcc который прямо очень точно указывает, что не так да еще и цветом выделяет, студия выплевывает какую-то несуразную хуиту по которой вообще не понятно в чем проблема.
Зато у студиии дебагер вроде как получше.
Еще бесит у студии флаги компилятора уебанские и совсем другие, чем у gcc, clang, intel и проч.
Еще не понятно, что у студии с CMake'ом.
Так вот что скажите, если ли какие-то обходные пути?
Я бы посоветовал тебе Eclipse вместо VS. В нём сбываются все красноглазые мечты.
А что на счет санитайзеров, адекватного вывода компилятора, CMake, и прочего?
>>38643
Для себя я обычно всякие алгоритмических программы делаю.
На работу щас устраиваюсь, там под винду надо будет делать.
>>38649
Ой не, я Eclipse траил много лет под линуксом, за все эти годы переодических попыток, я так и не разобрался как там скомпилировать что-то. Эклипс это просто кусок говна.
Юзал QtCreator долгое время, потом пересел на CLion с его появлением.
Но Clion до сих пор не особо со студийным компилером работает, а отладчик его вообще не поддерживается.
На gcc под виндой, половина фишек типа санитайзеров не работает.
>На работу щас устраиваюсь
This is the third thread you've been applying for a job. So sad reading this. But its a fair price for being a linux c/c++ developer. Red-eyed guys have to suffer.
>This is the third thread you've been applying for a job. So sad reading this. But its a fair price for being a linux c/c++ developer. Red-eyed guys have to suffer.
Лол. Это паста или нахуя ты на англ. написал?
Вообще по линуксу дохуя всего, просто так попалось, что мне понравился проект, платят норм, и есть перспективы съеба с пидарахи.
А так на линуксе намного больше по плюсам вакансий, чем на винду.
If we go to a local job-placement site like hh.ru and check your statement about development under different operation systems we will find out that its totally wrong. There are only 1k positions marked both "c++" and "linux" against 3k positions marked with "c++" in total. What would you say in opposition to this fact?
Ааа
>being a pretentious cunt wallowing in his basic ability to write English
Seems ta me yer peen is hoora wee, innit?
>operation systems
o, vy iz anglii?
>against 3k positions marked with "c++" in total.
И где доказательства, что из этих 2к на винду больше тысячи?
>to write English
"in English" actually
>>38895
>o, vy iz anglii?
Mistakes are made.
>И где доказательства, что из этих 2к на винду больше
тысячи?
We cant get the certain numbers from the inquiry. In my experience if an employer doesn't point out "linux" in a description then its a windows-based position, though.
QtCreator + MSVC компилятор, ежжи.
З.Ы. Только креатор предпоследний бери. Из ГУИ на выбор как с++ Qt виджеты, так и QML JS фигня с пробросом с++ функционала, забавная вещь.
Maybe somewhere in India it is.
Чем оно худшее, дебич? В разы проще и интуитивнее, чем MS VS.
Выведено всё, всё, блядь, что можно.
Земля тебе пухом
Во-первых, я ахуеваю на сколько студия уебищная с работой с CMake это просто пиздец, постоянно че-то не обновляется в этом ссаном кеше, блять через жопу все опции как-то, флаги компиляции как-то криво приходят, пиздец одним словом.
Во-вторых, я хуй знает как, но блять файловые стримы под виндой работают в 100 раз медленее. Мое приложение много работает с файлами, и я долбоеб, почему-то решил использовать плюсовые стримы, хотя знал что это кусок говна, но не ожидал, что настолько. В общем, идея там простая: я задая фиксированный буффер через rdbuf()->pubsetbuf() и уже пишу/читаю потом. Короче на линуксе чтение/запись работает очень быстро типа файл в 10 мегов, пишется из памяти через с++ стримы в районе пары мс, под виндой эта хуйня занимает по 3-4 СЕКУНДЫ!!!! Я сначала не понимал, почему мое приложение так медленно работает, потом запустил профайлер и ахуел, что это файловый стрим так тормозит, заменил его на Сишные стримы все стало нормально. Но это просто эпический пиздец.
В-третьих, как меня заебала студия своим уебищным UI, при компиляции поднимается окошко с логом компиляции и ошибками и СРАЗУ ЖЕ закрывается, я блять ахуеваю просто, постоянно надо нажимать туда чтобы посмотреть ошибки, а держать его открытым постоянно - это место занимает. Короче пиздец.
В-четвертых, ебучие хуй разбери логи студийного компилятора, я которых хуй разберешься.
В-пятых, Ебучее WinAPI, сегодня час потратил пока искал в инете как превратить код возврата ошибки в строку, там пиздец.
Пиздос, иде для пидоров как и смейк, но похоже ты уже начинаешь понимать
Потому что медленные как пиздец.
Для винды по опыту считывание около мб оптимально. Больше или меньше медленнее. И при чем тут плюсы, если за стрим ОС отвечает?
1. Да
2. Делает хуйню
3. Неосилятор
4. Неосилятор
5. Неосилятор
> РРРРРРРРРРРЯЯЯЯЯЯЯЯЯЯЯЯЯЯ СТУДИЯ ГАВНО МАМ
"Ссылка просто предоставляет нам более простой интерфейс по сравнению с указателями. Теперь не надо постоянно разыменовывать." - Примерно так пишут в учебниках.
На деле:
> семантика переноса
> ссылки rvalue, lvalue, универсальные ссылки
> Ой, у вас тут std::move отваливается, замените на std::forward
> Ой, вы думали, что тут rvalue, но он как аргумент, конечно, rvalue, но формальный параметр есть lvalue по природе своей. Не ешь, подумой
> Здесь у вас кусок говна получился с копированием, мы же хотели прямую передачу
> Вы что, не знаете, как сворачиваются ссылочки?
И это притом, что:
> Указатели неплохо смотрятся в шаблонах.
> Указатели прозрачны в плане модели памяти и вообще довольно наивны. Ни у кого в голове не будет сомнений по поводу природы указателя, в то время как изучающие C++ без С могут спустя года не понимать, что компилятор все ссылки в конечном счёте сводит к указателям как естественным носителям информации "где".
Добро пожаловать в мир разработки по, клован. Нехуй было 8 лет сычевать под одной осью и дрочить в один и тот же инструментарий.
Я вроде ясно написал, что СИшные стримы работают нормально, когда я ими заменил плюсовые. При чем тут ОС?
>>39141
Просто обоссал и убил твою семью, большего ты не заслуживаешь.
>>39145
>"Мир разработки ПО"
Лел.
Вообще я думал ваш мир намного более продвинутый, но сейчас понимаю, что линукс в этом плане идет впереди лет на 20.
Попробуй сменить компилятор. По сути из твоего жирного поста проблема-то только в медленной работе. Серьёзная.
Серьезная да, но остальные мелочи тоже выводя из себя спустя некоторые время.
>Попробуй сменить компилятор.
Так смысл, если программа должна быть кроссплатформенная? Под студией она уже хуево работает, значит под нее уже надо менять решение.
Да, тебе один намекнул, но зачем ты полез КАЧАТЬ ВИЗУАЛ СТУДИО ПОСЛЕ МНОГИХ ЛЕТ ОБЖИМАНИЯ/ПИНУСА?
Есть mingw, MSYS, pacman доставит утилиты!
> кроссплатформенная
Не кросскомпиляторная. Вообще, если ты нигде не обосрался и не написал какой-то код с undefined behaviour в редких ситуациях, то тебя долбать судьба твоей обёртки системных вызовов волновать не должна.
Не нравится - пиши ifdef'ы и разные вызовы для разных осей, лул.
FILE * это указатель на стрим, если что.
> The fopen() function opens the file whose name is the string pointed
to by pathname and associates a stream with it.
Вы уже забываете свои корни
Да я пару постов назад писал, что хочу попробовать на студии пописать. Тем более я там же писал, что у всяких gcc под виндой половина фитч не работает, типа санитайзеров.
>>39163
В том-то и дело, я кроме STL ничего не использовал и по идее должно было работать нормально в любых компиляторах.
В общем, я думаю проблема в ебучих плюсовых буферах, которые на каждый символ вызывают функцию.
>std::basic_istream::read
>When using a non-converting locale (the default locale is non-converting), the overrider of this function in std::basic_ifstream may be optimized for zero-copy bulk I/O (by means of overriding std::streambuf::xsgetn)
>std::streambuf::xsgetn
> Reads count characters from the input sequence and stores them into a character array pointed to by s. The characters are read as if by repeated calls to sbumpc().
Короче стримы сами по себе медленное говно.
Жаль в плюсы не завезли мемори мапинг.
В догонку топик по сабжу
https://stackoverflow.com/questions/26095160/why-are-stdfstreams-so-slow
Чего?
Чем выше уровень абстракции, тем меньше производительность. Очевидно же. Ты бы ещё производительность raw и smart указателей сравнил.
Абстракции абстракциями, но если бы ты почитал тот тред дальше, то увидел бы, что разработчики gcc почему-то позаботились о быстрой реализации этих стримов для больших блоков данных, а в студии похуй. Хотя это даже хорошо, а вообще лучше бы из С++ удалили файловые стримы, и оставили бы только стринг стримы, для удобного форматирования.
Ну или хотя бы завезли какие-нибудь классы для работы с большими бинарными файлами.
Ну что ты пристал? Никто уже не помнит зачем ссылки ввели. А && ввели, потому что хомяки новый функционал клянчили. Мол вон в питухоне ещё инструментария навалили и какие там всякие приколюхи - нам это тоже пиздец как надо.
>Ну что ты пристал?
Я просто представил, как на меня будут смотреть, если я не буду их в коде юзать вообще.
И есть дикое желание, если честно...
Так и что не понимаю и где я не прав или обосновывай или иди нахуй со своими вскукареками.
Да всем пофиг на самом деле. Писать на c++ это как жить в Китае или Индии - вроде язык общий и традиции, однако отдельные этносы друг друга нихуя не понимат.
Вот как у нас тут челик из Южной Индии мира линухов не может найти себя - так и по всей отрасли.
>Чем крестодибилам указатели помешали?
А их никто и не трогал. Оставили как есть. Хочешь использовать && - используй. Не хочешь - можешь написать то же самое на указателях как в бородатом 98м.
>Писать на c++ это как жить в Китае или Индии - вроде язык общий и традиции
У крестоблядков ООП головного мозга, что и порождает проблемы, можно так же посмотреть питухонщиков.
> Хочешь использовать && - используй. Не хочешь
Но зачем? Зачем это говно нужно?
>как в бородатом 98м.
Я уже школу закончил как два года.
Эффективные менеджеры требуют многа и за быстро и чтоб вчера и чтоб сразу в продакшн. Отсюда ооп, питухон, аджаил и прочее говно.
>Но зачем? Зачем это говно нужно?
Это костыль для случаев, когда можно избежать глубокого копирования.
Например данных, которые хранятся в объекте по указателю и подразумевают единоличное владение.
>Например данных
Ну я же знаю их формат и могу их скопировать от руки, зачем это все переносить в язык?
Ну любители c, например, пердолятся с хранением указателей на функции в структурах, чтобы имитировать объект с методами. В c++ это встроено в язык, хотя в большинстве случаев это не нужно.
Попробуй написать код для вот такой ситуации без &&.
class A {B* m_p;};
A f();
A a1 = f();
A a2 = a1;
> Code:Blocks
Почему. Почему. Почему постоянно ньюфаги упоминают этот кусок дерьма. ЗАЧЕМ? Почему нельзя поставить Студию\Шлион\Культикреатор. Почему ставить этот высер сифозной макаки?
Thief и квака уже не стоят на грани компьютерной графики, анон.
Так у него ЛевЪ на Java писанный работает. Пациент просто копротивляется. А может это дистрибьютер JetBrains свои копеечки отрабатывает.
Можно ли это отключить как-то?
В c они это тоже делают, причём везде, но только с включением оптимизации.
Виндовый компилятор медленее в дебаге, т.к. имеет 100500 проверок на безопасность, многие вещи пролетающие в гцц как по маслу, в винде падают с абортом, т.к. код ансейф. Попробуй с -Ox на винде, и каким-то -Ofast на гцц.
Плюс в винде многие небезопасные оптимизации выключены вообще и нужно ручками все указывать, тот же strict_aliasing например.
Вообще в современном мире компилировать код чем-то кроме clang+llvm моветон
Пацаны, код годный? Стоит за ними повторять?
https://github.com/CRYTEK/CRYENGINE/tree/release/Code/CryEngine
>But you have no experience.
Everyone who have ever applied for a job has such experience.
>Ви продолжаете, может таки лучше остановиться?
Any explanations are welcome.
Слушай, я сегодня напишу специально тест для стримов С++ и сишных, нативных ОС файловых функциях и мемори маппед файлов.
Так вот ясен хуй я компилировал с максимальными оптимизациями при проверке. Просто сами плюсовые стримы так сделаны хуево по крайней мере в студии.
>applied for a job
Which you have not.
>Everyone who have
has. And probably "anyone" fits better.
>Any explanations are welcome.
I don't like "the" there, doesn't seem right. Perhaps the word "certain" is throwing me off a bit, of course. More importantly, your sentence sounds like there are some numbers (out of many) that you can't get, while what you were trying to say is you can't get specific or accurate numbers [of windows-only jobs].
I know it has a kind of similar definition in the dictionary, but see these, for example:
https://english.stackexchange.com/questions/252054/difference-between-certain-specific-and-particular
https://english.stackexchange.com/questions/291113/what-is-the-difference-between-certain-and-specific
Oh, and it should be "the description" in the next sentence.
Выключи там синхронизацию, убери проверки локалей, добавь буфферинг и увидишь, что цпп даже быстрее быть может.
А какая особая разница между функцией и классом с оператором()? Ну помоимо того что класс это ещё и всякие хуйни там можно понавешивать.
Нахуярить вместо функций классов и использовать безымянные объекты как функцию.
Бамп епт.
Правда ещё есть Clion, он даже получше будет чем Visual studio, более того он кросплатформенный, но он стоит дохуища денег, 12000 в год.
Мне на линухе так вообще приходиться пользоваться "qtcreator", параша полная, но даже это лучшее из того что представлено на линухе из IDE (помимо вышеупомянутого Clion'a).
А нет, Clion стоит 90$ в год (что собственно тоже не подъёмная сумма (для большинства русских))
main.cpp:15:17: fatal error: SDL.h: No such file or directory
#include <SDL.h>
Памагите пожалуйста
ИДЕ NetBeans
Да, записывай:
#include <iostream>
int main(){std::cout << "Hello faggot" << std::endl;}
Компилируй: g++ main.cpp
Туда тебе и дорога.
>Фикс на дурке, оре и омеганстве
Тебя в детстве санитары избивали и ты потом плача громко орал, что теперь ты омеган и чмошник?
Дааа, не завидую...
OpenGL - это просто спецификация, так. Реализация спецификации сделана в драйверах GPU.
Тогда что я подключаю #include <GL/glut/glew/GL.h>. И если я не закину dll в проект, то говно не скомпилируется. В спецификации написано, что это >OpenGL Loading Library
Нихуя не понимаю блять
Какая версия винды и студии? Может тебе просто мать пропылесосить?
Или лучше скопипастить сделать что-то типа этого?
http://doc.qt.io/qt-5/qtwidgets-graphicsview-elasticnodes-example.html
по стандарту можно не писать в main()
OpenGL в винде предоставляет возможности программирования только на OpenGL 1.1. Для того, чтобы писать на чем-то поновее, нужно загрузить нужные расширения из системы. Т.е. сама винда загружает только 1.1, надо дозагруживать
Очевидно говнокод. А по делу, если i это int, то, как мне думается, автор пытается избежать переполнения при умножении.
А может это фрагмент из йоба метода по типу метода Кармака для обратного корня.
Спасибо, я просто даун
Заюзаю MathGL
auto main(auto argc, auto argv)
{
std::vector<std::basic_string<decltype(argv)>> v;
for(auto i = decltype(argc)(); i < argc; ++i)
{
v.emplace_back(argv);
}
...
}
все эти инты и шорты обычно у студентиков в лабах остаются
Пили новый, ты, чорт.
Сап,
В некой программе создается виртуальная область памяти и виртуальный регистр.
У регистра есть методы get и set, которые наследуются из другого класса. Нужны для того чтобы читать из регистра и писать, регистр может иметь атрибут RO, RW, WO, в зависимости от этого мы определяем можно ли вызвать get или set.
Задача: мне нужно реализовать маппинг этого регистра к памяти по определенному адресу, чтобы вызывая get объекта, я выполнял логику get или set регистра.
У класса Memory я делаю метод map в него подается адрес на который я хочу замапить регистр и сам регистр.
void Memory::map(int addr, Register ✼reg_m) {
int64_t tempAddr = (int64_t)(int✼)reg_m;
....
}
Здесь я получил адрес регистра, т.е. адрес объекта, но теперь вопрос:
Как у этого объекта вызвать метод зная только его адрес?
Грубо говоря:
0xdeadc0de.get()
А сама программа будет работать так:
Register Reg0(8, RW); //создали регистр
Memory memspace(0x00, 0x60); //создали область памяти размером 0x60
memspace.map(0x53, &Reg0); //мапим регистр на 0x53
memspace.read(0x53); //тут уже будем читать из регистра, проходя логику проверки аттрибута регистра, и принимаем решение, можно ли с него читать или нет
Сап,
В некой программе создается виртуальная область памяти и виртуальный регистр.
У регистра есть методы get и set, которые наследуются из другого класса. Нужны для того чтобы читать из регистра и писать, регистр может иметь атрибут RO, RW, WO, в зависимости от этого мы определяем можно ли вызвать get или set.
Задача: мне нужно реализовать маппинг этого регистра к памяти по определенному адресу, чтобы вызывая get объекта, я выполнял логику get или set регистра.
У класса Memory я делаю метод map в него подается адрес на который я хочу замапить регистр и сам регистр.
void Memory::map(int addr, Register ✼reg_m) {
int64_t tempAddr = (int64_t)(int✼)reg_m;
....
}
Здесь я получил адрес регистра, т.е. адрес объекта, но теперь вопрос:
Как у этого объекта вызвать метод зная только его адрес?
Грубо говоря:
0xdeadc0de.get()
А сама программа будет работать так:
Register Reg0(8, RW); //создали регистр
Memory memspace(0x00, 0x60); //создали область памяти размером 0x60
memspace.map(0x53, &Reg0); //мапим регистр на 0x53
memspace.read(0x53); //тут уже будем читать из регистра, проходя логику проверки аттрибута регистра, и принимаем решение, можно ли с него читать или нет
>Как у этого объекта вызвать метод зная только его адрес?
>TvoyClass✼ obj= reinterpret_cast<TvoyClass✼>(obj_addr);
>return obj.get();
?
Методы они не у адресов, они у объектов. Ну или я не понял, что ты вообще делаешь. Если ты в map() передаёшь указатель на Регистр, нахуя ты его в безликий адрес переводишь-от, почему бы этот же указатель и не сохранить? Потом reg_m->get() вызовешь да и всё.
@
НАЧИНАЮТ ЕБАТЬ ЧИСТО СИШНЫМ ГОВНОМ И НИЗКОУРОВНЕВОЙ ЗАЛУПОЙ
это нормально, котаны?
просили поволохать битьы - поволохал.
срезался на ололофункциях с мемсетами мемцпай ЧТО ВЫВЕДЕТ ПРОГРАММА НА ЭКРАН ЧТО ЗНАЧИТ НЕ БУДЕТ РАБОТАТЬ ПОЧЕМУ ИМЕННО НЕ БУДЕТ РАБОТАТЬ ЧТО ИМЕНО ВЫВЕДЕТ
А в чем пример был, в чем фишка? Мемсет, мемсру, и что? Там какие-то мегаподводные мегакамни?
там был кусочек ебанутого кода.
и в общем было ясно что там в определенный момент память потечет, и еще куски какой-то ебанины.
я постарлся указать на то что там потечет памятть и нет смысла смотрю ту ахнинею, что есть еще. но ЭТО ОКАЗАЛОСЬ ОЧЕНЬ ВАЖНО
Короче ты просто не знал, что будет и предположил, что потечет память потмоу что используются сишные функции?
Ясно.
Мы вам перезвоним.
ты даун?
я тебе сказал,что там явно текла память + нахуевертили еще какого-то говна до этого.
я обозначил - тут потечет память, а тут - даже голову ломать не буду.
они такие - хуяк. ну тут потечет, а тут что будет. а я говорю - да какая разница в общем-то
static constexpr inline bool IsPowerOf2(const int32 Value) noexcept
{
return (Value & (Value - 1)) == 0;
}
Ну да. Те же тестовые ингда требуют написать без использования STL. Зачем? Чтобы кандидат мог ковырять легаси говно или заниматься оптимизацией.
Ассемблер - это детская игрушка по сравнению с С++, в асм нету ничего сложного, единственные что может вызвать там затруднения - это понимание работы памяти и аккуратное ее использование, а так хули там есть инструкция есть 1-3 операнда, которая она принимает, сам по себе язык очень примитивный, а вот С++ это пиздец, кроме того же понимания работы памяти, там надо понимать и знать еще кучу вещей, кучу разных нюансов, знать кучу различных подводных камней.
Поверь мне, я знаю и х86 асм и плюсы уже 10 лет и то я не могу сказать про себя что я гуру в плюсах, до сих пор иногда нахожу вещи в них, которые я не знал или не понимал.
Да это то все понятно, я к тому, что трудности меня не пугают. Да и дрочу я на си, еще на 2 курсе как узнал об языке, так и влюбился
Все можно гуглить, все можно смотреть в справочниках
Мне интересно, я стану богом со связкой python и cpp?
А что есть бог для тебя? В некоторых конторах без знания определённых областей матана ты будешь делать сосамба писюрелла.
Да как вы заебали. Выучу - стану богом. Калькуляторов. Язык это просто детский лепет. 95% нужной инфы не программирование. А дискретная математика, теория информации, линейная алгебра, матан, статистика, теория вероятностей, алгоритмы, структуры данных, протоколы. В зависимости от области применения. Вот мне ебучию криптографию и телекоммуникационную начинку побоку начем писать. Хоть да яваскрипте, только оно не влезет и памяти не хватит. В последнюю очередь мне были важны нюасы языка, а вот статистические данные и вероятностная модель в первую
Дак я и не буду лезть туда, где супер мега матан, я прекрасно знаю свои возможности, а вернее свою лень
Ну тогда будешь формошлёпить на qt и пилить автоматизацию сборки/тестирования на python.
Кодирование источника. А что ты подучишь с моего ответа? Всего лишь потешишь свое самолюбие
Че так жестко? Можно много крутых проектов сделать не знаб глубин матана, а если прямо прижмет, то всякие стаки, хабы и просто f9 try наше все
А знаешь, я не знаю. Ну сервер написать на нем, всякую дрянь типа шифровальщиков, хуков. Язык многогранен и он не только для решения " в чем смысл жизни? -7"
Или как там было, в теории большого взрыва?
Теорию информации конечно. Теория электросвязи отдельный пиздец. Быстрофикс
Бро, я не знаю этой теории, но щас зайду в гугл и ознакомлюсь.
А почему бы и не на си это писать? На питоне тоже можно, я и писал на нем, но доверять всяким py2exe это пиздец и объем файла становиться пиздец огромным из-за зашивания в ехе интерпретатора py
Ну ознакомишься. А вот полноценную начинку цифрового тракта по всем 7 уровням модели osi написать после ознакомления не сможешь. И выдрочив весь стандарт тоже не сможешь. И обосновать, почему надо именно так не сможешь. Суть в этом. Есть много областей, где знания только языка недостаточно.
>>41745
Ну вот и ответил. А то ну не знаю, ну прост, шоб было))) тогда да, плюсы и архитектура ос. Может быть ещё сети
Osi знаю, как же блядь заебало писать на парах про эту хуету, если надо будет всегда конспекты открыты.
Да и зачем мне все это знать на старте, все приходит с опытом, кругозор увеличивается И так далее итп
Ну напишешь ты на листочки с прикладного по физический. И после этого электрические сигналы магическим образом превратятся в картинку? Разве что большого протонного хуя. Тут не опыт, а цос, тэс, ти и тервер сразу нужны, а не постепенно.
Я так то учился на компьютерных системах и комплексах, есть понимание как чаго почему. Диплом сдал на 5, на защите хуярили прямо
Электротехника аппает невероятно в этом
Да, но для себя я выбираю именно то, что можно делать программно. Хватит с меня всей поеботы, хватило за 4 года, хоть и было интересно
Да все в рот ебали тебя и твои теории автоматов.
Нормальные парни пишут на React и Node, попивают крафтовое пивко в барах, и носят андеркаты, добираясь на работу на гироскутере, пока такие чмошники, как ты стоят в сторонке и молча завидуют.
Есть ли какой-то красивый способ такое организовать, кроме оборачивания каждого вызова в if(!funcN()){return;} ?
func1() && func2() && ... && funcN();
Если хочется, можно еще показать, что возвращаемое значение не нужно.
(void)( func1() && ... );
тебе нужны rangesv3
Бля почему С++ такой ущербный язык, что Foo f(&i) вызывает конструктор по ссылке из-за того, что он не может неявно скастовать int в const int
[/code]
https://ideone.com/L1rcW8
Я говорю почему С++ такой ущербный язык, что Foo f(&i) вызывает конструктор по ссылке из-за того, что он не может неявно скастовать указатель на int в константный указатель на int.
Алсо, по ссылке код уже пофикшеный, но стоит только убрать enable_if и все пойдет по пизде.
>он не может неявно скастовать указатель на int в константный указатель на int.
Он всё может. Просто байнд к ссылке лучше, чем qualification conversion
О том и речь. Приходится ебошить костыли и ублажать компилятор, чтоб он смог выбрать правильную перегрузку.
Я из гугла тоже могу копипастить в тред типа ебать я эксперт. Ведь ты именно так и сделал, загуглил вопрос и пришел сюда кукарекнул с ебать видом эксперта, а потом, когда я попросил тебя обосновать конкретную вещь, ты тут же слился, ибо сам нихуя в этом не понимаешь.
/обоссан
static constexpr inline noexcept
Но Холмс, зачем?
Это должно быть на рефлексе как правило хорошего тона или тут есть какой-то смысл именно для этой задачи?
https://www.justsoftwaresolutions.co.uk/cplusplus/shared-ptr-secret-constructor.html
Язык должен быть интуитивно понятен. Вы берете молоток и сразу видите, куда и как бить — вам не надо читать 300-страничную инструкцию к нему.
В общем мир окончательно рпзделился на тех, кто успел выучить C++, пока он был относительно простым и тех, кто не выучит его никогда!
Сам то читал его, постер картиночек?
Может ты даже знаешь, что на самом isocpp написано, что стандарт не является средством для изучения языка и тд?
Читал.
Спасибо за подсказку! Анон, надеюсь ты еще здесь...
В безликий перевожу, потому что каждая ячейка mem-space`а имеет поле mapped[addr], где addr - адрес ячейки в этой области памяти, в это поле, собственно, и пишется указатель на то что замаплено, а там может и быть и ПОРТ, и РЕГИСТР, и ШИНА и даже ROM. И они реализованы в будущем будут по разному. Еще это нужно будет мне чтобы отрисовывать дерево маппингов.
Когда я создаю регистр, он наследует свойства (или как правильно) класса Device, в котором есть все что касается всех устройтв без исключения (hard_reset, value, и т.д.). Так же конструктор ставит в специальное поле Device->type флаг, кторый и обозначает тип этого устройства (defines ниже).
Далее когда происходит read\write из ячейки mem-space`а, программа смотрит, что замаплено? Сначала смотрит dev_m->get_type(), и если это порт то приводит указатель к классу Port и вызвает Port::read(), если там регистр то Register::read() и т.д.
В общем, подумал, подумал я и сделал все вот так, в map передается класс Deivce:
#define DEV_REGISTER 1
#define DEV_MEMSPACE 2
#define DEV_PORT 3
#define DEV_BUS 4
class Device
{
protected:
....
int type = 0;
public:
.....
int get_type() {
return type;
}
;
};
void Memory::map(int addr, Device ✼dev_m) {
int64_t tempAddr = (int64_t)(int✼)dev_m;
switch (dev_m->get_type()) {
case DEV_REGISTER: {
printf("Mapping Register to %d\r\n", dev_m->address);
Register✼ obj = reinterpret_cast<Register✼>(tempAddr);
break;
}
case DEV_PORT: {
printf("Mapping Port to %d\r\n", dev_m->address);
Port✼ obj = reinterpret_cast<Port✼>(tempAddr);
break;
}
.......
}
obj->map(addr);
space[addr] = tempAddr;
mapped[addr] = 1;
}
Работает так:
Register R0(8, RW);
Port Port0();
Memory memspace(0x00, 0x60);
memspace.map(0x53, &R0);
memspace.map(0x55, &P0);
Теперь вот 2 вопроса:
1. Не сильно ли я зарылся в абстракции?
2. Вот этот switch выше так же будет и в read, write, map, unmap. Можно ли как-то его в функцию засунуть? Я думал, думал, но пока не пойму что она должна возвращать? А то везде switch, получается написан... И много выходит повторяющегося кода.
Спасибо за подсказку! Анон, надеюсь ты еще здесь...
В безликий перевожу, потому что каждая ячейка mem-space`а имеет поле mapped[addr], где addr - адрес ячейки в этой области памяти, в это поле, собственно, и пишется указатель на то что замаплено, а там может и быть и ПОРТ, и РЕГИСТР, и ШИНА и даже ROM. И они реализованы в будущем будут по разному. Еще это нужно будет мне чтобы отрисовывать дерево маппингов.
Когда я создаю регистр, он наследует свойства (или как правильно) класса Device, в котором есть все что касается всех устройтв без исключения (hard_reset, value, и т.д.). Так же конструктор ставит в специальное поле Device->type флаг, кторый и обозначает тип этого устройства (defines ниже).
Далее когда происходит read\write из ячейки mem-space`а, программа смотрит, что замаплено? Сначала смотрит dev_m->get_type(), и если это порт то приводит указатель к классу Port и вызвает Port::read(), если там регистр то Register::read() и т.д.
В общем, подумал, подумал я и сделал все вот так, в map передается класс Deivce:
#define DEV_REGISTER 1
#define DEV_MEMSPACE 2
#define DEV_PORT 3
#define DEV_BUS 4
class Device
{
protected:
....
int type = 0;
public:
.....
int get_type() {
return type;
}
;
};
void Memory::map(int addr, Device ✼dev_m) {
int64_t tempAddr = (int64_t)(int✼)dev_m;
switch (dev_m->get_type()) {
case DEV_REGISTER: {
printf("Mapping Register to %d\r\n", dev_m->address);
Register✼ obj = reinterpret_cast<Register✼>(tempAddr);
break;
}
case DEV_PORT: {
printf("Mapping Port to %d\r\n", dev_m->address);
Port✼ obj = reinterpret_cast<Port✼>(tempAddr);
break;
}
.......
}
obj->map(addr);
space[addr] = tempAddr;
mapped[addr] = 1;
}
Работает так:
Register R0(8, RW);
Port Port0();
Memory memspace(0x00, 0x60);
memspace.map(0x53, &R0);
memspace.map(0x55, &P0);
Теперь вот 2 вопроса:
1. Не сильно ли я зарылся в абстракции?
2. Вот этот switch выше так же будет и в read, write, map, unmap. Можно ли как-то его в функцию засунуть? Я думал, думал, но пока не пойму что она должна возвращать? А то везде switch, получается написан... И много выходит повторяющегося кода.
Сап /pr/, вкатывальщик 16 лвла ищет книгу чтоб не было много ебли с основами программирования
Я знаю си и питон, шарю в байты хуяйты и тд, какую книгу мне читать ?
Пикрандом
В С++
Хачю работать штобы 20к грывень в месяц
Хочу разобраться как работает язык, стандартные библиотеки и какойта фреймворк чтоб на хлеб с маслом хватало Я просто люблю программирование
Вы блять вообще шапку читаете в треде?
Там блять целая простыня с книгами и подробно разжованно с чего начинать и куда двигаться
>Я просто люблю программирование
Больше похоже, что ты читать любишь. Ну тип нормальная мотивация - я хочу делать то-то и то-то (и для этого мне нужен c++), а не наоборот.
Я хочу программировать шоб в кайф было, и для этого мне нужен коммон лисп, но я его не осилил из-за отсутствия опыта. Решил выучить C++ для поднятия скилла в программировании. Потом уже начну учить лиспы
Вот написал такой и понял что я долбоеб и не могу сформулировать свою мысль нормально. Ну ладно
Тебе может на полиморфизм глянуть? Виртуальные функции там и всё такое. Если твои регистры и прочие наследуют от Device'а, в интерфейсе которого есть нужные тебе read, write и т.д., то и не нужны никакие касты. Храни массив указателей на Device (записывая туда адреса объектов твоих сабклассов), а потом просто вызывай space[addr]->read(), который вызовет нужный метод у настоящего объекта.
Иначе у тебя фигня какая-то получается, если всюду придётся городить свитчи с непересекающимся кодом.
Макс Шлее
1. Имеется абстрактный класс с чисто виртуальной функцией.
class examp;
У него есть protected-поле:
T t;
В конструкторе работает код типа
t = set_t(const T& _t);
где
T examp::set_t(const T& t)
{
t = _t;
return t;
};
Однако, когда в конструкторе вызываешь функцию типа такой:
void examp::set_t(const T& _t)
{
t = _t;
};
поле t никак не инициализируется, чому так?
1. Имеется абстрактный класс с чисто виртуальной функцией.
class examp;
У него есть protected-поле:
T t;
В конструкторе работает код типа
t = set_t(const T& _t);
где
T examp::set_t(const T& t)
{
t = _t;
return t;
};
Однако, когда в конструкторе вызываешь функцию типа такой:
void examp::set_t(const T& _t)
{
t = _t;
};
поле t никак не инициализируется, чому так?
1. При чем тут чисто виртуальная функция?
2. Имена переменных просто заебись нет
2. t = set_t(const T& _t); - что это за хуета?
3. T examp::set_t(const T& t)
{
t = _t; <----- константной переменной присваиваешь значение, как так-то?
return t;
};
Короче, я нихуя не понял.
Спасибо, анон! Почитаю про полиморфизм
Да.
Это особый тип извращенства, что ли, использовать сеттер внутри самого класса?
Покажи целиком код, где что-то не работает, желательно на repl'е или ideone'е.
именно для этой не нужен, за статик сорри, копировал из своего говнокода, там это был публичный метод класса.constexpr сам знаешь зачем. inline - потому что раньше пихал его везде и страдал синдромом forceinline'а, просто осталось. noexcept вроде как ускоряет время компиляции (хотя я понимаю, что это ничтожнофункция никакого прироста не даст)
Тогда, если подправить еще пару мелочей, должно быть так?
constexpr bool IsPowerOf2(const int32_t Value) noexcept { return !(Value & (Value - 1)); }
noexcept, ЕМНИП касается гарантий и, пиша это слово, ты ручаешься, что не бросит ни при каких обстоятельствах. И это то, что раньше было throw(), т. е. nothrow гарантия. Я так понял, что из всех вариантов throw() только она и осталась, а остальные из языка поубирали без вариантов на замену.
constexpr до конца не понимаю, зачем. Ну напишу его, и что дальше? Илья Муромец вырасти должен?
Сначала получается вектор даблов, потом его надо переделать в инты и записать в атрибут класса (который имеет лишь конст гетер, так что не могу напрямую в него из трансформа писать). Хочется точно не копировать данные без необходимости лишний раз.
Попробовал как-то так, но почему-то с мувом даже медленнее выходит — https://repl.it/repls/FullMildMiddleware с мувом в push_back'е, подозреваю, тоже не всё правильно.
Хотя вот тут, где практически то же самое и написано, вроде бы, мув в разы быстрее — https://repl.it/repls/ItchyCornsilkError
Где я обосрался?
Блин, точно, хреново скопировал. Спасибо.
написав constexpr, при известных на этапе компиляции значениях, функция выполнится на этапе компиляции
т.е. написав где-то (к примеру) if(IsPowerOf2(5)), компилятор выполнит функцию и на выходе будет if(false). Как-то так
Я сам себе отвечу шикарным примером. Вдруг и другим пригодится:
template<int... vals>
constexpr int sum() { return (vals + ...); }
Как есть сейчас, можно использовать для, например, int array_of_size[sum<1,-2,3>()]; // и всё компилируется
Стоит убрать constexpr, пойдут ошибки компиляции.
Хотя функция-то и так и так возвращает значение во время компиляции. Непонятно, зачем еще от пользователя какие-то словечки. Но факт остается фактом, так это работает.
Sigmentation fault
Значение оператора sizeof() для указателя на функцию? Как и для любого другого указателя.
Соответственно, его инкремент даст тебе на современных домашних машинах вторые 8 байт, считая от нулевого байта функции. Скорее всего они будут указывать в случайные код / данные функции, но если функция ну очень короткая то хызы, тогда они могут указывать бог знает куда.
Это копия, сохраненная 16 сентября 2018 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.