Это копия, сохраненная 4 мая 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Сообщество rust, где полторы интерпрайз-калеки, сделали в разы больше, чем орава долбоебов, которая боготворит швятой сипляспляс и в 2019 не смогли даже отказаться от хедеров или запилить нормальную систему сборки. один гугл хоть как-то скрашивает это болото шлангом и базелом
6 месяцев назад я поднял вопрос внедрения bazel в большом двадцатилетнем проекте на плюсах, над которым работает 120 человек. Полная пересборка проекта длится 110 минут в одной кофигурации, пересборка после мержа с апстримом - минут 30.
Провел презентацию, сделал тестовый проект с бенчмарками, где dramatically ускорялась компиляция. В общем, показал с пруфами, что BAZEL - КРУТО.
Что вы думаете? Менеджер сказал - нахуй надо, нам и так норм. Орава сеньеров-помидоров-титулованных-плюсовиков сказала "нуууу это. Круто, конечно, но наш проект НЕРЕАЛНА портировать, столько кода же. 20 лет пилим бля!".
Ну ок, похуй, пляшем. Два месяца в личное время портировал проект и 100500 библиотек на bazel + еще под clang скомпилил.
Полная сборка сократилась со 110 минут до 5 минут. Типичная сборка после обновления до апстрима сократилась с 30 минут до 2 минут.
Поцики на линуксе заценили, теперь живут и радуются. На винде дебики только сказали "хм, ну интересно, наверное. А как на винде сделоть?". Я их отослал в документацию, так эти ебланы до сих пор не сделали. На винде сидит 2/3 всех разработчиков
Запустили продукт с санитайзерами - больше 10к ошибок. Теперь фиксят понемногу.
Про швятую студию - тоже охуительные истории. В 2k19 студия работает в 32bit бинаре. Лолчто блядь. Глючит ровно так же, как и vs2010, чтобы ни говорили фанбои. Я лично проверял. Средства рефакторинга? Ну есть вроде, но не работают нормально. Каждый первый плюсовик ставит помидорку или решарпер на студию, позорище блядь.
Когда говоришь про CLion - сразу "ну мне и так норм, лень менять". Потом сидишь рядом с этим "и так норм", дебажишь в паре очередной рандом в многопотоке с никакой навигацией по коду и радуешься тому, как все свистит, пердит и виснет.
Еще почему-то любят писать свои собственные библиотеки на каждый чих. Даже если на гитхабе уже есть. Не все так делают, но это довольно характерно для плюсовиков.
В типичном проекте на плюсах вероятность 90%, что ты встретишь 4-5 разных классов для строк, свою либу сериализации, rpc, кодогенерацию, in-memory fs и набор хитровыебанных примитивов синхронизации на пару с пулами потоков. А еще будут свои итераторы и стримы данных, потому что std::*stream - это ебанное убожество. Кроме этого будет кастомный пердолинг вокруг системы сборки и невоспроизводимые билды.
Трустори. Все это встречал на трех конторах в трех разных больших продуктах. И везде был один типикал C++-контингент. Дважды даже встречал самописный map-reduce на итераторах (аналог java streams), лол.
Так что, анон, брось дрочить на плюсы, переходи на что-нибудь статически-строго-типизированное и функциональное, с нормальным тулингом и сообществом.
ДИСКАСС
>переходи на что-нибудь статически-строго-типизированное и функциональное, с нормальным тулингом и сообществом.
Борщехлеб маскировался под программиста, но под конец не выдержал.
>переходи на что-нибудь
>но не скажу на что
>ведь знаю, меня обоссут и обосрут лишь за упоминание этого лютого говнища
>и главное, я сам это прекрасно понимаю, но всё равно убежденный говноед, но скрываюсь, чтобы другие этого мне в лицо не сказали
Лол, внезапно двачую. На удивление точная характеристика.
Тебе в любом случае нужен будет стек в каком-то виде. Если с массивом все ок выглядит то лучше так и оставить. Алсо, не совсем ясно что ты подразумеваешь под "загружаю его в массив". Чтобы загрузить дерево в массив его нужно обойти.
Базель это же просто билд-тул. У вас в проекте что, мейкфайлами и симейком не пользовались?
Ты лабу по алгосам что ли делаешь? Дерево (как и любой граф) можно обойти итеративно поиском в ширину или глубину. Если не лень, можешь обратить внимание на Boost Graph Library, не придется писать свой велик.
Плюсоебство - это как православие. Когда протестантизм завещает работать над собой и создавать блага, славя величие Господа, православие требует от последователя искупления греха, посредством непрерывного страдания, как страдал Иисус неся свой крест. Стрелять себе в ногу и нажираясь потом водкой, позерски ноя о тяжестях нищебродской жизни -- что может быть лучше для православного плюсоеба?
Рассмешил нахуй. Было на premake. Фишка bazel в том, что он умеет кешировать результаты сборки. Можно организовать кеш на локальной тачке и тогда сможешь безболезненно переключаться между ветками гита, вообще нихуя не вызывая лишний ребилд.
А еще можно разместить кеш на билд-сервере. Тогда билд сервер собирает каждую ревизию один раз, а разработчики за несколько минут вытягивают объектные файлы без компиляции.
А еще билдсервер можно оформить в виде кластера. Тогда можно юзать не один двухсокетный сервер с ксеонами, а пять. И честно компилить с нуля одну ревизию проекта-монстра за пару минут.
Причем cd ../ работает как положено и возвращает в предыдущую папку
Мало того, что не по теме, так еще и гуглится на раз-два. Нужно аргумент /D приписать в начале вот так:
>cd \D D:/whatever
Жрять, у меня до этого вот абсолютно точно так же открывался диск без аргумента /D, гуглил как только мог, видимо неправильные слова писал, спасибо
Просто пишешь D: и все.
>Полная сборка сократилась со 110 минут до 5 минут.
Они там в один поток собирали? Откуда такая разница?
>Откуда такая разница?
вангую, что самоотверженный вчерашний студентик сравнивал полные ребилд проэкта со своим охуенным билдом через базел со включенным кешем ))
>На винде сидит 2/3 всех разработчиков
Это реально звучит как диагноз (и им по сути и является).
Свою нейронную сеть без сторонних либ. Полезно, интересно и все преподы на защите будут кипятком ссать, я гарантирую это.
Нет, собирали как обычно. Непосредственное время работы компилятора и линкера не уменьшилось.
После перехода на bazel все девелоперские тачки стали выдавать побайтово одинаковые объектные файлы и бинарники на одной ревизии.
Т.е. стало возможным кешировать и шарить все результаты сборки между разработчиками.
CI-билдер при сборке каждой ревизии стал писать в этот кеш результаты, а все девелоперы стали тянуть объектные файлы по сети.
Как результат: обновление до новой ревизии происходит за пару минут, переход между ветками тоже перестал требовать пересборки всего говна.
Еще стало возможным собрать свою изменения на билдере значительно быстрее, чем на локальной тачке. Но это не очень удобно.
На момент моего увольнения коллега внедрял bazel remote execution, чтобы можно собирать свои изменения на кластере прямо с рабочей тачки, но результат я застать не успел.
>>65554
Да)) В этом как раз вся суть - уже 3 года bazel лежит на гитхабе, бери и внедряй. А 120 долбоебов даже не почесались, чтобы перестать страдать.
>Т.е. стало возможным кешировать и шарить все результаты сборки между разработчиками.
"Полный ребилд" - это когда все файлы проекта компилируются заново, без кэширования.
Покажите на примере функции ввода вывода массива в/из файла.
Конкретная задача: есть структура, которой я успешно заполняю массив (сериализация тип). Нужно заполнить файл этим массивом(А) в бинарном виде, после чего вывести эту бинарную кашу в другой массив(В). Массивы по итогу должны быть идентичны, но у меня получается ересь. Есть предположение, что весь файл записывается в первый элемент массива(не уверен в этом)
Код скинуть не могу, слишком большой, да и прошу я примеры работы конкретно с бинарными файлами
>>65611
Сборка проекта с нуля, когда ты только склонировал проект, занимает 5 минут вместо почти двух часов. Тебе-то что от того, что оно не пересобирает его у тебя на компьютере? Оно либо собирает его на кластере, либо берез из общего кеша, если ревизию собрали ранее. Тебя ебать не должно, ты можешь ПРОСТО начать работать.
Это вопрос терминологии, не понимаю, почему ты за это пытаешься зацепиться, суть от этого не меняется.
Судя по твоей боли от сугубо положительного результата, ты - истинный плюсовик.
Надо будет подумоть
>либо берез из общего кеша, если ревизию собрали ранее
Еще раз объясняю "полный ребилд" - это когда весь проект собирается заново, без кеша. То есть все файлы заново перекомпилируются. Твои 5 минут - это не "полный ребилд".
>Это вопрос терминологии
Именно. Вопрос терминологии, которой ты не владеешь.
>Судя по твоей боли от сугубо положительного результата
Боль у меня исключительно от твоего неграмотного пиздежа.
Обычным мейком ты тоже собираешь проект один раз, а потом перекомпилируешь только изменившиеся файлы. Т.е. вся суть твоей хуитки в том, что это сетевой кэш вместо локального.
>полный ребилд
Еще раз объясняю, что можешь хоть сто раз доебаться к слову "ребилд", твоя критика все равно будет выглядить как бессильная злоба.
От вызова команды сборки на только склонированном проекте до продукта, который можно запускать или дебажить, проходит 5 минут вместо двух часов. Называй как хочешь, от этого ничего не поменяется.
И это если говорить только о кеше. Упоминание распределенной сборки на кластере ты старательно не замечаешь. Как это назовешь, гений? Это не полная сборка? А что тогда?
Ты просто типичный плюсовик-дегенерат. Ты ему про уменьшение среднего времени ожидания сборки проекта, а он тебе ВАШ РЕБИЛД НЕ РЕБИЛД.
>>65659
Ага, теперь смени ветку и верни обратно, умник. Посмотрим, как перекомпилятся неизменившиеся файлы с изменившимся таймстампом. Bazel чекает хеш файла, а не таймстамп.
>бессильная злоба
>Ты просто типичный плюсовик-дегенерат
Железобетонные аргументы. Сразу видно настоящего профессионала.
Мне ничего не мешает одновременно приводить аргументы и раскрывать суть твоей личности.
Вот, подкрасил для тебя аргументы желтым, посколько из-за своей толщины тебе трудно их отыскать.
да чувак, успокойся
кеш-база базела, в которой по сути хранятся скомпилированные артефакты по каждой ветке и все такое
это нужно для просто огромных команд и проектов, как раз уровня гугла и майрософт
примерно та же история что и к примеру, с серверами отладочных символов под каждый бинарный артефакт, у майкрософт издревне был такой артефакт
все это экономит время, да
НО требует сопровождения, настройки и прочей поеботы
в конпорациях вообще под это дело выделяют отдельных инженеров
но для средних контор никто не будет тебе выделять на это время
а значит сопровождение всего этого ляжет на плечи обычных гребцов
старички это понимают, вот и не рыпаются
а ты молодое еще видно, говно в жопе бурлит
>а ты молодое еще видно, говно в жопе бурлит
Судя по его стилю общения, скорее всего с ним большинство команды просто контактировать не захотело из-за токсичности. Он выше сам пишет, что 2/3 народа его замечательные инициативы молча проигнорировало. Потому что плюсовики-дегенераты.
2/3 народа у них на винде, так что он сам их нахуй послал, ведь на винде дегенераты.
Кнут так не считает.
ccache - для бумеров, bazel - для зумеров
С точки зрения кеширования концептуально мало чем. Bazel - это интегрированное решение. Там есть кеш(ccache, stashed) + код сервера для кеша, сборка на кластере(incredibuild, distcc) + код сервера, reproducible builds(когда ты явно указываешь все шаги сборки так, что в итоге для сборки продукта тебе нужен только базел и git репозиторий - все остальное скачается само и нужных версий), поддержка нескольких языков - например, вообще без костылей можно компилить клиент на джаве и сервер на плюсах, которые зависят от одного протобафа; можно создавать тестовое окружение, где скомпиленный бинарник прокидывается как ресурс для тест-раннера (да, да, никакой ебли с ручной настройкой тестового окружения).
И все это счастье работает нативно(без msys) на винде.
Это просто более взрослое и продвинутое решение, чем все остальное. С более серьезной командой, которая постоянно пилит новые фичи и устраняет баги.
Занятие в университете. Реализовать класс, добавить поля, в том числе с типом char* в приватную секцию, добавить геттеры и сеттеры для этих полей в публичную секцию, реализовать конструкторы инициализации и копирования, деструкторы. Продемонстрировать следующий функционал:
создание и удаление массива экземпляров класса; использование класса; поиск или сортировку в массиве;использование конструктора копирования,
конструктора инициализации; перегруженного метода.
проблема такая: внутри сортировки вызывается деструктор и он освобождает память не по своему указателю в последнем элементе сортируемого вектора, пробовал создавать экземпляр, копировать его и удалять первый экземпляр- проблем нет, если из деструктора убрать delete - то все норм, но если оставить delete то и в конце программы, отсортированный вектор
не может корректно уничтожить свои элементы.
Смотрел по шагам сортирует все верно все значения корректные но в самом конце сортировки освобождается память по указателю последнего элемента. Обходные пути не интересуют, объясните где у меня ошибка. с меня нихуя
не, эт для меня, я прост проебал пару часов жЫзни на гугление, и не могу сообразить в чем проблема
The type of dereferenced RandomIt must meet the requirements of MoveAssignable and MoveConstructible.
https://en.cppreference.com/w/cpp/algorithm/sort
Не был на собесах два года. Надо кабанчиком пробежаться по STL/boost. Есть какие-либо статьи чтоб по быстрому вспомнить, если все это дело знал наизусть 5 лет назад?
Пробежись по cppreference
>Это просто более взрослое и продвинутое решение, чем все остальное. С более серьезной командой, которая постоянно пилит новые фичи и устраняет баги.
Ты менеджер по продажам, что ли?
Может кто помочь?
На С++ реально написать гифрелейтед с сохранением в .gif?
Эти ресурсы нужны для тренировки алгоритмического мышления, то есть ты учишься грамотно применять известные алгоритмы или выдумывать новые. Для изучания языков программирования они не подходят, а основная их цель -- подготовить тебя к собесам в силиконовые конторы (ну или в яндекс), где спрашивают подобные задачи.
подробнее насчет ошибок?
В стандартном с++ нету средств для графики.
Так что либо ты кочаешь себе подходящую библиотеку, либо куришь алгоритмы вроде https://ru.m.wikipedia.org/wiki/Алгоритм_Брезенхэма и устройство .гиф
>Друзья, покажите, пожалуйста, как это сделать
Возьми Qt, там есть QPainter, у которого богатые средства для рисования. Можно другую чисто графическую либу вроде skia или cairo, но они сложно настраиваются и устанавливаются. Начинающему тяжеловато будет. С библиотекой для gif тоже лучше не париться, а сохранить последовательность картинок, которые потом сконвертировать в гиф imagemagic-ом.
>заполнить пробелы
«Принципы и практика...» не для этого писалась, она энтрилевел. Для заполнения пробелов у него другие книжки.
Читать больно. Сначала скажи, каким алгоритмом пользовался, как на блоки матрицы делил.
https://github.com/mtrebi/matrix-multiplication-threading
я просто этот код переделал:время выполнения убрал
> С библиотекой для gif тоже лучше не париться, а сохранить последовательность картинок, которые потом сконвертировать в гиф imagemagic-ом.
Алсо, чтобы тяжёловесный Qt не ставить, можно заюзать какую-нибудь либу. SDL или SFML например
>SDL или SFML например
Там векторной графики нет. Только спрайты и текст. В SFML немного есть, но хуже QPaintera.
То, что ты знал 5 лет назад, уже не используется, сейчас нужно юзать только новые стандарты с пометкой на улучшение в будущем, заглядывая в черновики будущих стандартов. Иначе говнокод
Говнокод это твои гены.
Неплохо набросил.
>почему
Эта книжка писалась как университетский курс для полных снулей в программировании. Ответы на вопросы почему у него так, а не иначе в Главе 0 + он дает ссылку на свой сайт, где есть более подробные рекомендации к каждой главе + на хабре есть перевод этих рекомендаций.
>работа со строками там так далеко находится?
Базовый ввод/вывод он дает с самого начала, этого достаточно.
Работа со строками сама по себе может быть достаточно муторной и не всем интересна. Типа не хотел демотивировать учеников. Алсо, конкретно в плюсах она еще и основывается на таких средствах языка, которые в двух словах не объяснишь в самом начале.
void RecursiveFunction (Myfuckingclass A,..) {
if (something) {
A.modify() // как-то изменить A
RecursiveFunction(A, ...) }}
MyFuckingClass A;
A.print // изначальное значение
RecursiveFunction(A,...);
A.print // то же значение, будто ничего не произошло
Почему она не меняет класс? Нельзя как-нибудь по ссылке передать?
Че ты несешь.
Класс - это абстрактное описание некой сущности.
Объект - это уже воплощение этой абстракции.
И гляньте чо зелёные натворили, вообще уже ебнулись
https://youtu.be/p5U4NgVGAwg
Я сам когда-то на плюсах нейронку писал - НИГДЕ в интернете нет нормального описания обратной пропагации не то что каких-нибудь backward convolution - а обычного слоя свёртки (с нетривиальными значениями dilation, шага и пэддинга). Только листок бумаги и исходники Caffe тебе в помощь.
Помогите, гугол выдает какую то хуету.
В серьезных книжках формулы все есть. Берешь их и кодишь. Подразумевается, что ты достаточно умен для этого. А если нет, то используй Python + ML фреймфорк на свой вкус.
Forward declaration наверное ищешь.
headerB.h:
struct A;
struct B { A* a; };
headerA.h:
#include "headerB.h"
struct A { B b; };
В книжках и статьях (даже самого ЛеКунна) везде говорится "да там обратная пропагация, оно само всё. Вот простой пример для padding=0, stride=1, dilation=1, а для других сами разберётесь".
Лол, возможно ему вообще нужна обычная композиция или агрегация.
А такое как у тебя лучше сразу разруливать абстрактными интерфейсами, чтобы потом не огрести.
Какая система? В каком смысле "нет в метаданных"? Если венда не сгенерила и в кэше у неё нет thumbnail-а, то можно забрутфорсить.
Берёшь ffmpeg. Демуксишь, декодируешь n-ый кадр. Вот тебе ноготь большого пальца.
Для интереса пишу на с++, почему у меня default random engine все время показывает одно и тоже значение
>default_random_engine randomGenerator(time(0));
>uniform_int_distribution<int> roll(1,6);
Если я например три раза вызову, то остальные будут рандомными, а первое всё равно одним и тем же
Я хуею, я еще себя тупым считаю
Да.
Ты не переживай, я на работе недавно переписывал легаси, написанный на расширении крестов от Borland C++ 2002 года
Не могу понять.
Поясните, можно ли писать в заголовках содержания функций, не только, просто, прототипы.
Если нельзя/не принято, почему? Проясните ситуацию, не хочу тупо разделять функций на 2 файла, где в одном - прототип, а в другом - уже функция.
Потому что деды так делали - и ты так делай.
Серьёзно, если это твой первый ЯП, то лучше сейчас тебе в этом не пытаться разобраться, а просто принять.
И лучше начать изучение с чистого С.
Явно не первый. У C нет классов, поэтому для меня он сосёт, простите меня владельцы C.
А так, выяснил, что можно взять при себе 3 файл (.cpp, но не главный) и туда поставить содержание функций.
Главное не забыть присоединить заголовок к нему.
В расте тоже нет классов, а сосет все равно C++
Не прототипы, а декларации.
Надо для инкапсуляции и для того, чтобы при изменении внутреннего устройства функции не приходилось перекомпилировать все файлы, использующие этот ашник.
Вообще можно, только придется писать перед каждой функцией ключевое слово inline. Почему так и зачем гугли ODR (one definition rule).
Что не так? Не хочешь писать - разделяй на интерфейс и реализацию или хуярь на шаблонах (их нужно писать в заголовочном файле).
важней вопрос: зачем?
Ссылку на пункт стандарта.
Возможно.
перепечатай эту ссылку руками, чтобы симулировать подобие самостоятельной деятельности
cplusplus.com/forum/beginner/30644/
Английский язык в не англоязычных странах используется в основном только в IT и то не всегда, 1C тому пример. А команды на любом языке можно просто выучить.
>используется в основном только
Плюсы тоже применяются в основном только в айти, и то не всегда. У английского намного больше сфер применимости, чем у плюсов, но ты зачем-то решил учить плюсы.
>кидаешь список подходящих функций
>он называет тебя пидором ебаным
больше никогда не буду помогать незнающим английский, они же ущербные, реально.
Зай, лучше про рыночек расскажи мне
Кресты один из самых популярных языков программирования, много где применяется. Его изучение поможет в изучении других Си-подобных языков, в том числе JS. Лучший язык программирования, чтобы начать учиться программировать.
Учиться программировать я уже умею. С указателями бодался, в сокеты долбился, системные вызовы юзал и тд. Речь идет о том, что конкретно задрочить все основные либы и новые стандарты непосредственно для того, чтобы пойти работать джуном.
>>68727
Питухон я знаю и часто использую, мне он нравиться, но на нем в основном вакансии по Data Science и джангам. Как я уже сказал, я и не прочь в принципе, просто хотелось бы поближе к байтикам. Вообще бы в идеале писал бы питоновские модули на си, потом бы их соединял питоном и наворачивал юниттесты. А для Data Science и всяким ML нужно еще перед этим статистику учить, она у нас в шараге была, но сказать, что я ее знаю не могу, хотя еще помню про нормальное распределение и простые задачи.
А ещё круче то, что istream::getline сделал бы то же самое, а код бы выглядел куда короче.
P.S.: открывать файл в одной процедуре, а закрывать в другой - хуйня.
двачую, создаёшь буферную строку, while getline увеличиваешь счётчик и возвращаешь
после таких тредов понимаю, что язык реально сложный, но с кучей полезных инструментов
>Кресты один из самых популярных языков программирования, много где применяется
по количеству ваканский и не скажешь
сижу и плачу, неужели ебаную жабу учить придётся
>Есть тут господа совмещающие программирование в linux с работой с железом?
>Очень хочется получить структурированные знания по тому как вообще происходит написание драйверов под линухом, как это всё вяжется с device tree, что за node module блять и тд. Существует ли такая литература, но не состоящая из кучи отдельных статей в инете, а именно в одном источнике, хотя бы в каких то базовых аспектах?
>И порекомендуйте плес какие-нибудь хорошие книжки по C для написания всё тех же драйверов.
>сижу и плачу, неужели ебаную жабу учить придётся
она проработаннее и технологичнее, чем плюсы. А еще там есть нормальная IDE
мимо-ушел-с-плюсов-на-джаву
>неужели ебаную жабу учить придётся
Жаба удобнее, чтобы 5/8 на дядю пахать. Стабильность и минимум приключений.
Я на программиста учусь, на первом курсе сейчас. Мы по идее это прошли уже, на лабе в понедельник будет задание на C++ с массивами структур, бинарным файловым вводом/выводом и всё это будет через жопуфункции. F yf
Да, второй семестр. Это задание для добора баллов на допуск к пересдаче экзамена по ОАиП.
У 6 нет погрешности в флоат представлении.
Что делать если одна и та же программа компилируется в консоли с ошибкой, а в визуал студии без ошибок? Не выёбываться и учиться пока что только в рамках визуалстудии?
>программа компилируется в консоли с ошибкой
Гуглить код/текст ошибки, не?
>Не выёбываться
Тут нужно чувствовать баланс. Если совсем не выебуваться, то станешь омеганом.
>учиться пока что
Учиться нужно всю жизнь и все рано дураком помрешь
Вот, накодировал.
https://ideone.com/xYdWu6
Кто-нибудь, можете сделать это менее ковнокодисто? Там надо a.b превратить в a, b и сравнить что больше. Код выглядит так слёзотворно, потому что по условию задания нельзя было использовать что-то кроме stdio.h, а нельзя было также массивы и циклы, только условия и всё.
И где тут с++¿
Нужно написать программу. Суть в чём, есть структура из переменных типа int, float, char. (её я уж сам заполню). Нужно записать структуру в бинарный файл. Препод творил такое:
--------------------------------------
//объявлял тут структуру А
char Mas[sizeof(A)];
//Сериализация сруктуры А
char ptr = (char)&A;
for (int i=0;i<sizeof(A);i++) Mas=*(ptr+i);
----------------------------------------------------------
Мне нужно сделать примерно то же самое, вот только у меня в структуре есть элементы типа char, и фокус с указателями на тип, я так понимаю, не прокатит.
Запись массива в бинарный файл я сам смогу оформить, а вот как мне массив заполнить этой структурой я толком не понимаю. памагити
>Препод творил такое
>вот как мне
>я толком не понимаю
Спросить у препода, даун.
Ты, блядь, чего ради бабло за обучение отдаешь, мудило?
Нормальный препод будет только рад объяснить даже внеурочное время.
А если нет, то это твоя задача, чтобы таких пидоров среди преподов не встречалось.
ну зачем оскорблять то сразу.
Препод сказал искать инфу в инете, и я с ним согласен, инфу нужно учиться искать самому, программирование это вам не русский язык.
Бабло за обучение я не отдаю. Препода вовлекать в этот вопрос не хочу
> сам смогу оформить, а вот как мне массив заполнить этой структурой я тол
Схуяли оно работать не будет? Обрати внимание что у тебя там указатели не на тип, а на чар. Та хуйня со всем работать будет (пока отсутвие стандартизированого ABI тебе хуйцом по губам не проведет). Естественно если у тебя в структуре указатели на что-то (в том числе виртуальные функции) то ты соснешь.
спасибо, буду пробовать, мб я не прав. С указателями туплю как обычно
Ебать я дебил, от баттхёрта тредом промахнулся.
Ifstream file("file.txt");
file >> reinterpret_cast<char>(%переменная твоей структуры%);
В памяти члены простых типов структуры пишутся последовательно(читай: структура с вектором, например, внутри уже так не должна привестись к массиву чаров) - берешь и пишешь ее как массив чаров в файл.
Хочешь писать сразу структуру - перегрузи оператор >>.
Наоборот тоже верно - можешь считать с файла данные в преобразованную к char структуру. Но это уже придется делать через метод read, а не через <<.
Посмотри методички работы винапи с изображениями - точно увидишь там такое.
Блядб, звёздочки.
>Сиддхартха Рао
Ну у тебя кароч откроется сахасрара и вишуддха, лингам вырастет на 2-3 см.
Ты издеваешься? В этой книженции в три раза меньше страниц чем в стандарте на кресты, а предполагается что она тебе еще что то доступным языком должна объяснять.
Спасибо большое
Анон, сколько приблизительно времени придется потратить для изучения основ С++ (включая поверхностное изучение стандартных и популярных библиотек), дабы его знание можно было без страха добавлять в резюме как второстепенный язык?
У меня 3 года опыта Си, и вообще я всегда на хую вертел этот с++, но буржуи в своих вакансиях почему-то постоянно его требуют. Хуй знает, где они там хотят в эмбеддед его использовать может гуй ко всякому говну будут заставлять писать, но этот пробел в знаниях меня напрягает.
Месяцев шесть в проде, чтобы освоиться с дефолтными либами и новыми фичами языка. Но лучше потратить это время на java/scala/rust, потому что и приятнее, и зп больше. На джаве/скале бигдата HFT, на расте блокчейн и перекатываются из HFT, а так же прочие нуждающиеся в железобетонной стабильности/секьюрности.
Пишите на раст, сучки!
ну, щас типа тред что кресты в ембенд лезут
те не тупо новые компиляторы использовать, те приплюснутый си, а по новому кодить
типа отказываться от макросов, заменяя кодогенерацией на шаблонах и метапрограммированием и все такое
даже stl пытаются начать пользовать, тк уже реально писать работающие аллокаторы на новых стандартов, до этого они были по сути нерабочие
типа новая мув семантика позволит не проседать в производительности, но повышать уровень абстракции
и все такое
и прочее
но все упирается в тупость ембед кодеров, тк там хуевые зарплаты и надо дохуя знать в предметке, в электронике, на изучение языка времени не остается
вообще эмбед это чаще всего спагетти дрисня на макросах, write-only код
Как в VS поменять ТОЛЬКО фоновый цвет редактора? Не тему, не полностью загружать цветовую настройку, а только цвет фона? Где блядь эта ебучая настройка? Уже по списку прокрутил просто все настройки цветов, просматривая любое совпадение по фону, и все равно нихуя не нашел.
Если почитстить билд или сделать ребилд и потом запустить дебаг все изменения срабатывают.
В решении несколько файлов.
Как это пофиксить, чтоб не надо было каждый раз чистить билд и хватало бы просто начать дебаг ну или хотябы просто чтоб билд обновлял код.
Только только вкатился в с++, юзаю вижуал студио.
Этож VS Code, но ладно я посмотрю наверное то же самое и для студии, спасибо
Собственно где-то так я себе это и представлял, спасибо
>>69383
>ну, щас типа тред что кресты в ембенд лезут
Хм, а есть примеры чего-то серьезного, где с++ используют больше, нежели как си с классами?
Я, наверное, только AOSP могу вспомнить, в котором и шаблоны, и куча всякого специфического плюсового говна используется по назначению, дабы сделать код максимально портабельным и простым. Но ондроед - это такой себе пример эмбеддед, да и все-равно они там кучу кастомных ужасных генераторов навасянили (например, https://source.android.com/devices/architecture/hidl).
Вообще в эмбеддед зачастую нет таких задач, где бы это мета-говно помогло, а не навредило. А в тех, где оно действительно нужно, васянятся свои несложные генераторы.
>там хуевые зарплаты
Ничем не хуевее остальных. Отрасль же большая, если не учитывать кузьмичей на заводе, то зарплаты очень даже на уровне по крайней мере я доволен
про "дебил на месте" написал другой мимоанон (я) единственно в замечание забавного подтверждения догадки "это ты тот дебил из Си треда?" боевым призывом "раст, сучки" обращенным к треду (ОП)
Растонаркоман, уходи
Визула Студия хочет моей смерти, не иначе. Я даже уже тулзу скачал чтобы темы ставить и редактировать и все равно не могу найти в каком параметре редактируется фон редактора, все что угодно, каждый пиксель, цвет значка закрытия вкладки при наведении, но не цвет фона редактируемой вкладки.
У меня похоже баг и у меня реально не меняется цвет фона, еще пара цветов игнорится, так что дело в другом видимо.
по большому счету все это нагородили для обеспечения мув-семантики
Я буквально чуть ли не вручную менял все цвета у которых были указаны Background, видимо проебался и пропустил
в vs есть аддон добавляющий цветовые схемы вообще то
и там много уже популярных схем сделано
пользуйся
Да его-то я как раз и скачал, и вот как раз фон нужно было сменить
есть 2 контейнера
в первом по старинке храняться указатели на объекты, не сами объекты, вставка работает быстро
во втором храняться сами объекты, тогда чтобы вставить новый объект в контейнер, нужно создать объект аж три раза - свободный объект, потом при передаче его в контейнер создасться фактический параметр, а потом уже из фактического параметра создадуют внутренний объект в контейнере
а мув-семантика позволяет всего лишь оптимизировать второй случай - будет не три, а два раза создан объект
и получается что хранить объекты по указателям все равно быстрей с точки зрения вставки
Что почитать посоветуете, учитывая, что с базовым синтаксисом знаком, отличие указателя от ссылки знаю, но в классах и во всем таком после 99 года не шарю совсем?
>отличие указателя от ссылки знаю
кхе, кхе
то что типа ссылка всегда должна быть инициализирована все знают.. это не обсуждается
а ты лучше скажи мне другие отличия..
Я надеюсь, ты сложные типы гоняешь через ссылки? К чему это все? Зачем по твоему конструкторы для move?
>но в классах и во всем таком после 99 года не шарю совсем
С C++03 в кишках классов ничего не поменялось. Добавили наворотов в библиотеки, лямдбы, constexpr, вывод типов, memory model и все. Скоро добавят концепты и модули и по мелочи
и? ты изменил значение по ссылке, а не ссылку.
Да я че ебу? Ну был там способ сделать функцию lvalue возвращая ссылку.
Я потому и спрашиваю книжку, так как не знаю нихуя кроме сишной базы.
кто еще про отличие ссылок от указателей знает
одним словом можно отписаться, чтобы хотя бы знать шо тут не одни студенты, нах
так как все равно если вам нужно действительно быстро вставлять-заполнять какие-то контейнеры, то все равно вам придется хранить в контейнерах указатели на объекты, а не сами объекты
хотя, скорей всего, я чего то не понимаю
так как практики у меня не было уже несколько лет
Классы - синтаксический сахарок. Можно в структурах хранить поинтеры на функции. C++ не нужен.
> если вам нужно действительно быстро вставлять-заполнять какие-то контейнеры, то все равно вам придется хранить в контейнерах указатели на объекты, а не сами объекты
Ты время создания объектов учитываешь в "действительно быстро"? По одному создавать объекты гораздо медленнее, чем выделять память большим куском, как это делают контейнеры. Плюс доступ по указателю почти всегда медленнее, чем по значению.
мы должны не только контейнер обеспечить операциями вставки с поддержкой мув-семантики, но и класс хранимого объекта обеспечить мув-конструктором
тогда магическим образом у нас будет не 3 раза создания объекта, а всего лишь один
тогда все равно нужно по старинке хранить указатели, а не сами объекты в контейнере
не передергивай
одно дело то что язык си позволяет эмулировать ооп, другое дело когда возможности ооп встроены в язык на уровне семантики
Тут всегда есть трейд-офф между скоростью работы и гибкостью в поведении. Что именно ты выбираешь зависит от задачи. Правда, если ты не научными вычислениями, эмбеддедом, хай-лоадом или (софт) риал-таймом занимаешься, то тебе обычно большая скорость и не нужна.
Есть ещё третий вариант, компромисс между этими двумя - хранить tagged union/discriminated union/variant и вручную диспатчить нужный метод.
> tagged union/discriminated union/variant и вручную диспатчить нужный метод.
дык это ж олдскульный сишный подход к обеспечению динамического полиморфизма, не?
и интрузитивные, и для хранения полиморфных объектов, и основанные на вариантах..
Написал бы ты это лучше в растотред
Да я шучу, не обижайтесь так
typedef pair<int,int> arrayofpairs[]
arrayofpairs a[5] // еггог declaration of arrayofpairs as multidimensional array must have bounds...
Но у него есть несколько недостатков.
1)Размер всегда равен размеру самого большого элемента. Нагрузка как на память, так и на кеш.
2) Собственно, падение производительности из-за хождения по указателям в оригинальном случае у тебя переходит в падение производительности из-за постоянной проверки, какой "тип" сейчас обрабатываем. Бранч предиктор / бранч таргет предиктор - не магия. В обоих случаях это решается сортировкой по типу.
Но в 99% случаях это всё на фиг не сдалось, испоьзуй обычный контейнер.
ну дык ты пытаешься задать массив массивов вообще то..
и получается что у тебя первый массив (который в тайпдеф) неполного типа, без границ..
В нейронках важен не язык или фреймворк, а понимание нейронок.
Если ты в них ничего не понимаешь, то сделать что-то нормальное полностью сам ты не сможешь.
Ты бы на Хаскеле такие вещи делал а не в плюсах.
>линзы
Как ты их через плюсовую систему типов собираешься профункторную оптику реализовывать?
>монады
Они хорошо представляются через конструктор типов. В плюсах конечно можно сделать "template <typename> typename M", но так делать не нужно.
>Ты бы на Хаскеле такие вещи делал
Я ж говорю в продакшене
>Как ты их через плюсовую систему типов собираешься
https://www.youtube.com/watch?v=7vyNRD1TRYs
>но так делать не нужно
Расскажи почему. Я еще не определился просто.
Ебать ты говноед, пиши на расте или скале, они как раз функциональные. Нет, буду жрать говно, буду на плюсах.
дык смотри: когда раньше делал метапрограммирование на старом 98 стандарте плюсов, ты вынужден был писать в функциональном стиле: понятия состояния у тебя в компайл тайм в принципе не было, итераций не было, поэтому заменяли это рекурсией, точкой останова в которой была точная специализация шаблона, условных конструкций (кроме оператора ?:) то же не было, поэтому использовали некое подобие паттерн матчинга - частичные специализаций шаблов и плюс принцип sfinae
а, внезапно, с новыми стандартами ты те же самые вещи можешь делать итерактивно, через value based подход
а да, так как состояния не было, то ты вынужден был вместо модификации какой-то сущьности порождать новую
типичный пример - операции со списком типов: добавление, удаление, сортировка и прочее не изменяли по сути существующий список типов, а каждый раз порождали новый
надо удалить элемент - порождаешь новый список но без этого элемента
надо добавить элемент - порождаешь новый список с этим элементом
Я это понимаю, но все-таки ФП это много различных концепций и иногда думается что можно было бы использовать их не только в компайл тайм. Постепенно же идет миграция различных подходов из в ФП в традиционные языки программирования, значит что-то за этим есть) Но вот что народ использует в реальных проектах из того что еще языком не поддерживается, но можно реализовать, пусть и через жопу. Кто использовал линзы, функторы, рэнжи и прочие страшные слова? Есть ли реальный выхлоп?
Они оба мультипарадигменные ащета. Ну и вообще я не пишу на каком-то языке, я решаю задачу. И для решения задачи подбираю лучшие из имеющихся инструментов и стараюсь использовать лучшие из выработанных практик. Так что не бомби там давай.
> И для решения задачи подбираю лучшие из имеющихся инструментов и стараюсь использовать лучшие из выработанных практик
>Функциональный стиль
>C++
Мань, давай ты не будешь строить из себя большого профессионала?
Залетный петушок не палится.
Друг, тебе в вебпараша-тред
>Расскажи почему
Во-первых, потому что не только система типов плюсов не предназначена для такого стиля, но и сам синтаксис. То, что в хаскеле f >>= g, в плюсах будет std::function<M<b>(const &a)> f, std::function... ну ты понел.
Во-вторых, потому шаблоны это... шаблоны. Твой чувак из видео показывал примеры того, что компилятор выводит в случае ошибки? У него бы 40 слайдов бы не хватило.
В-третьих, такие фокусы увеличивают время компиляции на n порядков и ухудшают перформанс в дебаг-сборке, в которой ничего не инлайнится.
В-четвёртых, плюсы всё-таки императивный язык. Если ты хочешь обратится к a.foo, бери и обращайся. Суть линз в их композиции. Нафига она тебе здесь? Ты пишешь энтерпрайзные круды и опердени на плюсах?
Спасибо за ответ. К моему списку аргументов прибавился твой второй пункт. Он, конечно, спорный, ибо высер компилятора и так ад и израиль, уже все свыклись. Но все же не стоит делать его хуже. Остальные аргументы я сам использовал в дебатах. Еще добавлял отсутствие саксес стори с этим ФП. Насчет перфоманса - он проседает и в релизе когда ты напрочь отказываешься мутировать структуры даже там, где это гарантировано валидно. Еще поддерживаемость кода сильно падает. Все-таки это не самые простые концепции, их не каждый студент поймет, а на плюсы и так тяжело искать людей с руками не из жопы. В общем я не вижу причин использовать вещи типа ФП в кровавом энтерпрайзе, но если мне покажут пруф концепт и саксес стори я готов изменить свое мнение и попробовать. За этим и пришел)
ну смотри, самое простое применение функциональных подходов в крестах, это правильное использование stl:
а именно ты же не используешь итерацию и условные операторы для работы с контейнерами, а ты делаешь выборку из элементов контейнера, удовлетворяющих определенным условиям а далее применяешь операцию к выбранным элементам
и то и другое задается функторами, а способов сделать это в крестах предостаточно - от указателей на функции, функторов на класса, до лямбд, причем вокруг этого есть необходимый инструментарий, всякие bind, mem_fun, обобщенные лямбды и прочее и прочее, включая и набор паттернов связаных с функторами на классах
тот же функциональный подход
даже если открыть любую книжку по stl, она будет полна функциональных подходов
так чтож, да
на практике в крестах функциональный подход используют для метапрограммирования тк там не было выбора по сути (до новых стандартов), а метапрограммирование уже используется для кодогенерации и для реализации некоторых паттернов программирования в статическом стиле (в отличие от подхода gof, в котором паттерны в основном реализовывались посредством агрегации и с использованием динамического полиморфизма, те они работали в рантайме по сути, в общем подход во многом был взят из симулы и смоллтолка)
и, второе применение функционального подхода - это правильная работа с stl и с любыми контейнерами и алгоритмами (тот же буст) что сделаны наподобие stl, а не дрисня из for по контейнеру с лапшей из if
Позволяет еним в стринг перевести, получить названеи класса, переменой етк.
NAMEOF(person.address.zip_code) -> "zip_code"
NAMEOF(foo<int, float>()) -> "foo"
auto color = Color::RED;
NAMEOF_ENUM(color) -> "RED"
using T = int;
NAMEOF_TYPE_T(T) -> "int"
>Позволяет еним в стринг перевести, получить названеи класса, переменой етк.
Но только в компайл тайм.
В кюте ты это можешь делать в рантайме, плюс узнавать имена вызывающего тебя метода, класса и т.п.
Если нужна запередльная скорость, то вставки асма чем С получше будет
Хех, а потом у основной ньюфагов боли от утечек памяти, требования дать им сборщики мусора.
Вернее std::vector<std::pair<int,int>> v {5}; там и так все в ноль инициализируется.
Если у него массив не меняет размеры, то вариант анона с std:array предпочтительнее.
Вот это может не прокатить, мол, попытка инициализировать списком инициализации, а 5 - нихуя не пара интов.
Может, в случае со сложным типом внутри нормально компилятор разрулит, но когда я так пытался вектор чаров определить, он не съедал.
А то недавно я например с таким столкнулся: у меня был базовый класс с виртуальными методами, я от него унаследовал ещё один, переопределил там нужные методы и потом в статической памяти создал экземпляр этого класса. Всё было в целом хорошо, вот только указатель this(или обращение к какому-то члену, забыл уже) иногда давал неверное значение.
Какие матрицы? Если ты про 3D-графику, то там, кагбэ, сразу тысячи их, вектор3 на матрицу3x3 множится для каждого условного пикселя. Сразу говорю, я по этой части не Википедия, просто игрался OpenGL (GLSL).
То есть есть список свойств класса, а в вызове функции я указываю только некоторые из них, а другие останутся нетронутыми. Причем в вызове функции могут быть любые свойства класса и любое количество.
Такое вообще возможно реализовать, или это маняфантазии???
Храни свойства объекта в ассоциативном массиве.
На вскидку в голову приходит или цепочка методов аля встроенный дсл, или именованные аргументы как тут https://www.fluentcpp.com/2018/12/14/named-arguments-cpp/ но полностью как ты хочешь не знаю как реализовать.
>есть список свойств класса
Если у тебя действительно есть такой список, то не составит труда запилить отдельный список только тех свойств, которые нужно изменить, пробежаться по такому списку тоже много ума не надо.
Соответственно твоя функция-член должна принимать в качестве параметра такой список.
>свойства класса
type traits что ле? какие - бустовые или с++11? о чем ты там бормочешь вообще?
А хотя не, знаю, в кюте же есть рефлексия. Можно в рантайме получить список пропертей класса и работать с ними.
Можно ссыль на документацию кутя по этой теме плиз?
Я имел в виду переменные, принадлежащие классу.
Не знаю насчет плавать, но насчет танцевать - это реально. Если тянка хорошо двигается в танце, значит у нее хорошая пластичность и мышцы хорошо развиты. Значит и в постели хорошо будет двигаться. Это и к кунам относится кста.
теоретик детектед. Если все хорошо с возбуждаемостью, то в 9 случаях из 10 секс - это долбежка с произвольной скоростью, где развитость мышц до пизды.
Ну я имел в виду, что хорошо танцующая тян не будет бревном, вот что.
Конкретнее опиши проблему
При отладке boost::variant слишком много всяких оберток приходится проходить. В std::variant пишут - поменьше. Надо будет аккуратно перенести.
Доброго дня анончики.
Вопросы у меня есть.
Каким образом узнать скольки ядерный процессор установлен на ПК, на котором запускается программа?
Как распараллелить двухмерный массив?
Как пример того, что я хочу узнать смотрим на картинки. На первой как в случае с одним потоком, на втором как с несколькими, и тут либо часть массива, кратная количеству потоков обрабатывается каждым ядром, либо каждая энная строчка.
Pragma parallel пробовал, не то.
> if (Array「 i 」「 j 」 = 16)
В цпп компиляторы до сих пор не завезли предупреждения для таких случаев?
Всё таки пропустил, смысл в сравнении, а вообще смысл в некой проверки, забыл добавить, что в моим примере речь только об чтении неких данных и сравнении их с чем-то.
>Каким образом узнать скольки ядерный процессор установлен на ПК, на котором запускается программа?
Лучше используй std::thread::hardware_concurrency - это сколько реально ты сможешь заполучить.
А как это работает?
Я правильно понимаю, что перед этим мне необходимо создать некоторое количество потоков? А потом уже запускать массивы в этих потоках?
есть структура с несколькими полями, которая выступает в качестве ключа в map'e. Как из этой map'ы получить значение по одному из полей ключа(который структура)?
*значит удаляет?
Ну короч тебе нужно вычесть оффсет поля внутри структуры из фактического адреса поля и получить базовый адрес структуры-ключа. Я хуй знает как это сделать, но уверен, что так можно. Это же си++.
мимо жаба
Это жи собес. Тут не важно кто как пишет в продакшн, тут главное обоссать петушка и выпиздить его нахуй.
>>71673
Короче хз, наверное не так объяснил. На примере будет нагляднее.
struct A
{
int m_a;
double m_b;
};
map<A, int> mp;
Ключ в данном случае - экземпляр структуры А, получаем значение по ключу - map[obj], или итератор - map.find(obj), где jbj - экземпляр A.
А им хотелось так:
map[obj.m_a];
map[obj.m_b];
Во я дурак, не дочитал
A a1{1,2};
A a1{2,3};
mp.insert({a1, 1});
mp.insert({a2, 2});
mp.find(2); <--- Ничего не найдет, а они хотели чтобы нашло
Короче, такая задача.
> Дан символ C и строки S и S0. После каждого вхождения символа C в строку S вставить строку S0.
Стринг еще не учили, исключительно чар. Как это сделать? Объясните на пальцах как вставить строку в строку согласно условию.
http://www.cplusplus.com/reference/string/string/insert/
Как блядь вообще можно спрашивать такие вопросы? Это же первая строчка в [поисковикнейм] по запросу std string insert
По умолчанию std::map использует оператор < типа ключа для сравнения ключей.
Ты можешь изменить сам оператор < или, что лучше, предоставить мапе новую функцию сравнения.
А разве так вообще можно? Ведь map объявлена так
template<
class Key,
class T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T> >
> class map;
Т.е. при инстанцировании шаблона map<A, int> mp получится Key == A. А при обращении map[obj.m_a] у тебя будет Key == int, что должно по идее вызвать ошибку при компиляции. Возможно нужна какая-то шаблонная магия, но я хз, т.к. сам вкатывальщик.
*Полная лажа
>>71638
Видишь, я тебя совсем не верно понял сначала.
Что-что от тебя хотели?
Чтобы в мапе <класс, что-то ещё> ты мог получить доступ к значению не по ключу, а по его свойству?
Это логически даже слегка странно(но не полностью): если ты, допустим, хранишь в ключе марку автомобиля(одно из полей которой, допустим, менеджер), а в значении - список моделей, то было бы немного странно пытаться отыскать все списки авто, у которых менеджер - радфемка, независимо от марки.
Ну то есть логика в этом есть, но сама концепция ассоциативных массивов слегка не это имеет в виду, как по мне.
Но ты можешь действительно просто перегрузить операцию сравнения для этого класса, в котором будешь только по этому полю смотреть различие. Но тогда тоже не очень - для двух объектов с одинаковым только полем все попадет в один элемент - нехорошо.
Короче, нахуй бы ты их послал с такими предложениями. Вопросы на сообразительность и вопросы на говнокод - разные вещи.
Хотя не полная, надо перегрузить оператор <. Но опять будет ограничение - поиск по одному из полей.
struct A
{
A() = default;
A(const int _a) : m_a(_a) {}
int m_a;
double m_b;
bool operator <(const A& _a) const
{
return _a.m_a < m_a;
}
};
Можно передать в мапу произвольную функцию сравнения без перегрузки оператора самой структуры.
Ну так и случилось, только послали меня )
>Стринг еще не учили
Тут 90% не учили в универах метапрограммирование, лямбды и рвалуе, но все равно их используют, улавливаешь?
>>71845
>>71848
Да мне бы с чарами разобраться сначала, зачем мне использовать то, что я не понимаю? Имелось ввиду именно работа с чарами. Выделение памяти проходили. Вот я не пойму, сколько же мне надо адресов дополнительных сохранять, что б потом из кусочков собирать результирующий массив? Или это совсем не так делается? Я додумался пока только до такой идеи: идем по массиву, натыкаемся на искомый символ, получаем его адрес, в исходный массив копируем фрагмент с 0 по элемент с этим символом, прицепляем следом вставляемую строку, и к этому всему прицепляем кусочек, что начинается с этого символа. Но тут опять же не пойму что делать, если будет еще и второе вхождение символа, и третье и т.д. Я вообще в том направлении мыслю, или всё совсем не так делается?
Мыслишь правильно. Несколько замечаний. Когда ты находишь нужный символ, создавайте новый массив char с размером длине строки до этого символа + длина вставляемой строки + длина строки после этого символа. Дальнейший поиск продолжаешь уже в этом новом массиве с позиции после вставки. Ну, в общих чертах так
>>71853
0. Расчитать длину R. Считаешь кол-во символов С в строке S. Помножаешь на длину S0. Складываешь результат умножения и длину строки S - тебе же надо понять, сколько твоя строка (массив символов) будет после этой операции занимать.
1. Выделяешь новый строковый массив R, в который ты поместишь результат. Желательно забить его '\0'.
2. Заводишь указатель char* p = &R[0];
4. Заводишь цикл, можешь условный (длину на этапе 0 вычислил же), можешь безусловный.
Проверяешь, если S == 'S', то копируешь 'S' и запускаешь второй цикл, который посимвольно копирует S0 в R. Иначе просто копируешь текущий символ в R.
Не забывай посимвольно смещать p2 при каждом скопированном символе.
5. Собственно при прохождении верхнего цикла, у тебя получится результирующая строка. Для красоты можешь сместить указатель S на массив R.
Создаешь третью строку, большую, чтобы на всё хватило, и копируешь в неё куски остальных строк по порядку.
Use libraries, Luke! Ну и "тяжело в учении, легко в бою".
Очень смешно, даунич. Хотя нет, не смешно. У нас тут кресты, а не уроки русской письменности. Внезапно, понятия из бытового языка не соотносятся один к одному с техническими. Уточнять надо, надо вычитать строку (read позицию за ближайший \n кинуть), или речь о редактировании самого файла.
Парни, нашел код вот по этой задаче в интернете.
>> Дан символ C и строки S и S0. После каждого вхождения символа C в строку S вставить строку S0.
char strins (char s, char *s0, char c) {
int slen=strlen(s);
int s0len=strlen(s0);
int i,j;
for (i=0; i<slen; i++) {
if (s==c) {
for (j=slen; j>=i; j--) s[j+s0len]=s[j];
for (j=0; j<s0len; j++) s[i+j]=s0[j];
slen+=s0len; i+=s0len;
}
}
return s;
}
Может кто дать комментарии по шагам, уж сильно отличается это решение, от того, что пытался сделать я. Не совсем понимаю.
>Дан символ C и строки S и S0. После каждого вхождения символа C в строку S вставить строку S0.
S.replace(QString(C),QString(C) + S0);
не благодари.
Да ёптить. Со стрингами не надо мне.
Я вот не пойму куда я записываю тут s[j+s0len]=s[j]; Если j=slen, то я в конце строки, правильно? И куда я попадаю после прибавления длины вставляемой строки? Что это за элемент такой [j+s0len]?
Не компилил, но на вид хуйня какая-то
Ну, на них вся STL построена
>на c++ можно писать безопасно, смартпоинтеры, RAII, статические анализаторы
>95% уязвимостей из-за ошибок при работе с памятью
Гуд (ты же пользуешься стл?), читай книжки и пробуй, компайл тайм.
Когда концепты подвезёшь? Алсо, скажи, чтобы метаклассы не принимали. Не нравится мне всё это направление.
это подключил:
#include <SDL.h>
#include <SDL_opengl.h>
это прописал:
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES
LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog
но все равно на них ругается, что undefined reference to
1к+ страниц пробегать такое себе удовольствие, мне б выжимку страниц на 20.
Создайте программу, заполняющую массив из n элементов случайными целыми числами, находящимися в интервале от -10 до 30. Выведите на экран созданный массив и определите число инверсий. Инверсией называется пара элементов, в которой большее число расположено слева от меньшего
Иди нахуй. Зачем ты поступал в технический вуз на пиздомистра, если можешь такую фигню сделать самостоятельно. Лох.
А может просто сядешь и подумаешь, чем на харкаче клянчить? Задача в два счёта решается.
Лох, ты? Сам понимаешь, ты - лох. Ты будешь лохом всю жизнь. Ты настолько лох, что готов купить лабу на ДВАЧАХ. На дваче. Купить лабу. Ты лох. Ты будешь учиться в своей шараге и даже первачи будут считать тебя лохом. Потом ты напишешь дипломный проект и станешь дипломированным лохом. Придёшь устраиваться на работу программистом, но тебя заставят носить кофе шефу. Потому что ты лох.
ты лох.
смирись с этим.
>чем на харкаче клянчить?
Где блять я клянчу сука? Я 200 рублей предложил за это. Хуле ты проецируешь мразь?
>задача в два счета решается
Ну если такой умный, то напиши за пару минут. На 200 рублей пива себе купишь. Хуле ты такой злой? Ну всякое в жизни бывает. Разные ситуации. Ты например живешь с мамкой и она тебя надзирала лишь бы мой сычина выучился на пограмиста! А у меня другая ситуация в жизни.
>Лох, ты? Сам понимаешь, ты - лох. Ты будешь лохом всю жизнь. Ты настолько лох, что готов купить лабу на ДВАЧАХ. На дваче. Купить лабу. Ты лох. Ты будешь учиться в своей шараге и даже первачи будут считать тебя лохом. Потом ты напишешь дипломный проект и станешь дипломированным лохом. Придёшь устраиваться на работу программистом, но тебя заставят носить кофе
>Ну всякое в жизни бывает
>А у меня другая ситуация в жизни
Ты это специально делаешь?
Нахуй съеби, гнида.
Что? За живое задел?
А что такого собственно? Сам тут покупал лабы и экз по телеграмму с анончиком. Скоро буду защищать диплом. И вообще жизнь в кайф. А ты наверное злой такой сидишь. За ручку держался хоть? Или ты все время на порно с детьми фапаешь, да код свой пишешь, если ты вообще прогер лол, а не балабол.
Тут господа получают 300к в месяц, они за 200р даже в носу не поковыряют. Твоя идея изначально обречена на провал. Лучше одногруппнику пиво поставь за лабу.
#include <iostream>
#include <math.h>
using namespace std;
int inv=0;
//Compiler version g++ 6.3.0 я на этом у тебя другой может вылезет ошибка
int main()
{
int a = rand() % 100 + 1; // рандом на размер масива ищи у гугла c++ rand())
int *mass= new int[a]; // динамический масив лол
for (int i=0;i<a;i++) // заполняем
{
mass = rand() % 10;
}
for (int i=0;i<a-1;i++) // ищем инверсии
{
if (mass > mass[i+1]) inv++;
}
for (int i=0;i<a;i++) // вивыдим масив
{
cout << mass << endl; // уберешь <<endl выведет с строчку
}
cout << "inv " << inv; // выводим инверсии
return 0;
}
#include <iostream>
#include <math.h>
using namespace std;
int inv=0;
//Compiler version g++ 6.3.0 я на этом у тебя другой может вылезет ошибка
int main()
{
int a = rand() % 100 + 1; // рандом на размер масива ищи у гугла c++ rand())
int *mass= new int[a]; // динамический масив лол
for (int i=0;i<a;i++) // заполняем
{
mass = rand() % 10;
}
for (int i=0;i<a-1;i++) // ищем инверсии
{
if (mass > mass[i+1]) inv++;
}
for (int i=0;i<a;i++) // вивыдим масив
{
cout << mass << endl; // уберешь <<endl выведет с строчку
}
cout << "inv " << inv; // выводим инверсии
return 0;
}
Лол \t нада убрать
Спасибо друг. Подумаешь люди жизнью обиженные сверху высераются. Лол, на двачах со школьниками сидят >300к в наносек ага.
Кидай Киви няш.
Все равно целую тебя в пупок. От этого понимаешь, что не все такое агрессивное быдло и школьники здесь остались.
>math.h, а ни одной функции из него не используешь
>Не сбросил генератор случайных чисел
>Вместо вектора используешь интовый массив, который явно не удаляешь, да ещё и размер случайно определяешь, а не принимаешь аргументом функции
>Не выполняешь условие задачи на x in [-10; 30]
>>72133
Учти это, когда будешь переписывать его код.
И не забудь сделать переменную для подсчёта инверсий локальной, вынеси все в отдельную функцию и не проебись с [index], которые потерялись.
#include <iostream>
using namespace std;
int main()
{
int a = rand() % 10 + 1;
int *mass= new int[a];
for (int i=0;i<a;i++)
{
mass = rand() % 40 - 10;
}
int inv=0;
for (int i=0;i<a-1;i++)
{
if (mass > mass[i+1]) inv++;
}
for (int i=0;i<a;i++)
{
cout << mass << endl;
}
cout << "inv " << inv;
delete [] mass;
return 0;
}
>семен
значение знаешь? подсказка: нет, это не когда кто-то за тебя запостил один пост.
>не ракую
как ты не ракуешь? ты же чистый рак
есть файл, в котором в бинарном виде записано n-ое кол-во массивов[52]. Нужно считать файл.
Делаю следующее:
fstream file("file.txt");
size = 0;
file.seekg (0, ios::end);
size = file.tellg();
c = size/2704; // 2704 -- столько весит файл с 1 массивом
file.close();
step = 0;
for(int i = 0;i < c; i++)
{
ifstream f("file.txt", ios::in | ios::binary);
f.seekg(step);
for (int i=0; i<sizeof(A); i++)
{
f >> Array;
}
f.close();
step = step + 52;
}
Вообщемто, в промежутке я десереализую массив, но решил это здесь не показывать, ибо лишнее.
Суть в чем, я правильно использую функциюю
file.seekg(step)
Она перемещает меня в нужную часть файла и оттуда начинается считывание 52 элементов масисва, но что-то работает не так уж точно(
есть файл, в котором в бинарном виде записано n-ое кол-во массивов[52]. Нужно считать файл.
Делаю следующее:
fstream file("file.txt");
size = 0;
file.seekg (0, ios::end);
size = file.tellg();
c = size/2704; // 2704 -- столько весит файл с 1 массивом
file.close();
step = 0;
for(int i = 0;i < c; i++)
{
ifstream f("file.txt", ios::in | ios::binary);
f.seekg(step);
for (int i=0; i<sizeof(A); i++)
{
f >> Array;
}
f.close();
step = step + 52;
}
Вообщемто, в промежутке я десереализую массив, но решил это здесь не показывать, ибо лишнее.
Суть в чем, я правильно использую функциюю
file.seekg(step)
Она перемещает меня в нужную часть файла и оттуда начинается считывание 52 элементов масисва, но что-то работает не так уж точно(
Это понятно, не в этом вопрос был.
Он хранит не значение первого элемента, а указатель на него, который ВНЕЗАПНО и есть указатель на начало массива.
А значение-то где хранится? Там же ведь. &a[0] даёт тот же самый адрес. Как такое может быть, что в одной области памяти хранится одновременно и адрес, и значение?
Адрес хранится в a, по этому адресу находится область памяти, в первой ячейки которой находится некоторое значение, которое ты можешь получить с помощью a[0] или разыменованием.
> &a[0] даёт тот же самый адрес
Почему там должен быть другой адрес?
Выделяю память в блокноте, записываю туда свою функцию, вызываю свою функцию внутри блокнота.
Возможно такое вообще ?
>>72348
То ли вы не понимаете, то ли я.
Вот есть указатель foo, который указывает на переменную bar. Тут всё понятно, foo имеет значение 1776 (что является адресом переменной bar), но сам он находится по адресу 324. Разыменовать foo – значит получить значение ячейки под адресом 1776.
А что с массивом a? Он имеет значение 1776 (что является адресом первого элемента массива), но ведь он и сам находится в этой ячейке! Разыменовать a – значит получить значение ячейки под адресом 1776 – там находится значение 1776! Как в одной и той же ячейке может храниться и адрес, и значение?
Весь массив не находится в одной ячейке памяти. Название массива это указатель на первый элемент как и указатель для обычной переменной, а [] нужен для упрощения работы с массивом.
Вот правильные картинки, массив и переменная указатель.
Подробное описание различий можешь почитать тут:
https://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c
Всё, понял, спасибо.
угу
такое делается различными способами инжекта..
какой щас наиболее популярный с учетом того что нахуевертили в новых операционках, я не знаю, тк отошел от дел
это упрощенное объяснение, и если подходить с точки зрения теории яп, неверное
Мимо g17 яндекс-кун
Уроки сделать не забудь маня.
Половину зарплаты выдают нумыжеяндексом тебе, а тупые мы? Лол.
Ролл. (Правда я новичок и поэтому сразу же после этого последует вопрос)
Известно, что это лишь рекомендация для компилятора, и он может её проигнорировать и не делать функцию inline.
Также известно, что компилятор сам старается оптимизировать код, и делает некоторые функции inline самостоятельно.
Вопрос: нахуя тогда объявлять функции inline?
Ролл
Ну допустим.
https://stackoverflow.com/questions/1759300/when-should-i-write-the-keyword-inline-for-a-function-method
>>72558
Первое, но на Фрунзе. Дальше сам смекнешь :3
Антон?
а я вот не понимаю другого: почему можно взять адрес inline функции? получается, что даже если код фии встраивается в некоторые места, но она все равно создается при этом
и уже поэтому можно брать ее адрес, вызывать по указателю и прочее..
До компиляции никакая функция еще не является встроенной.
Вангую, что компилятор не станет инлайнить, если увидит, что используется адрес функции.
возьми на работу. Мимо виндовый кернельщик 5к зеленых.
На inline функции не распространяется правило одного определения, тоесть у тебя могут быть объявлены две функции с одной и той же сигнатурой, при условии что у них есть модификатор inline. Естественно эти функции должно быть одинаковыми иначе хуйня получится.
Хочется написать что-то полезное, что можно "пощупать", но понимаю, что скилла не хватает.
Напиши чето сложнее и подсматривай
в общем, чутка почитал
встраиваются некоторые вызовы функции, сама то функция создается всегда, поэтому ее и адрес можно взять и вызвать по указателю
причем встраивание может осуществляется как на этапе компиляции, так и на этапе компоновки
а на счет правила odr по видимому происходит так: компоновщик оставляет в машкоде одно определение inline функции, а остальные выкидывает
а для обычных функций он бы заорал что есть несколько определений функции с одной сигнатурой
то тут не разбирался, это типа догадки
интересно, что есть некоторые возможности языка, которые прописаны в стандарте, но оказались непригодными к использованию
например, export шаблонов вместо модели включения: некоторые компиляторы таки их реализуют, но на практике никто их не использует, у саттера же долго и обстоятельно объясняется почему
та же ситуация и со спецификацией исключений: в стандарте есть, но на практике оказалось нехорошей вещью
Допустим, у меня есть клиент с какими то текстовыми полями в интерфейсе. Пусть их будет 5 штук. Я, значится, меняю какие то 2 поля, и нажимаю сохранить, после чего клиент должен обновить данные этих полей на сервере. Но в следующий раз мне например надо будет менять уже не два поля, а три, и это будут уже другие поля. И так далее.
Как обычно эту хуйню реализуют? Ну эту выборочность полей для функции?
То есть, я так понимаю, я должен написать функцию "Сохранить", которая принимает рандомное число аргументов, и потом запаковывает это все в пакеты и отправляет на сервер. А как сделать, чтобы она принимала рандомное число аргументов? И как она должна распознавать, что аргумент 1 - это именно поле Имя, а аргумент 2 - именно Номер телефона, чтобы сервер это тоже знал?
Нахера ебаться?
if (field1.HasChanges())
// Сохранить данные из field1
И так далее...
Другое дело, если ты не знаешь заранее количество полей
Только изучаю cpp. Сейчас познакомился с шаблонами - весело и нравится. Создал свой шаблонизированный класс контейнера Vector и поигрался немного.
Но мне не до конца понятно где оно может пригодиться Если только не пишешь какой-нибудь STL, как я понял - т.к. писать методы и классы работающие с разными типами не так часто нужно, насколько я понимаю, хотя возможно ошибаюсь. Вижу в вакансиях часто мелькает требование знания шаблонов. Но насколько часто они используются в повседневной разработке? И если используются, то в какой сфере - в разработке какого продукта?
>в вакансиях часто мелькает требование знания шаблонов
Здесь наверное все-таки о паттернах идет речь, а не о шаблонах языка с++.
общий подход: когда есть необходимость или возможность перенести часть работы со времени рантайма на компайлтайм
к примеру, в книжке gof шаблоны реализуются через агрегирование чаще всего, работают в рантайме, что чутка замедляет работу тк добавляет уровень ссылочности, но позволяет конфигурироваться динамически во время работы программы
а уже большая часть книги александреску "современное программирование" посвящена по сути как на шаблонах (в компайлтайме) реализовать те же паттерны
ничего не понял? ну и хуй с тобой, лол
ну а для прикладных программистов, если у вас на проэкте агрессивно используется stl и вообще стандартная библиотека плюсов, то у тебя не будет выбора как везде срать шаблонами и обобщенным кодом (если ты только не полная обезьяна использующая stl тупо обходя for'ом контейнеры)
Ок. Спасибо. Понял, но не все. К примеру, про то, что шаблоны можно реализовать в рантайме - не знал. Пожалуй, почитаю потом детальнее.
да, про сериализацию там если есть что, то очень мало, а что посоветуете почитать?
Зависит от того как серализуется инфа. Если ты не занимаешся какой-то хуйней где нужно выдрачивать каждый бит, то сериализоваться будет в пакет в котором инфа будет храниться как список кортежей типа "имя поля" + "значение" (плюс дополнительная служебная инфа). Такой подход обеспечивает гибкость, правда пакеты получаются чуть жирнее. На клиенте там нужно смотреть. Самый простой вариант - передавать мапу где ключ имя поля (или значение енума, скажем), а значение - содержимое поля. Плюс у тебя текстовые поля, тоесть не нада ебаться с дерьмом типа std::variant. Другой вариант - передавать объектом, в котором помечено какие поля обновились. Или вообще всегда отсылать значения всех полей.
Пиздец вопрос. Если ты в коде создаешь объект на основе этого шаблона и при компиляции нет ошибок - то успешно.
как хочеш так сериализуй. предлагаю csv или json, но можешь ебаться в бинарник, если хочешь.
защита лабы требует бинарник, что то такое сделал, но ошибка сегментирования после десериализации, пойду в винду смотреть шо как
не cin а in быстрофиксin
https://en.cppreference.com/w/cpp/string/byte/atoi
Оберни в try/catch std::out_of_range. Нет гарантии, что твой текст только корректно интерпретируемые цифры.
*текст содержит
Спасибо большое, потещу
class test (
int number
string data
func *func
);
> Как запихнуть указатель на функцию в класс? Хочу что-то типа такого:
https://en.cppreference.com/w/cpp/header/functional
Можешь просто запихивать указатели на функции в класс, никто не мешает. Но C++-way это использовать std::function. В них можно лямбды с захватами и другие ништяки использовать.
Не, вопрос не про создание объекта, а про template instantiation.
То есть как проверить, сгенерил компилятор код под специфический тип по шаблону или не сегенерил?
>Пиздец вопрос.
А я чо? Я ничо. Это в книжке вопрос задается. А я не знаю как свои ответы проверить в принципе можно.
>Не, вопрос не про создание объекта, а про template instantiation.
Но у тебя в примере именно про создание экземпляра.
А инстанцирование - это генерация кода под конкретные типы. У тебя 3 типа char, int и double используются. Я не уверен насчет инстанцирования double, так как явно использования нет, только ссылка на него, возможно по причине оптимизации компилятор для него не будет выполнять. Но это пусть уточнять более опытные аноны.
А xml можно?
Работает только для POD (plain old data) - структуры, где все данные запакованы на месте, без указателей (или вложенных структур с такими указателями) на то, под что дополнительно память в куче выделяется.
serialize выписывает все элементы вектора на стрим, который ты сам должен открыть перед вызовом и закрыть после, чтоб ничего больше туда не попало.
deserialize напротив вычитывает все из аналогично предоставленного input стрима вплоть до упора (EOF) и возвращает вектор. Я, правда, кресты учил давно, и хз, как работают template функции, для которых нужная версия не выводится из типов аргументов. Или lvalue в контексте смотрит (ругается, если не используешь возвращаемое значение), или вручную надо <вот это> указывать между именем функции и скобками
>в примере именно про создание экземпляра
Перевод кривой. Созданием экземпляра тут называют именно инстанцирование.
ну мне нужно адаптировать под свою программу, не полностью понимаю что куда заменять на свои переменные и вместо ostream &out что закидывать при вызове функции
и как вызывать vector<T> deserialize, вообщем много вопросов, так как я почти совсем не знаком с функциями и выражениями используемыми здесь, но попробую разобраться. Спасибо за помощь.
пардон, я долбоеб. serialize не обязательно циклом делать, вот пофиксил https://pastebin.com/4202FVLC
не подскажешь что можно почитать по сериализации чтобы понять смысл и применять в боевых условиях, а то если найду рабочее решение скопирую, но смысл если так и останусь дауном.
Сам не читал про это, иначе не стал бы велосипед набрасывать)
По-быстрому из гугла подкинуть мог бы, но как-то не комильфо советовать, не ознакомившись
ну вот T заменить на свою структуру, что на место out и in при вызове ставить? и как вызвать vector<T> deserialize в мейне?
ofstream out("файлназапись", std::ios_base::out);
serialize(out, vec);
out.close();
ifstream in("файлначтение", std::ios_base::in);
vec = deserialize(in);
in.close();
спасибо, сейчас потещу
ну мне сказали в итоге в темплейты не лезть и сделать функцию сериализации одного элемента вектора и так по одному перебрать все, а десериализовать с помощью sizeof по одной структуре считывать и пушбекать в вектор, попробую что то сделать, прост логику понять не мог. Спасибо большое за помощь.
саттер "новые сложные задачи на с++"
>шаблоны можно реализовать в рантайме - не знал
ты путаешь паттерны проектирования (pattern) и шаблоны c++ (template)
Смахивает на проблему проектирования. Вообще лучше параметры тоже сделать в виде унифицированного типа. А дальше каждый из обработчик его по своему интерпретировал.
Так вот, объясните мне, нахуя мне блять 2 файла для одного класса? На-ху-я? Я понимаю зачем это сделано в отцовском си, но здесь эта поебистика зачем?
.lib/.a
из-за правила odr
функции-члены, как и свободные функции, должны иметь одно определение, поэтому ты их размещаешь в .cpp файле, чтобы они были в одной единице трансляции по итогу
за исключением inline функций-членов, которые могут иметь несколько определений (но совпадающих друг с другом), в процессе компоновки линкер выкинет лишние определения
сам же класс может иметь несколько определений, поэтому его размещают в .h файле, далее они распространятся по единицам трансляции в процессе компиляции, но линковщик в процессе трансляции опять же выкинет лишние
ничего не понял? ну и хуй с тобой!
причина 1в1 такая же, как в старом си, гений
например, у тебя есть один хэдер golovka.h и 2 исходника src1.cpp и src2.cpp . Если бы в golovka.h находились не только прототипы, но и реализации функций, например, void funktsyja() {}, то сначала эта функция скомпилировалась бы вместе с src1.cpp, т.к. #include "golovka.h" - это то же самое, что копировать-вставить содерживаемое golovka.h, потом та же функция скомпилировалась бы вместе с src2.cpp, а потом линкер бы охуел, превращая символьные метки funktsyja в адрес этой самой функции в машинном коде, ибо хуй знает, которую брать, линкер ведь не в курсе, что оба .o файла на этапе компиляции брали исходник этой функции из одного и того же места. А сравнение с Java хуйня, потому что .class не запускается на физической машине.
ПыСы
а с функциями, реализованными прямо в определении класса, эта история не происходит, т.к. они инлайнятся, то есть их код, с некоторыми поправками, вставляется прямо туда, где он нужен, стало быть, никаких вызовов, меток, адресов, проблем линкования
Да я даже текст не могу ввести, потому что не запускается. Если закомментить itoa(res, val, 10);, то запускается.
А ты уверен, что вызов не происходит и не генеряется исключение?
Не помню, а со статиками это работает?
>Можно все в одном файле хуярить, если реализация функции прямо внутри класса написана.
это возможно лишь потому что определения функций-членов в таком случае рассматриваются как inline, и компилятор с линковщиком дальше с ними уже разбираются по правилам inline функций
я выше уже писал
встраиваются лишь вызовы функций, сама со функция никуда не пропадает, она так же присутствует в объектном коде
со встраиваемыми функциями просто добавляется возни как компилятору, так и линковщику
насколько я понимаю, компилятор в каждой единице трансляции будет создавать эту функцию, а линковщик потом будет выкидывать лишние определения (но я не силен в том как устроены современные компиляторы, возможно там и по другому уже делают)
а еще, с включенными обычными неагрессивными настройками оптимизации, современные компиляторы вообще то редко делают встраивание inline функций
тут одно дело "все хуярить", а другое дело попытаться как и почему это работает в языке, тогда, конечно, поплаваешь в океане сомнений
а так да, меньше знаешь - быстрее работаешь
не соглашусь, с моими знаниями, вышечкой по специальности и кое-каким опытом работы, я, наверное, все же смог где нибудь работать, если бы не было проблем с головой, к сожалению
само собой, за low-прайс, типа как старые шлюхи - чем старше, тем дешевле
Пиши все в один файл. Можно прямо как в джаве хуярить все в определении класса.
Здарова анончики, у меня есть вопросы.
Что в перспективе будет быстрее, когда речь пойдёт о размерах в миллионы как пример символов в один байт:
Стек или очередь, которая будет заполняться при нахождении алфавитного символа, и когда все символы в файле будут найдеты, через cout будут выведены.
Массив, для которого сначала нужно пройтись по всему файлу, дабы узнать его длину, а во втором проходе по совпадению записывать, далее так же отобразить?
Дополнительный вопрос.
Насколько быстро происходит пересоздание динамического массива с новой длинной? Например, при нахождении нового элемента увеличивать длину на единицу и с этой новой длинной создавать новый массив.
Смотри на свои миллионы. Размер стека явно меньше размера кучи.
>Насколько быстро происходит пересоздание динамического массива с новой длинной?
Присмотрись к Си функции realloc (выделяй тогда при помощи malloc).
Благодарю.
Ещё вопрос тогда. Есть некая строка в файле, считывание которой я сделал вторым способом с массивом. Есть ли мне смысл городить огород с постепенным наращиванием размера некого блока и копированием туда информации?
Я жопой читаю. Ты хочешь использовать STL контейнеры стек или очередь. Возможно стоит посмотреть и vector, у него есть метод reserve, который позволит зарезервировать огромный кусок памяти сразу.
Да, и меня волнует вопрос, насколько списки медленнее чем массивы при выводе информации и произвольном доступе, ведь в списках придётся погулять по указателям. Единственное но, хочу именно добавлять информацию по мере обнаружения и без необходимости вычислять заранее количество этих элементов. По всей видимости мне List надо использовать.
Суть вопроса была в том, что если мне будет нужно считать некий текст из файла, то удобнее использовать List, однако, когда речь идёт о выводе этой информации в консоль или каких-либо действиях на основе неё. Какая скорость работы в таком случае будет? Не может ли оказаться в итоге, что пусть и двойная работа сначала по вычислению размера, а потом по копированию в одномерный массив, затем выведению в туже консоль будет быстрее, хотя по логике медленнее?
Стоит ли мне заморачиваться и делать обработку первым вариантом или же выигрыш никакой даже для больших величин и проще использовать второй?
У list есть накладные расходы по памяти. На 1 твой байт 2 указателя будут (2х4 или 2х8 байт).
Если ты будешь выводить по 1 байту в консоль, то операция вывода будет заметно тормознее твоих проходов по любым STL контейнерам.
Нахуя ты занимаешься оптимизацией этой хуйни? Компилятор сам за тебя это сделает, не еби себе голову.
Алсо, юзай вектор, ему можно заранее выделить сколько-нибудь памяти, потом он по-умному будет ее перераспределять, если не хватит.
В общем, всё за тебя уже придумано, лучше сначала напиши, а потом бенчмарки гоняй (с включенными оптимизациями)
То есть просто использовать for? Понятно.
Касаемо вектора я скорее всего буду его применять когда будет крайняя необходимость, ну или когда на работу устроюсь, хы.
Если он хранит тупо символы, std:stringbuf/wstringbuf будет возможно удобнее. Его сразу в поток вывода стошнить можно.
a > b > c
d > e > f > l
Надо, чтобы у них был общий параметр, которые изменялся бы одновременно. Как это правильно реализуется? Указатель на член другого класс не хочется делать.
>Надо, чтобы у них был общий параметр, которые изменялся бы одновременно.
Ничего не понятно. Что за параметр у класса?
бля, плохое слово, член класса. Допустим bool open. И если в одном он стал 1, то и в другим должен стать 1.
Это реализуется с помощью наследования, не?
Сделай общий базовый класс, а в нём static поле
Создать ещё один, в котором будут a и d
>Надо, чтобы у них был общий параметр, которые изменялся бы одновременно.
зависит от того на какой уровень связанности ты готов пойти - можно делать начиная от того что тупо делать этот параметр глобальной переменной и до упаковки этого параметра в класс конфигурирования, сделанный синглетоном, которым, в свою очередь будут параметризироваться твои иерархии классов (либо статически через шаблоны, либо динамически через агрегирование)
а вообще, конеш, хуева когда изначально иерархии классов проектируются так что должны зависеть от каких-то внешних параметров
сверху какие то хуевые советы, если честно
ну допустим, есть игра с классом инвентарь и классом карта. И на карте есть дверь, которые должны быть открыты, если в инвентаре есть ключ. При этом по сути и дверь и ключ в инвентаре являются последними листиками в свои деревьях классов. Как исправить ситуацию в таком случае? Создать кучу синглтонов ключдверь и протащить их по классам? Или как надо было поступить изначально, проектируя архитектуру?
А сделать у класса инвентарь метод "найти_предмет", который мог бы дернуть класс дверь нельзя?
эээ
дык это ж всегда делается самым наивным способом
у тебя будет функция или метод "открыть дверь", в ней тупо перебирается инвентарь у персонажа, если найден определенный ключ, то дверь открывается (изменяется ее статус на открыто) иначе дверь остается закрытой
обычная дрисня из if, никакого проектирования, лол
это же геймдев
глянь код любого рогалика
>>74326
я думал делается взаимодействие с инвентарем, у подкласса инвентаря изменится значение, и (вот тут проблема) как-то меняется значение у соответствующего подкласса карты, будто бы они связаны (но не через указатели). Ясен хуй, что можно все процедурно сделать, а когда появятся какие-нибудь еще рычаги, еще 50 ifов везде всунуть.
обобщенный на шаблонах что ле? чтобы итераторы отдавал? с минимальными требованиями к типу элемента контейнера, чтобы тупо операция сравнения была и конструктор по умолчанию? с безопасностью исключений? чтобы управление памятью было за контейнер в аллокаторы вынесено? чтобы была поддержка мув-семантики, универсальной инициализации и других фич новых стандартов?
По шаблонам со всякими стандартными методами а ля сортировки, сравнения, поиска, итерации. Фифти-фифти, но без изысков
>сделать у класса инвентарь метод "найти_предмет"
OOP-brain-damaged? Инвентарь не ищет предмет, у него не должно быть такого метода.
>Ясен хуй, что можно все процедурно сделать, а когда появятся какие-нибудь еще рычаги, еще 50 ifов везде всунуть.
Игры не делал, поэтому не знаю стандартных подходов. Вот мой полуночный бред. Смотри, у тебя предвидятся 50 различных взаимодействий вида "предмет в инвентаре - вещь в мире". Игрок взаимодействует с предметом, и если у него есть какой-то предмет, то случается одно (дверь открылась, ключ исчез), а если нет, случается другое (выводится соответствующее сообщение).
Вариант первый, разумный: не мудрить и запилить логику в саму дверь. Плюсы: просто, быстро, код, связанный с дверью, лежит у двери. Минусы: очень статично.
Вариант второй, энтерпрайзный: сделать таблицу вида "тип сущности в инвентаре - тип сущности мира - твои коллбеки с логикой работы". Тогда при взаимодействии ты проходишься по этой таблице (если её реализовать как хеш-таблицу - будет оче быстро), и, если есть строка с нужными типами, сделать нужное действие (убрать ключ и открыть дверь). Плюс в том, что этот вариант динамический и можно больше добавить всяких плюшек. Но кода больше и мороки больше.
Решай, что нужно.
кстати, размер 17 стандарта, а именно 1600 страниц всегда приводит меня в веселое настроение
если учесть что описание языка оберон-2 - ровно 26 страничек, лол
Ну это частая проблема сколько-нибудь долгоживущих инструментов.
В крестах все еще осложняется общей навороченностью и богатой историей частичной совместимости с кодом, написанным на С в 88 году под Хуектрум-х42 с 11-битным байтом. Что требует описания всяких обобщений и частных случаев (неиссякаемый источник UB!), которые еще и разные в разных стандартах.
Да, и еще разная неявная поебень: типа формально (и в стандарте) это Х, но все делают Y (и в стандарте про это нихуя).
Как пример, если правильно помню, в стандарте нигде не было сказано, что функции и области видимости должны работать через стек. Но все здравомыслящие разработчики компиляторов сделали так, и когда вводили лямбды, пришлось обрезать им захваты. И хз, объясняется ли причина этой фичи в новом стандарте, или "просто запомни".
Лол, *.emplace()
VsCode c соответствующим плагином что-то там подсвечивает. То ли инстанциации, то ли еще что. Не пробовал если честно.
Да и инвентарь, который не может предоставить доступ к своему содержимому, странный.
то что нужно, спасибо
Стоит ли для индексов в цикле обязательно использовать unsigned int? Или же проще сделать проверку на отрицательное число и ноль?
В IDE обычно достаточно паршивая поддержка типов. Было бы круто иметь что-то вроде компилятора, но для типов/шаблонов. Что бы можно было дебажить то как разворачиваются шаблоны, смотреть значения переменных, деманглить гигантские конструкции к более читаемым и тд. Может какие плугины к гцц или шлангу есть?
Понял
NetBeans 10 + gdb - вполне себе позволяют лазать по шаблонам, показывают значения переменных внутри, вычисляют выражения налету.
Надо посмотреть. По сравнению с 2015 2017-ая адцкий глюкодром.
Функция sum() шаблонная, если што.
На сколько большим? Какого размера принимаемые параметры? Вероятно суть задачи заставить использовать не POD типы.
>На сколько большим? Какого размера принимаемые параметры? Вероятно суть задачи...
Да фиг его знает, что он хочет этот Липпман.
Вообще тема - шаблоны + было краткое описание type_traits.
>Какого размера принимаемые параметры?
Я бы для себя ограничился самым большим из встроенных, long long пускай будет.
Я правильно понимаю, что никакой встроенный тип для результата не годится?
С остальным уж разберусь самостоятельно.
Она там не приводится, пикрил - все, что есть. Причем тут иллюстрация немного другой темы. Сама задача идет позже.
Единственное, что на ум приходит:
template <typename T1, typename T2, typename RT = uint64_t >
RT sum(T1 x, T2 y)
{
return (RT) x + y;
}
Ну или поебаться с std::confitional для RT.
А нет, я мудак. Надо скастовать первое слагаемое к Ret.
>в стандарте нигде не было сказано, что функции и области видимости должны работать через стек. Но все здравомыслящие разработчики компиляторов сделали так, и когда вводили лямбды, пришлось обрезать им захваты.
Про что несёт?
Беда в том, что видит только то, что находится в той же папке и ниже по дереву каталогов.
Долго, очень.
На этапе парсинга можно выявить грубые ошибки ввода, то есть несоответвие формальным правилам, лишние символы и тд. Парсер - отдельный класс, объект которого создается в фунции Parse, кушает строку и возвращает вектор токенов. Как в таком случае сообщить пользователю об ошибке?
Но ошибка может произойти дальше. Например, юзер может поделить на нуль. Парсер такое не задетектит, это все вскроется уже на слое обработки токенов. Опять же, как оттуда ошибку протащить до уровня консольного ввода-вывода?
Думаю заимплеменить что-то вроде питонового трейсбека, который внутри тапла будет возвращаться из любой свободной функции или метода от уровня ввода до самого дальнего бэка, где происходят вычисления. Нормальная идея? Можете предложить что-то еще? Что почитать на тему?
Возвращай строку NaN или Error
Каких нахуй дисков, ты чо бля полный путь к файлу указываешь?
"../" значит "каталог выше", "../../" значит "два каталога выше" и так далее. Если ты беспокоишься за кроссплатформенность, то, во-первых, иди нахуй, а во-вторых, windows уже давно умеет понимать оба варианта слешей.
>как оттуда ошибку протащить до уровня консольного ввода-вывода?
Используй путь Си с возвратом кода ошибки. Используй путь функциональщины с возвратом ADT мм, монадично в виде своего tagged union или стандартного std::variant.
Ебать ты агрессивный, на ПВП позвать тебя что ли.
Помог только обратный слеш, с точками он меня на системный диск посылает.
Скинь свою хуйню сюда
а дерево бинарное? ну тип если бинарное то изи, если реализовано указателями то берешь указатель и хуяришь while{tmp=tmp->left/right}, если загрузил в массив то тоже заебись все так же ток у тебя вместо указателя i, 1й элемент-корень дерева, 2k+1 - корень левого поддерева, 2(k+1)- правого и так переходишь
При компиляции подключаешь нужные папки с хедерами в опциях компилятору.
хоть тред и утону, запоздалое спасибо, в итоге сделал что-то типа второго варианта.
C++
Кто не ответит - тот слушает рэп
>Вопросы по синтаксису идут на хуй
>Лабы идут на хуй
>"Как мне сделать Х на чистых крестах без библиотек" идут на хуй
>Все идут на хуй
>Хейтер сосет члены на пару со своей мамашей
Это копия, сохраненная 4 мая 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.