Вопросу по синтаксису идут на хуй. Лабы идут на хуй. "Как мне сделать Х на чистых крестах без библиотек" идут на хуй. Все идут на хуй. Хейтер сосет члены на пару со своей мамашей.
>>503281 Ты программист, в тексте программерские термины, которые ты либо знаешь, либо легко вычленяешь глазами (потому что слышал) и резко гуглишь. Нет никаких проблем с терминами при чтении английского. Более того, проблема в терминах у меня исключительно и только в русскоязычных текстах. Русские тексты с переведённой терминологией меня скорее отвлекают, чем учат. Я просто не могу читать что-то по математике или программированию, если оно написано в рамках русской традиции наименования. Переведенные термины, как правило, по облику слов часто совершенно отличаются от того, что ты знаешь или хотя бы слышал. Легче, когда это простые кальки или транскрипции.
>>503286 > Переведенные термины, как правило, по облику слов часто совершенно отличаются от того, что ты знаешь или хотя бы слышал. Легче, когда это простые кальки или транскрипции. Хуй знает что ты там читаешь. Большинство современных текстов зачастую полны англицизмов, которые давно понятны.
>>503289 На русском ничего не читаю практически. Ну открыл линк первый из шапки - именно то, о чем я говорил. Открыл незнакомый раздел, куча переводных терминов, которые я даже могу не узнать, когда начну читать английский референс - подумаю, что учу что-то другое. Наоборот тоже справедливо - читаешь такой, и понимаешь, что речь-то идёт о том, что ты уже знал, просто слова странные какие-то.
Пацаны, поясните за continue и break. Как я понял, на goto наложено табу структурным программированием. А что насчёт этих двух товарищей? Считается ли говнокодом их использование?
>>503359 Почему-то не подумал о трекерах. На рутрекере второе издание только на русском, но зато с сорсами. На кикэссе же есть английская книга без сорцев. Скрафчу из этого одно целое.
>>503364 Структурным программированием наложено табу и на break, и на continue, и на множественные return и на большие вложенности и на небо с Аллахом.
Но так как уже 2015 и те проблемы с которыми боролся дiйкстра более не актуальны, то можно иногда и юзать, когда действительно нельзя адекватно избежать. Но лучше конечно подумать.
>>503364 Хоть твой вопрос относится к pure С, отвчеу. goto использовать можно, если понимаешь что делаешь. break\continue мощнейшие операторы, использую вобще везде. А вот for как раз считаю злом, использую только в виде for(;;) - так норм.
Sooqa, я 500 сообщений ждал нового треда, посчитав зашкваром участвовать в предыдущем из-за ОП-пика. И вот опять, снова эта умелица с её void main() { exit(0); }
Убери это говно отсюда, блядь! Сейчас будешь это вылизывать, блядь!
>>503429 Как хочешь. Если у тебя типовая задача - бегать по массиву, то ок. У меня обычно количество итераций в цикле предскзать нельзя, поэтому - бесконечный цикл, в нем куча логики и условий, какждое из которых может выполнить break\continue\return. Ну или ексепшн выкинуть можно. Да и вобще я к всяким нововведениям скептически отношусь. Чем меньше синтаксических нагромождений в языке, тем больше программмист уделяет внимния алгоритму, вместо поиска наиболее подходящего синтсахара.
>>503434 >У меня обычно количество итераций в цикле предскзать нельзя while () {} / do {} while ();
>поэтому - бесконечный цикл, в нем куча логики и условий, какждое из которых может выполнить break\continue\return Откуда ж вы блядь такие берётесь. Цикл фор чем хорош, что у него есть явно выраженное пост-условие. Никто не обязывает тебя выражать его в виде инкремента счётчика, можешь хоть вызов функции туда повесить. Равно как и первое условие цикла for это что угодно, необязательно определение переменной.
>>503434 >У меня обычно количество итераций в цикле предскзать нельзя, поэтому - бесконечный цикл, в нем куча логики и условий, какждое из которых может выполнить break\continue\return. Ну или ексепшн выкинуть можно. У кого-то проблемы с дизайном и декомпозицией кода?
>>503436 ВЫХОДНОЕ УСЛОВИЕ НЕУДОБНО РАСПОЛЖЕНА, ОБЫЧНО ТРЕБУЕТСЯ ВЫХОД ИЗ СЕРЕДИНЫ ЦИКЛА А НЕ ИЗ НАЧАЛА ИЛИ ИЗ КОНЦА ПРИЧЕМ ПО МЕРЕ РАЗВИТЯ ПРОГРАММЫ ВСЕ МОЖЕТ ПОМЕНЯТСЯ И ПОТОМУ ЛУЧШЕ СРАЗУ НЕ ДУМАЯ НАЧАТЬ С БЕСКОНЕСНОГО ЦЫКЛА
>>503436 Ты читать-то умеешь? Тебе достаточно одно условия на выход из цикла и одного постусловия? Можешь повесить целый вызов функции? Охуеть просто. >У кого-то проблемы с дизайном и декомпозицией кода? Пока не замечал. А что?
>>503522 >основное условие Оперируешь абстрактынми терминами, при этом не привел определнения основного условия и ряда объективных критериев его выбора. У нас за такое сразу нахуй посылают. >чётко отделяемое постусловие цикла Обычно это изменение счетчика\индеркса\итератора. Отлично подходит для перебора массивов и направленных структур данных. И блять, я писал об этом выше. И для этого конструкция for как раз и была введена. Также как сейчас добавляют всякие foreach-и и range-base for-ы и прочее.
>>503939 A() + "hello" + "world". Только так. Ну а далее или оператор приведения типа, или operator+ принимающий сишную строку. Вроде так. Но основное - это A() + "hello" + "world".
>>503939 Нельзя так, если к классу А прибавлять строку то он автоматически преобразует строку в А, но сразу два слагаемых он не преjбразует. Алсо будет же память утекать.
>>503387 Лена хороша как материал для ньюфагов, потому что у нее дохуя маленьких статей, посвященных какой-то одной теме и запиленных на основе прочитанных ею же книг. Да, статьи, где она выражает свое имхо - говно. Да, не стоит воспринимать написанный ею код как что-то хорошее. Да, прочитать литературу из оппоста гораздо лучше и полезнее. Но в качестве сборника кратких выжимок по отдельным темам для чайников я ничего лучше Лены не видел. Такие дела. слоуответ от опа
>>503496 Когда ты создаешь переменную примитивного типа (например, int), ты пишешь int a = 1. Здесь никакого конструктора не нужно, просто создаешь и инициализируешь. В случае сложного класса может быть необходимо выполнить какие-то дополнительные действия (например, зарегистрировать созданный объект в списке всех объектов программы или типа того). Конструктор гарантированно вызывается при создании объекта класса и подходит для обеих целей - в его теле ты можешь проинициализировать члены-данные и выполнить вообще любой код, в частности, вызвать другие методы (например, передать в перечень всех объектов указатель на только что созданного себя) этого и других классов.
>>504049 >ты можешь проинициализировать члены-данные и выполнить вообще любой код А почему нельзя просто реализовать метод, который будет это все делать и вызвать его явным образом.
>>504068 Чтобы не забыть его вызвать, например. Существует куча ситуаций, когда объект создается неявно (например, его возвращает функция), и ты легко можешь забыть, что после вызова такой функции нужно вызывать сразу и твой метод. Да и силы это экономит, вместо того, чтобы писать каждый раз, пишешь один раз. Ну а вообще твой вариант тоже используется, просто довольно редко. Например, некоторые контейнеры (типа std::future) требуют, чтобы объект, который они хранят, можно было создать без инициализации (т.е. чтобы у него был конструктор по умолчанию). И инициализируется все уже после конструирования, отдельным методом.
Раньше писал на java, которая все прощала. Начал писать на крестах. И собственно вопрос: как перестать быдлокодить? Второй вопрос: я путаюсь в большом количестве h и cpp файлов. Можно это как-то распихать по папкам? Наподобие пакетов в java. Пишу в VC И третий вопрос: я пишу небольшую игульку всегда при обучении новому языку так делаю, и память вроде не течет... Использую Visual Leak Detector. Может ли быть так, что он мне пиздит и все на самом деле плохо?
>>504078 >не забыть его вызвать >силы это экономит То есть, это не часть ООП идеологии\парадигмы, необходимая для каких-нибудь абстракций\инкапсуляций, а чтобы не забывать функцию дергать?
>>504079 1. См. оппост: >Учимся не писать говнокод 2. Разумеется. Распихиваешь файлы по папкам. Дальше в свойствах проекта: Свойства конфигурации - C/C++ - Дополнительные каталоги включаемых файлов. Добавляешь туда все папки с .h, а сами файлы включаешь в проект (слева - Заголовочные файлы - Добавить - Существующий элемент). .cpp достаточно просто добавить в проект (как заголовочные, но тыкать в фильтр "Файлы исходного кода"). Все, после этого можно твои заголовки подключать в угловых скобках, типа #include <TvoyaMamka.h>. Исходники сами скомпилируются и скомпонуются. 3. Если ты не используешь голые malloc/free, то точно нет. Если используешь, то хуй знает, но скорее всего тоже нет. Вообще, vld это классная вещь, я бы не волновался, что он может напиздеть. Если таки играет очко, используй RAII вместо прямого выделения памяти и волноваться точно будет не о чем.
>>504088 Неет, это часть идеологии хотя бы потому, что у любого класса будет как минимум один конструктор если ты ничего не написал, то сгенерируется пустой конструктор по умолчанию. При создании объекта должен быть вызван какой-то конструктор, без исключений. Ты можешь написать TvoyaMamka::TvoyaMamka () = delete; и он не сгенерируется, но тогда ты не сможешь создать ни одного объекта класса. На самом деле только поехавший не стал бы использовать конструкторы, даже если бы они не были обязательными, потому что это адски удобно. Ты один раз объясняешь, что делать при создании объекта, и больше не забиваешь этим мозг, воспринимаешь его как обычный примитивный тип, если угодно. И пишешь в духе TvoyaMamka elena_mikhailovna = 90;, а что там у нее будет 90 - рост, вес или все сразу - тебя уже не должно ебать. Инкапсуляция свойств как она есть.
>>504090 >а что там у нее будет 90 - рост, вес или все сразу - тебя уже не должно ебать. Но подожди, если я не буду знать, что означают параметры конструктора, откуда я пойму какими значениями их надо заполнять?
>>503537 >Оперируешь абстрактынми терминами, при этом не привел определнения основного условия и ряда объективных критериев его выбора. У нас за такое сразу нахуй посылают. Зависит от задачи, очевидно.
>Обычно это изменение счетчика\индеркса\итератора. Отлично подходит для перебора массивов и направленных структур данных. Обычно да, но не только, блядь, НО НЕ ТОЛЬКО! У меня, например, постусловием идёт вывод информации в одной из задач.
И, кстати, читаемость кода только повысилась, он ужался и стал компактным.
>>504045 Да её даже в комментах собственные друзья хуесосят. На мой взгляд, стоит начинать с учебников. Не можешь осилить учебники и упражнения из них - сразу иди нахуй. А то начитаются Алёны и потом говнокод вопреки стандарту пишут.
>>504194 >рост, вес или все сразу - тебя уже не должно ебать. Инкапсуляция свойств как она есть. >>504194 >Из документации? То есть ООП, для того, чтобы из исходников было непонятно что по чем, и поэтому надо читать документацию? >>504228 >НО НЕ ТОЛЬКО! У меня, например, постусловием идёт вывод информации в одной из задач. Ну вообще только. Из семантики же следует: (начальное значение;условие прерывания;изменение состояния).
>>504271 Ты, вероятно, будешь удивлён, но даже при очень придирчивых настройках компилятора тебе даже предупреждения не выдаст. Всё компилируется и работает.
>>504271 >То есть ООП, для того, чтобы из исходников было непонятно что по чем, и поэтому надо читать документацию? Че ты все к ООП цепляешься? Ты спросил "А с какими это мне параметрами надо функцию вызвать?" я ответил. Не нравится документация? Читай заголовок, типа class TvoyaMamka(int SkolkoRazEeEbali) {...} Обычно стараются сущностям давать имена, отражающие их суть.
>>504228 >На мой взгляд, стоит начинать с учебников Полностью согласен. Но давным давно, когда я учился на втором курсе ВМК и часто проебывал восхитительные семинары по крестам, а из книжек времени хватало только на Шилдта - вот тогда пару раз мне ее статьи сильно пригодились тому що экономили время. А потом уже я прочитал много умных книжек и ужаснулся, вновь наткнувшись на них. А ньюфагам должно быть полезно, если только они не будут как макаки все копировать.
>>504355 А еще она занимается разработкой игор, имеет личинок и мужа с большим членом. Мечта местного контингента так жить просто, с учетом склонности к байтоебскому мазохизму.
>>504399 >мужа с большим членом У неё муж негр чтоли? По блогу особо не копался. По делу, воспитанные интеллектуало-няши уёбывают отсюда в далёкие края, и там обустраиваются. Я не верю, что на должность кококодера при зарплате 10к$ возьмут пизду ради пизды. На этом тему стоит закрыть, пока опять срачь не начался.
Поясните, чем сишарп лучше крестов? Я в замешательстве - начал читать Страуструпа про С++, а тут мне аноны подказывают что ++ говно и лучше учить шарп или яваскрипт...
>>504089 >Вообще, vld это классная вещь, я бы не волновался Ну ахуеть. Поставил я этот vld, прописал пути, заинклудил, сделал каноническую утечку
int *pointer = NULL; for( int i = 0; i < 10; i++ ) {pointer = new int;} delete [] pointer;
И в окне вывода нихуя. Думаю чет не работает, наверно. Прописал в конфиге у vld вывод в файл. Он мне туда вывел >Visual Leak Detector Version 2.3 installed. >Outputting the report to the debugger and to (путь к проекту)\memory_leak_report.txt >No memory leaks detected. >Visual Leak Detector is now exiting.
>>504467 Выбирай технологию блять исходя из того, какая тебе больше нравится, сколько вакансий в твоём городе по ней. Аноны тут тебе такого нарасказывают, окажется, что вообще нихуя учить не надо
>>504471 Ну хуй знает. Поставил я этот vld, прописал пути, заинклудил, сделал каноническую утечку Visual Leak Detector detected 9 memory leaks (360 bytes). Largest number used: 2160 bytes. Total allocations: 2312 bytes. Visual Leak Detector is now exiting.
>>504492 Ну без использования сторонних библиотек/фреймворков ты нихуя не напишешь, даже для дварффортреса нужно подключать ncurses или как Тоади пердолится с опенгл. Проще всего начать с подбора фрейморка и использовать его язык. А у тебя какие-то странные предубеждения.
>>504503 Я в этом слабо разбираюсь и стою на перепутье, подскажи с чего начать? Как я понял, OpenGL - это такая же библиотека, как и iostream, только более комплексная?
>>504504 Я думал сначала какую-нибудь змейку, тетрис, аркаду, а потом шутан уровня дума или стратегию.
>>504499 Итак, ты можешь взять с++ и какую-нибудь библиотеку, например sfml, и начать велосипедить. Потому что ты не быдла, только школьники используют юнити! А через некоторое время тебя это заебёт и ты станешь использовать юнити. сужу по своему опыту
>>504508 В чем суть юнити? Я всегда думал что это как редактор к варкрафту, только с намного большими возможностями, но всё равно недостаточными? К тому же, я слышал что там можно писать только на С#.
>>504507 Я думаю тебе все равно что использовать. На простых вещах разницы нет. Хоть питон бери. Можешь плюсы попробывать, как анон выше писал ищи книгу "SFML Game Development.pdf" и ебашь по ней. Если обосрешся с подключением sfml ищи что-то проще. Но это уже наверное не плюсы, что-то не вспоминаю ниодной просто подключаемой библиотеки. Раньше тебе можно было бы graphics.h обойтись, но сейчас ее наверное хуй найдешь.
>>504509 >намного большими возможностями, но всё равно недостаточными Сities: Skylines, Kerbal Space Program, Endless Legend, Infactory демиурги, лол, какой это год был-то? это недостаточные возможности?
>>504513 >Но ведь всё пишут что игры и С++... Так говорят только в /gd/. Много ты там игр змейки не в счет на крестах видел? То-то же. >>504513 >Что за кошмар? Оче годный, но не допиленный движок на лиспе. С нуля ты свой всё равно не напишешь, а вот допилить полуготовый может и получится.
>>504517 >>504518 Ладно, так что лучше: sfml и С++ или Unity и шарп? Мне, просто, кажется что если я уйду в юнити, то стану анальным рабом одной программы, а если в 1 вариант, то смогу решить сам что делать. В общем, поясните, программисты!
>>504519 Т.е. изучив sfml, я смогу перейти на опенгл?
>>504520 Для шарпа есть еще monogame. А для крестов не так уж и много игровых движков/библиотек с хорошей документацией. Так что выбор на самом деле невелик. А на OpenGL писать игры не самый лучший вариант, он тебе нужен, если только сам движкописательством хочешь заниматься или интересует программирование графики.
>>504534 И еще, я видел как-то скриншот - какие-то танки в псевдографике, там всё было выделено зелёными линиями, и полигонов было очень мало. Я думаю такую игру просто написать, вот это я бы еще хотел попробовать написать.
>>504534 Понятно. Закатывай губу, бери любой язык высокоуровневый, не кресты. питон пойдет, бери любую библиотечку для работы с графикой и пили змейку, тетрис-хуетрис. Потом что-нибудь посложнее, ещё можешь поковырять готовые 2д-движки.
>>504545 У меня есть навыки работы в пхп/скл (хтмл, цсс), немного яваскрипта (не особо в нём разбирался, но писал простенькие фишечки, типа открыть, закрыть комментарии етц.). И вот уже где-то месяц я мечусь в поисках того что мне нужно - с чего начать. Немного почитал про С++, потом мне сказали что это говно, все не любят этот язык и подвергают жесточайшей критике. Что число программистов и вакансий на этот язык сокращается. Попробовал Питон, но пишут что он слишком простой, и сложные программы (типа игр) на нём не сделать. В общем, сам не знаю что делать.
>>504547 >В общем, сам не знаю что делать. Что-что... вкатываться постепенно. Питон отлично подойдет: быстрее освоишь, не будешь тратить время на малозначимые нюансы, коих в крестах слишком много, => быстрее прийдешь к результату.
>>504555 Но на питоне же никто не пилит игры сложнее змейки? У меня от твоего поста появилось чувство: >быстрее прийдешь к результату Будто под результатом ты имеешь ввиду что я на всё забью и дропну.
>>504547 Проблема не в том, что питон прост, проблема в скорости его работы, поэтому круизис на нем никто не пилит. Ты хочешь работать в геймдеве или хочешь сделать игру? Если первое, тогда кресты. С++ используется в разработке "серьезных" игр из-за скорости и производительности. Но разработка на нем более медленная и сложная из-а особенностей языка. Для проекта в одиночку это весьма важный момент. Я сомневаюсь, что при разработке твоих игр ты столкнешься с проблемами, которые и вынуждают использовать с++ Майнкрафт вон на тормозной джаве написан и норм же. Следует выбирать то, что удобно. Можешь еще в сторону haxe поглядеть я на нем от скуки, используя движок haxeflixel платформер за два дня написал. Самое то для начинающего инди. Правда haxe малопопулярен и никому особенно-то не нужен.
>>504559 Разберешься - сменишь инструмент на более подходящий, если в том будет необходимость. А пока больше вероятность, что ты дропнешь где-то между хелловорлдом на плюсах и змейкой на них же.
>>504568 >>504572 А что такого в плюсах, из-за чего: >разработка на нем более медленная и сложная из-а особенностей языка Просто, вроде ДФ написан на плюсах, а при крепости в 100+ бород тормозит на компе, который Крузис потянет.
>>504584 И медленнее работать? Да. Но для простых игр это не сильно критично. Ну и сильно влияет вопрос кривости рук >ДФ написан на плюсах, а при крепости в 100+ бород тормозит на компе, который Крузис потянет
>>504603 Не понял вопроса. Для питона есть свои библиотеки. Билдинги к сфмл есть к самым различным языкам, но либа эта крестовая и обычно на крестах под нее пишут. >Или лучше С++ Не лучше и не хуже. Я как-то ради лулзов писал игру на go, хотя он нихуя для этого не предназначен. Ты блять, какой-то неуверенный, но ладно, так и быть, я разрешаю тебе выбрать питон. Выбери уже что-нибудь, главное не сиди и не теряй время.
>>504471 Значит, утечки нет. Он же диагностирует их по факту, а не гипотетически возможные по стандарту. Видимо, в твоем случае new выделит им место последовательно, а потом delete [] простит косяк и удалит все. Вот он и не кукарекает. >>504479 Так может у тебя еще утечки есть. Сделай main с утечкой и ничего больше. Ну и энивей для меня, например, его результат бинарный - либо есть утечки, либо нет, а на количество насрать, энивей исправлять же.
>>504574 Потому что писал еблан. Дай школьнику кресты, он там тебе такого понапишет с параллельными массивами и утечками на каждом шаге. Язык это не панацея же, а необходимое условие.
>>504763 >Так, Тоад далеко не школьник, он учёный и имеет какие-то там дипломы за знание математики. Дык, учёный - не крестозадрот. Ему, как и любому другому нормальному человеку, ценящему своё время, легче написать простой и понятный код, чем ебаться с корявостью языка, переусложняя код на каждый чих. А то, что результат получился малоэффективный, - следствие низкоуровневости языка. На ассемблере получилось бы ещё более тормозное говно.
Аноны, есть такой пример: [code]1. template<typename T> void ft(T); 2. template<> void ft<int>(int); 3. void ft(int);[/code] 1 — шаблон, 2 — явная специализация шаблона, 3 — просто функция. К примеру, можно использовать 1 и 2 или 1 и 3, то есть выбор между явной специализацией шаблона и просто функцией. Какие преимущества есть у явной специализации перед простой функцией, помимо того, что шаблон создаётся только тогда, когда нужен, а функция — всегда?
>>504856 В 90% случаев continue/break являются индикатором плохого дизайна. Понятное дело, что если ты там поддерживаешь легаси с функциями длинной по 500 строк, то уже похуй и можно использовать что угодно, как и в случае, если тебе надо быстро-быстро накидать чтобработало и больше никогда его не открывать. В остальных же случаях всякие goto/continue/break, множественные ретёрны, длинющие функции-листинги, глубокие уровни вложенности и т.д. - запах говнокода, который бездумно писали не проведя нормальную объектную/структурную декомпозицию. Есть конечно ебанутые алгоритмы, которые по-другому не запилишь но как правило такие места встречаются редко.
Нужно отдавать себе отчёт в том, что это грубый сontrol flow, который понижает читабельность кода и размывает его консистентность, и стараться пересмотреть написанное каждый раз когда возникает желание их использовать.
>>504880 А ты не путаешь явную специализацию с явным созданием экземпляра шаблона? Иначе я вообще не понимаю смысла в явной специализации. Или это я попутал… >>504862 >Какие преимущества есть у явной специализации перед простой функцией, помимо того, что шаблон создаётся только тогда, когда нужен, а функция — всегда? >шаблон создаётся Правильнее, конечно, экземпляр шаблона.
>>504883 На мой ньюфаньский взгляд читается очень легко. Хотя, наверно, можно вместо if (ProxyObject == null) return; и прочего писать что-то типа if (ProxyObject == null) {...}. То есть вкладывать всю остальную программу в них. Однако я не уверен, что это будет читабельнее.
Прочитал первых 2 пика и начал практиковаться на кодфорсе. Теперь планирую прочитать что-то по стандартной библиотеке. Нашёл 2 последних пика. Что на эту тему лучше прочитать? Например то где пояснят отличи sort и qsort. Что посоветуете?
>>504918 >2 последних пика >по стандартной библиотеке >Прата Читать Прата после Страуструпа — это мощно. У него же идёт введение в язык с нуля. Загляни в оп-пост же.
>>504868 Поясни тогда за случаи: 1. Метод получает параметр, который ему не нравится, и это видно сразу в начале метода например, nullptr. При этом ситуация недостаточно плоха, чтобы кинуть исключение, следует просто ничего не делать. Как по-твоему здесь сделать лучше, чем сразу return? 2. [code = "cpp"] Momma getYourMomma (size_t height, size_t weight) { string request = "method=getMomma&height=" + std::to_string (height) + "&weight=" + std::to_string (weight); for (;;) { auto response = getResponse (request + "&nonce=" + std::to_string (getTime ())); if (response.hui_sosi) continue; return response; } } [/code]
Как в этой ситуации быть с твоей точки зрения? Если невозвращение сервером корректной мамки - это обычное дело, то исключения все замедлят. Вычислить один раз строку запроса и крутить в цикле только сам запрос нельзя из-за параметра nonce. Использовать do-while плохо из-за тот, что while легко спутать с началом нового цикла. Возвращать некорректную мамку наружу и вызывать метод, пока он не отдаст нормальную - плохо, клиент метода не хочет ничего проверять, он хочет получить корректную мамашу. Делать для этого второй метод-прослойку - чрезмерное запутывание кода.
>>504868 >Нужно отдавать себе отчёт в том, что это грубый сontrol flow, который понижает читабельность кода и размывает его консистентность, и стараться пересмотреть написанное каждый раз когда возникает желание их использовать. Очнитесь товарисч инженегр. Двадцать лет мы двигаем «break» в конец цикла и «continue» в начало и у нас всё работает! А если упоротые выскакивания из середины цикла понижают читабельность кода, то только у вас.
>>504926 >Николаи Джоссатис - C++. Стандартная библиотека Случай, братюнь, ты охуел штоле не читать оппост, блядь? Я старался, выбирал самые годные книги, собирал ссылки, чтобы анону искать не нужно было. Читай. Читай оппост до конца, блядь. Не хочу. Хочу жрать говно.
>>504930 [code lang="cpp"] while (true) { continue; //body break; } [/code] >всё работает Я бы даже сказал всегда работает, если вы понимаете, о чем я.
>>504954 Да ты охуел. Если у меня маленький метод, который в десять строчек скачивает мамку, я должен, блядь, генерить обработчик, который в три раза больше займет в VC, да еще и вызываться будет десять раз на один нормальный возврат мамки? Увольте-с, continue здесь меньшее зло.
>>504953 Вот залил. Храниться вечно. Но можно настроить и по другому если надо. http://my-files.ru/cdm4zk my-files.ru/Download/cdm4zk/%d0%94%d0%b6%d0%be%d1%81%d0%b0%d1%82%d1%82%d0%b8%d1%81%20%d0%9d.%d0%9c.%20-%20%d0%a1%d1%82%d0%b0%d0%bd%d0%b4%d0%b0%d1%80%d1%82%d0%bd%d0%b0%d1%8f%20%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d0%be%d1%82%d0%b5%d0%ba%d0%b0%20C%20%20.%20%d0%a1%d0%bf%d1%80%d0%b0%d0%b2%d0%be%d1%87%d0%bd%d0%be%d0%b5%20%d1%80%d1%83%d0%ba%d0%be%d0%b2%d0%be%d0%b4%d1%81%d1%82%d0%b2%d0%be%20-%202014.djvu http://my-files.ru/Download/cdm4zk/Джосаттис Н.М. - Стандартная библиотека C . Справочное руководство - 2014.djvu
>>504862 >Какие преимущества есть у явной специализации перед простой функцией, помимо того, что шаблон создаётся только тогда, когда нужен, а функция — всегда? Ещё одна попытка.
Я новенький новичок ньюфаг, начал поглощать Лафоре, нужен компилятор С++. Пытался искать на сайте мелкомягких - у них всё через жопу. На трекерах нашел Visual Studio 2013 - это оно?
>>504976 У нас есть do {response=getResponse (request + "&nonce=" + std::to_string (getTime ()))} while (!response.hui_sosi), но это нечитаемо же. И масштабируется плохо.
>>504990 Ну короче идешь в comp.lang.c++ и спрашиваешь, файлы тоже где-то там лежат. Компилятор-то Бьерн периодически выкладывает туда. В интернете я как-то видел архив с компилятором, но чего-то не могу найти.
>>505353 >>505361 Хватит очевидную зелень кормить. даже если не зелень, то пусть лучше нахуй пойдет, чем в нашу благородную профессию с такими вопросами
>>505361 >>505353 Поясните, если нажимаю F9, то выскакивает такая табличка, при чем если я нажимаю ДА, она всё равно выскакивает, а если нажимаю НЕТ, то выскакивает окно на 2, т.е. без "Хелло Ворлд!".
>>506206 - На работу! Чисти функцию, блядь! На! Чисти функцию! - Чем, указателями, что ли, я буду? - Чисти функцию! Да садись уже! Садись. Чисти! - Блядь... - Чтобы побочных эффектов не было! - Как я буду на крестах-то чистить? - Чисти! - Покажи мне. - Чисти! <тимлид уходит> - Епты. Блядь... Говно, блядь... Как в нем чистить, еб твою мать... Все ебанулись. Бля... Епта... <пытается передать параметры через константные указатели, в это время тимлид возвращается> - Чисти, чисти, сука. <достает хаскель> Вот как, блядь, нужно чистить,вот,быстро. Быстро. Раз-раз! Чисти, чисти, чисти-чис-чис-чиж-чж-чижь! Чисти! Говно! Чисти! - Бля, у тебя получается классно, давай! - Давай! Работай! - Не буду я в этом писать, блядь! Не буду я! - Пошел нахуй тогда отсюда, пошел! Блядь, ничего не можешь сделать, пошел нахуй, говно!
Форс мондад и прочего говна уже давно протух, но всегда вылезет восторженный школоебок, только что прочитавший про хачкель на лурке, и начинает по-новой делать вбросы про чистоту, еще более жирные, чем его мать-проститутка. За это я и люблю /pr/, здесь никогда ничего не меняется.
Братишки, а кто-нибудь знает, где можно спиздить относительно свежую PVS-Studio? Я нашел только оче старую версию, да и та криво крякнутая и не работает.
>>506546 Мне прельстива его заточенность под студию. Для cppcheck тоже вроде как есть плагин, но он, насколько я понял, нерабочий то ли он ничего не показывает, пока полностью не проверит весь проект, то ли багнутый, но когда тыкаешь запуск, то нихуя не выводится. А standalone-версия у него вроде нормальная, но ее же вечно забываешь запустить, а я хотет, чтобы сразу можно было чекать, при написании кода, а не переключаться хуй знает куда.
>>506206 А если у меня цель функции -- изменить значение по ссылке? Например, потому что я не хочу копировать параметр, чтобы потом изменить его один раз, чтобы потом вернуть его как результат функции, чтобы потом результат функции скопировался в ту переменную, которую я до этого передавал как входной параметр?
void функции -- это вообще лучшее, что придумал Иисус. Потому что они учат работать с ссылками, т.е. void функции -- это нечто, что надругается над данными извне.
А ещё функция может быть предназначена для того, чтобы изменить например два инта и один чар, и что теперь, по каждому чиху Struct лепить?
>>506821 >изменить например два инта и один чар, и что теперь, по каждому чиху Struct лепить? Нет конечно, это же С++ тред. Ты должен спроектировать интерфейс, создать дочерний класс, с кучей конструкторов на все случаи жизни, перегруженными операторами, ну и конечно обернуть все в шаблоны. Только идиот будет от всего этого отказываться - упрощает кодирование, сокращает время разработки и пр. преимущества.
>>506821 Изменяй по указателю. Тогда программист увидит foo(&x) и поймет, что x, скорее всего, меняется. >А ещё функция может быть предназначена для того, чтобы изменить например два инта и один чар, и что теперь, по каждому чиху Struct лепить? Для двух интов и чара ты можешь и std::tuple вернуть, тогда не придется заставлять пользователя создавать int tmp1 там, где ему не надо.
>>506821 1. Преимущественно следует делать через указатели, это верно. 2. Иногда использование ссылок предпочтительнее. В частности, когда в метод метод может не просто изменять аргумент, а портить его, перемещая. Если ты в любом случае готовишь временный prvalue-объект (напрямую или делаешь его с помощью std::move), то использование мутабельной rvalue reference в таком методе предпочтительнее использования указателя, ибо с указателями создание объекта для передачи придется отделять от взятия адреса для передачи в метод. Такой способ использования ссылок-параметров не даст выстрелить себе в ногу, потому что для вызова над ценным объектом энивей придется явно указать std::move для него. 3. Проблема преувеличена даже в случае обычной ссылки. Если метод возвращает void и имеет имя getTvoyaMamka, то вряд ли его используют в надежде, что он ничего не сделает с параметрами. Нужно думать головой, и все будет хорошо.
>>507172 Ну хуй знает. Я как раз сегодня попробовал в перенос проекта на RC, оказалось, что это предрелизное говно кишит багами, блядь. Не может распарсить инициализацию с шаблонами вне конструктора в духе члена TvoyaMamka mamka = Mamkogenerator <TvoyaMamka>::getObject ();. Какие-то охуительные утечки при создании std::thread, причем вообще на стеке. Обоих багов в 13 релизной не было, ну я и вернулся на нее, пока не поздно. Ждем RTM короче.
>>507388 Я с OpenCV знаком только на универском уровне, распознавание монеток и вот это все. Когда начинается байтоебство с возвратом говна через параметры и ФЛАГАМИ | НАСТРОЙКАМИ, мне сразу хочется взять и уебать.
>>507412 Ты для начала тогда глянь, эта хуета в dst, она меняется после фурьеризации, или это просто мусор из-за того, что не инициализировано. Вообще, запусти отладку, залезь поглубже и смотри, что там происходит же.
>>503274 Драсте, выучил я тут, короче, похапе и застрял на том, что для дальнейшей практики нужно покупать ебучий хост. К тому же в вакансиях на фрилансе требуется целая хуева туча каких-то фреймворков и MVC. Решил выучить язык с более доступной средой разработки - кресты. Вроде он котируется, как сложный и вакансии на нем должны быть. Поясните за фриланс на крестах желательно на елансе и прочих зарубежных фирмах. Какое должно быть портфолио и все такое?
>>507421 Фриланс на крестах возможен, но порог вхождения очень высокий. Если ты не способен разобраться в проблемой бесплатного хостинга, то это явно не для тебя.
>>507435 Я могу разобраться с проблемой бесплатного хостинга, но там нет табблицы ИННОБ дб, а платить штуку за три месяца на платном только чтобы ее выдрочить, я не собираюсь. Расскажи подробнее про портфолио и хуйню, которую нужно наклепать, чтобы работать на крестах на фрилансе.
>>507476 Стив Макконнелл - Совершенный код. Там не про детали проектирования и тем более не про синтаксис крестов, а общие рекомендации, как улучшить качество кода, в применении к любому языку.
>>507458 Если для тебя это "и все", то да, и все. Но вообще это если у тебя вопрос стоит о "а фрилансе требуется целая хуева туча каких-то фреймворков и MVC", то это нихуя не и все. Ты документацию на llvm видел?
Анон, можно ли встроенным sort'ом отсортировать многомерный массив по одной из размерностей? (Объяснение моего реквеста уровня /b: есть int m[n][2], m[0] - порядковый номер человека, m[1] - длина его хуя, хочется чтобы после сортировки у человека номером m[n-1][0] был самый большой m[n-1][1](=пинус, кто совсем ДЦП)).
Скажи мне, двач. Есть у нас игровое поле в клеточку. Многослойное. Например, как в цивилизации: первый слой -- вода, второй -- травка и прочая территория, третий -- холмы и горы, четвертый -- дороги и реки, пятый -- леса, города и шахты. Собственно, вопрос: как лучше это все хранить в памяти?
С первым слоем все ясно: он по дефолту есть там, где нет ничего другого. Последние два тоже -- там нужно по-любому хранить все в отдельном векторе, потому что объектов относительно мало и они все сложные. А вот с промежуточными непонятка.
Самая банальная идея -- хранить просто матрицу X на Y. Но это, мягко говоря, растратно во многих случаях. Например, если у нас 70% воды, то 70% матрицы будут занимать пустые указатели. Таким образом, мы проебываемся и по скорости работы, и по памяти.
Помимо прочего, этот способ начинает косячить, когда поле условно бесконечно. Нужно либо строить более сложную систему с чанками, либо расширять и двигать матрицу, что пиздец всему.
>>507885 В цивилизации разве многослойное поле? Там просто матрица с объектами. Бесконечная карта - чанки (то есть те же матрицы), процеурная генерация и хранение диффов между сгенерированным и фактически. Майнкрафт, в общем.
>>507885 Гугли способы представления разреженных массивов. Вкратце: при любом способе хранения, отличном от обычного, скорость доступа будет ухудшена, твоя задача - найти компромисс между скоростью и размером. Например, все ненулевые элементы хранятся в виде красно-черного дерева. Так как оно сбалансированное (оптимальное по глубине), ты будешь быстро (за O (h)) доставать и изменять элементы, удалять медленнее). С матрицей абсолютно то же самое будет, хранишь дерево для каждой строки, например.
А можете пояснить за вектора? Где-то видел, что у них быстрая вставка только в конец массива. Это так? Насколько будут медленнее, например, .insert(a.begin(), 1234) или .insert(a.begin() + 10, 1234) по сравнению с простым .insert(a.end(), 1234)?
>>508523 От размера вектора зависит. Относительно того что всатвка вначало медленее вставки в конец это тестить надо. Вставка в середину однозначно медленее, остальное от реализации зависит. К примеру у яблочного NSArray вродебы хитрожопая реализация с быстрой вставкой и в конец и в начало. В середину естественно медленно - масив же сдвигать надо, от этого никуда не денешся. Быстрая вставка в связные списки - но у них свои недостатки.
Антуан, я хочу в определении класса создать указатель на функцию, который в процессе работы может указывать на разные функции из этого-же класса. Код ниже компилируется но не работает. Что я делаю не так, и реально ли это сделать?
template <typename T> class List { public: List() { T (List<T>::push)() = &List<T>::push_first; }
T (push)(); T push_first() {} T push_other() {} };
>>508579 Если по-простому, то объявляешь указатель как T (List <T>::*ptr) () = &push_first; Но нормальные посоны давно юзают std::function, в твоем случае это будет выглядеть как std::function <T ()> push { std::bind (&push_first, this) }; Тогда решается проблема с тем, от имени какого объекта ее вызывать.
Программисты, как сделать десктопное приложение в стиле metro, например как visual studio, плеер мередиан, офис и т.д. Все что нашел в интернете это как создать metro приложения, а интересует имеено десктоп. Неужели без C# никак
>>508616 > metro > без C# А как ты себе представляешь шарпоговно без собственно шарпа? Можешь попробовать Qt, виджеты умеют в нативные элементы на всех 3-х основных платформах. А на Qml можешь вообще что угодно нарисовать.
Поясните, а Прата из шапки нормальный автор и его книга? Я, вот, читаю, но там используется cin.get(); cin.get(); return 0; Заместо getch_ Это правильно или книга уже устарела?
>>508833 Ты это я, дрочил 5 лет в универе C/C++, в то время когда одногрупники занимались вебом. Теперь у меня нет постоянной работы, а не постоянная это курсачи и лабы
>>508692 Имя типа же. Там в описании шаблонного класса list что-то вроде typedef T value_type. Это сделано, чтобы ты мог узнать тип значения после инстанцирования шаблона, написав list <TvoyaMamka>::value_type. Широко использовалось, когда auto не было, и по-другому тип значения, которое ты хочешь создать, часто было не узнать. Еще применяется в метапрограммировании, например, есть куча служебных структур-шаблонов, в которых ничего нет кроме такого typedef. И ты можешь писать std::is_same <MoyaMamka, TvoyaMamka>::value, и типы сравнятся еще на этапе компиляции, а не с лишними тормозами как при использовании typeid.
>>508749 Поясняю. Автор нормальный, нужно читать самое последнее издание (оно емнип второй половины нулевых). Книги старые, в первых изданиях и не такое встретишь. Далее. Имена с "_" в библиотеках обычно служебные, code style предписывают обычно именовать так приватные члены (с "_" на конце). То, что они доступны - ничего не значит, часто в стандартах ничего про них нет, т.е. интерфейс не гарантируется, и в любой момент разработчик компилятора может что-то поменять внутри так, чтобы не отвалились только нормальные имена. Таким образом, getch_ использовать нежелательно, он просто не предназначен для использования тобой. istream::get () - это ОФФИЦИАЛЬНЫЙ ТМ метод, его использовать можно, но уместность его ограничена. Видишь ли, считывание по одному символу считается дурным тоном из-за того, что тогда резко усложняется возможность автоматической оптимизации ввода автором библиотеки. Ввод работает далеко не последовательно, по факту символы считываются пачками, а ты использованием get() для считывания из файла вставляешь им палки в колеса. Считывание больших кусков по cin >> TvoyaMamka поэтому гораздо предпочтительнее циклов с istream::get (). Но если ты считываешь с экрана именно по одному символу например, у тебя ебанутый текстовый интерфейс (Y/N)?, то можешь делать get (). Хотя все привыкли к ">>" и это все же считается лучшим способом даже для считывания символов по одному, ибо работа не замедляется, писать меньше, а именование универсальное для всех классов operator>> () обычно занимается вводом, а метод можно назвать get (), или getChar (), или zabirayuSimvol (), такое разнообразие отвлекает. И последнее. Использование get () для того, чтобы программа не закрывалась после завершения - это худшее, что ты только вообще мог сделать. Одновременно показывается и то, что ты запускаешь ее мышкой при запуске из консоли весь вывод сохранится и без get (), разумеется, и то, что ты необучаемый и не можешь нагуглить, как узнать о нажатии клавиши без считывания самого символа.
>>508961 Ну так это костыль для самых маленьких же. Тут либо ты используешь нормальную IDE Visual Studio, либо для своих программ делаешь ожидание нажатия клавиши как полагается, без костылей. Но проблема в том, что Прата пишет книгу для нубов, и оба решения неуместны - попросишь нюфага качать IDE или начнешь объяснять на две страницы, как сделать нормально, а он возьмет и ливнет. Поэтому дается быстрое решение для тех, кто не хочет ничего решать. Ты еще не видел мой учебник по ассемблеру, там вообще давалась распечатка библиотеки ввода-вывода, потому что про это объясняется только в конце книги, а работать с примерами как-то надо, лол.
>>508981 >Visual Studio А кодблокс нормальный? Мне понравилось что он не такой громоздкий и не устанавливает гиг дополнительной хуйни. Даже можно портативным сделать.
>>508994 Ну он годен под стандартные задачи, но если честно, студия настолько оставляет позади по удобству все остальные среды, что я готов ей прощать косяки и посерьезнее гига дополнительной хуйни. Визуальный отладчик с деревом потоков и IntelliSense просто божественны, базарю еще захочешь.
>>509091 Я вообще кьютом не пользуюсь. QtCreator я использую только как фронтэнд к gdb - он хорошо работает с cmake-проектами, нативный, а не на java писан. А "текстовый редактор для программирования" - а что еще можно использовать, не IDE же.
Учу кресты. Не до конца понимаю что такое динамическая, стековая, и статическая память. И путаю ссылки и указатели. Что почитать? Может есть хорошие книги в которых этому глава посвящена чтобы не читать целиком? Или статьи? Гугл показал этот http://www.intuit.ru/studies/courses/2193/67/info курс. Вроде не большой, но делали его люди занимающееся рашкообразованием. Может стоит пройти? Там в литературе к курсу смотреть пик вроде ничего конкретно по этой теме нет, но может узнаете хорошие книги в которых затрагивается эта тема и что-то посоветуете.
>>509197 Есть что по этому поводу почитать? Видел статью на хабре, но там только про ввод/вывод на экран. Если не средствами программ, а средствами системы перенаправить вывод в файл, то результат не измениться?
>>509192 В llvm он вообще запрещен: #include <iostream> is Forbidden
The use of #include <iostream> in library files is hereby forbidden, because many common implementations transparently inject a static constructor into every translation unit that includes it.
Note that using the other stream headers (<sstream> for example) is not problematic in this regard — just <iostream>. However, raw_ostream provides various APIs that are better performing for almost every use than std::ostream style APIs.
Note New code should always use raw_ostream for writing, or the llvm::MemoryBuffer API for reading files.
>>509208 Да. Только они там с файлами работают средствами системы, а нужно средствами программы. >>509206 Не достаточно хорошо в этом разбираюсь. >>509205 Нужен GCC без оптимизации и дополнительных библиотек, а там это можно.
Судя по советам скорее всего буду использовать стандартные потоки.
>>509210 Ну смотри потоки в C++ типобезопасны, все проверяют за тебя. Быстрее конечно будут работать си методы, т.к. они всю проверку скинули на плечи разработчика. И вот если ты сам будешь делать сложные проверки, то можешь навелосипедить и будет даже хуже.
>>509213 >типобезопасны Стоп. Какой с этого профит? В задачах все входные данные корректны. Это значит что он лишний раз проверку делает? Что-то такое подозревал, но разве это единственное отличие? И что можно навелосипедить? Прочитать string как int?
>>509214 Профит такой, что если ты записываешь сложные структуры, то создаются виртуальные функции, и тебе не надо самому проверять формат ввода + следит за утечкой памяти. Если у тебя все однородно используй из си
Хз где спросить, спрошу тут. Есть кто на Qt под виндой прогает? Есть ли способы автоматического обновления Qt? А то надоело все ручками делать. Только не говорите иди на линукс
Скажи, как можно реализовать для QGraphicsView (или QGraphicsScene) затемнение по маске? Хочется сделать смену дня и ночи в игруле -- думаю, как бы это реализовать.
Естественно, нужно учитывать и источники освещения, поэтому нужна именно маска, общий способ менять яркость сразу у всей сцены тоже пригодится.
>>503274 Как именно работает ввод с потоков? Скажем, программа получает на вход мегабайт текста. Где этот текст храниться? Могу ли я два раза прочитать одни и те же данные с какого нибудь cin? Простите если нескладно.
>>509174 Тебе нужен какой-то курс по архитектуре ЭВМ в отрыве от крестов. Обычно же учебная программа в вузах строится так: сначала изучают алгоритмы при помощи высокоуровневого языка у нас паскаль, у них питон, в котором не обязательно вообще знать что-то про память и указатели, не говоря уже про статическую/динамическую/автоматическую память. Потом изучают голую архитектуру ЭВМ и разбирают по частям простейшие программы на ассемблере. И именно в этот момент ты узнаешь про адреса, сегменты данных/команд/кучи, как работает стек, как работает вызов функции и вот это все. Затем изучают, как работает ОС и как она взаимодействует с программами. Здесь про процессы, распределение динамической памяти, разделение процессорного времени между программами, обычно на примере чистого си, потому что он достаточно низкоуровневый, но в отличие от ассемблера можно написать большую программу, не надорвавшись. И вот после того, когда ты все это узнал, ты начинаешь учить кресты. Если приступить к крестам сразу как многие пытаются, то ты будешь все время пытаться использовать его как паскаль/питон, стремясь убежать от непонятных низкоуровневых возможностей. И тогда вся суть крестов теряется, а побочные эффекты в виде множества возможностей выстрелить себе в ногу остаются. Так что либо хотя бы пробегись по всему четырехсеместровому курсу, либо учи питон и не дури. Книги: архитектура и ассемблер Пильщикова (короче) или Юрова (длиннее), операционные системы Таненбаума.
>>509192 Наоборот, библиотека ввода-вывода си это говняное медленное легаси. Поэтому при работе с большими данными рекомендуется опускать флаг совместимости iostream с ней, ускорение до 10000 раз. Такие дела.
>>509325 Поток это с точки зрения программы просто файл, который открыт на чтение без произвольного доступа. Соответственно, система имеет право удалить прочитанные символы. Но может и не удалить. Энивей попытки их прочитать второй раз, сдвинув каретку назад это UB.
Твой второй вопрос: ну, например, ты считал их в переменную-строку, теперь символы скопировались в нее и лежат в оперативной памяти. Старые символы в потоке, возможно, удалились. Если ты считал и не схоронил в переменную, то они потеряны.
>>509328 То есть ничего определенного сказать нельзя? Если на входе я получу X байт, и сохраню их в какой нибудь переменной, то нельзя точно сказать, сколько памяти будет есть программа, X или 2X байт, так?
>>509358 Та память, которая, возможно, освободится, не принадлежит программе. Ты не можешь ей управлять, ОС сама очистит ее, если ей понадобится больше места. Так что считай только свои переменные.
У меня есть очень классная идея, которую, возможно, придумали до меня, но она мне кажется мегаклассной. Хочу поделиться. Элегантное решение для синхронизации критическими секциями.
Есть класс КритикалСекшн. У него есть коллекция туплов примерно таких<std::string, size_t count, HANDLE>. Конструктор класса принимает строку. Если нет в коллекции записи с такой строкой, создаёт критическую секцию соответсвтующую, добавляет в коллекцию, на сайз_т делает 1, входит в секцию. Если есть элемент уже, то просто входит в секцию, инкрементируя счётчик. На деструкторе выходит из секции, декрементирует счётчик. Если счётчик == 0, удаляет секцию. Как это охуенно используется? А вот так:
[code] void WINAPI yobaWriter(PVOID args) { //... { auto s = Section("VAJNYY_FAYL"); //... } //... }
void WINAPI yobaReader(PVOID args) { //... { auto s = Section("VAJNII_FAIL"); //... } //... } [/code]
Можно ещё сделать какой-нибудь макрос #define CrSection(x) auto _currentCriticalSection = Section(x); Тогда можно использовать как
>>509374 1. Работа с туплами медленная. 2. Сравнение строк очень медленное. 3. Кому принадлежит коллекция? Классу как статическая? А как же расширяемость? Если понадобится две коллекции для разных задач, придется все перепиливать. очень. очень плохая идея. 4. Доступ к чему ты синхронизируешь? У тебя я вижу только регистрацию количества обработчиков файла, никакой синхронизации нет. Ни обработчик, ни код снаружи твоего класса вообще не узнают, был увеличен счетчик, или создана новая секция. Так что либо я тебя неправильно понял, либо ты сделал какой-то ебаный регистратор, который непонятно зачем считает обработчики и больше ничего не делает. 5. В любом случае синхронизация не обеспечивается. Без атомарных операций, очевидно, методы могут вызваться одновременно, увеличить счетчик один раз вместо двух и вообще хуй знает что натворить. 6. Раз уж ты вынужден использовать примитивы синхронизации, вместо вновь придуманного странного медленного велосипеда не лучше ли использовать возможности языка? Критические секции легко моделируются мьютексами, более того, в большинстве случаев они не нужны, потому что можно разбить задачу на независимые и использовать async/future. 7. Макросы. 8. WinAPI. ??????? FAIL
>>509387 > 1. Работа с туплами медленная. Вместо него можно класс с тремя полями, всё равно. > 2. Сравнение строк очень медленное. Я об этом писал. Можно как-нибудь хешировать, а можно вместо строк делать с указателями, чтобы как в джавке синхронайзд(и тут объект синхронизации). > 3. Кому принадлежит коллекция? Классу как статическая? А как же расширяемость? Если понадобится две коллекции для разных задач, придется все перепиливать. очень. очень плохая идея. Зачем разные? Все секции в одной коллекции. > 4. Доступ к чему ты синхронизируешь? У тебя я вижу только регистрацию количества обработчиков файла, никакой синхронизации нет. Ни обработчик, ни код снаружи твоего класса вообще не узнают, был увеличен счетчик, или создана новая секция. Так что либо я тебя неправильно понял, либо ты сделал какой-то ебаный регистратор, который непонятно зачем считает обработчики и больше ничего не делает. На конструкторе есть же EnterCriticalSection(), на деструкторе - LeaveCriticalSection() > 5. В любом случае синхронизация не обеспечивается. Без атомарных операций, очевидно, методы могут вызваться одновременно, увеличить счетчик один раз вместо двух и вообще хуй знает что натворить. Перед увеличением будет EnterCriticalSection(), а LeaveCriticalSection() после декремента. Таким образом, нельзя будет Поменять значение, не находясь в критической секции, а в ней только 1 поток. Всё норм обеспечивается. > Критические секции легко моделируются мьютексами, Ну да, в POSIXе как раз мутексы вместо секций. Но выразительнее намного будет [code] { Section("COM1"); //.... } [/code]
[code] EnterCriticalSection(p); //... LeaveCriticalSection(p); [/code] С виду разница не большая. Однако будет очень неприятно передавать указатель на секцию в поток через void* и всё такое. А потом ещё как-то отслеживать неиспользуемые секции и удалять их. То же самое с pthread_mutex_lock/unlock, а ведь для них реализация такая же. > 8. WinAPI. И в том и суть, что решение оборачивает WinAPI.
Критическая секция — это режим выполнения, когда программа становится однопоточной и её приоритет повышают на то время, пока она находится в критической секции (гуглить VxWorks и другие ОСРВ).
lock (obj) {} и «новейшая очень классная идея» — это не критическая секция, а семафоры, причём со способностью впадать во взаимную блокировку, догадайтесь как.
>>509400 А, ну тогда за работоспособность этого я не могу сказать тебе, но энивей, на мой взгляд, прикручивать какие-то платформозависимые методы это не особо хорошо. Тем более, что POSIX мьютексы сам не перевариваю это говно с одним методом и кучей флагов на все действия - это уровень 80-х, а у нас тут новый стандарт, знаешь ли. Получается очень выразительно, наподобие std::lock_guard <mutex> guard (lock_) пишешь в конструкторе/начале блока, и пока guard в видимости, ты владеешь секцией. Алсо, такой подход с RAII будет exception-safe из коробки, в отличие от. Не получится забыть выйти из секции в деструкторе и вот это все.
По поводу неиспользуемых секций - ну так это опять велосипед жи. Допустим, ты, возможно, будешь использовать функтор-секцию. Тогда ты делаешь фабрику, когда кто-то дергает получение еще не существующей секции, она генерит функтор, отдает std::shared_ptr на него, а себе схороняет std::weak_ptr. Если у нее дергают получение уже существующей, она пытается отдать shared, сконструированный из weak. Когда пользователи сделают свои дела и счетчик shared станет 0, он удалит секцию автоматически. И все это реализовано наиболее быстрыми путями и thread-safe. Попробуй пересесть со своего велосипеда на мотоцикл короче, лол.
>>509406 Ну не, критические секции тоже являются одним из примитивов синхронизации, наряду с семафорами. В некоторых языках это базовая вещь вместо мьютекса, ты как-то описываешь, что в участок кода может войти только один поток одновременно. Но, понятное дело, критические секции и мьютексы реализуются элементарно друг через друга, поэтому по факту это одни и те же способы что-либо сделать, и проблемы у них одинаковые.
>>509437 Я не хочу писать очередной блокнот или клиент-сервер ибо это тупо, я хочу что-нибудь пооригинальнее (но не знаю что, и даже не могу придумать). Поэтому нихуя не пишу, кроме простеньких, нужных по учебе, программок. Как быть, что написать?
>>509794 Если ты про друзей, то такое часто бывает при определении операторов над классами. Например, ты хочешь сделать TvoyaMamka & opearator+ (const TvoyaMamka &), где первое слагаемое передается неявно как this. Если у тебя определен еще implicit конструктор, например, из int, то будут проблемы, когда ты пытаешься складывать мамок с числами, потому что неявно передаваемый параметр никогда не приводится автоматически. И тогда ты выносишь operator+ за пределы класса, он теперь принимает параметрами обеих мамок и все работает.
Еще часто обработку объектов выносят за пределы самих классов, потому что метод-член видит приватную реализацию, а внешняя функция видит только интерфейс, и инкапсуляция повышается. Другое дело, что обычно для таких целей можно создать класс-обработчик, в котором будут эти методы.
>>509812 Ну так ты определяешь класс в заголовочном файле обычно. Если у него большие методы, то это неудобно читать становится, а так можно вынести каждый метод хоть в отдельный .cpp и все будет заебись. Но главное даже не в этом, а в том, что если ты меняешь реализацию метода без изменения интерфейса (те же параметры, то же возвращаемое значение), то тебе придется перекомпилировать только один файл. А если реализация в заголовочном файле, то перекомпилируются все .cpp, которые его используют. В больших проектах это настолько существенно, что делают дополнительные сущности, чтобы клиент как можно меньше знал о реализации, в.т.ч. и данных, называется pimpl. Делают маленький хедер, в котором объявлен прокси-класс. В нем указатель на настоящий объект и больше нихуя. Пока ты не используешь объект, тебе не нужно ничего знать о реализации, размере и всем таком, если ты хранишь в другом объекте не его самого, а указатель. Это позволяет избежать порчи половины проекты, когда ты добавляешь член в один хедер, который оказывается подключен к куче других.
Товарищи, подскажите, пожалуйста. Что происходит при открытии файла (fstream, например)? Весь объем файла пихается в оперативную память или нет?
Собственно, почему спрашиваю. Поставлена задача: есть N файлов, общим размером ~100мб. В файлах отсортированные номера. Нужно создать один файл со всеми номерами. Разумеется, тоже отсортированный. При этом, нужно уложиться в 50мб оперативки. Я планировал решить это следующим образом: так как номера в файлах отсортированы, просто выдергивать из каждого файла по одному номеру и образовавшуюся коллекцию сравнивать между собой. Ну и выдернутые номера удалять, например. Это хороший подход или я не прав?
>>509972 Файлы не пихаются целиком в память. Читай по одному, сравнивай, записывай. Удалять их из файлов не обязательно, файл будет читаться дальше сам по себе.
1) Допустим, у тебя оперативной памяти было бы не 50мб, а 1 мб. Тогда можно было бы, например, считывать из одного файла порцию данных в буфер и из другого файла порцию данных (в жизни из файла не читаются побитово, а читаются целыми блоками по X килобайт). Далее сливать эти два буфера и записывать их в третий новый файл (данные идут на диск). В итоге у тебя получится отсортированный файл, содержащий данные двух исходных файлов. Повторять так N - 1 раз, в конце получишь один отсортированный файл.
2) Т.к. у тебя 50 метров, а все файлы - 100 метров, то выгоднее сразу все считать 50 метров из файлов в память, отсортировать любым нормальным алгоритмом сортировки, записать в файл и не париться (т.к. работа с диском очень-очень медленная, а работа с памятью невероятно быстрая). Потом повторить тоже самое для оставшейся части файлов (остальные 50 метров). А потом два файла слить через алгоритм из первого пункта.
>>509972 >Весь объем файла пихается в оперативную память или нет? Пихается буфер, зависящий от libc и системы. По-моему в районе 64 кб. Поэтому даже побайтовое чтение не вызывает проблем с производительностью, но и файлы, конечно, целиком не грузятся. >При этом, нужно уложиться в 50мб оперативки. Домашка? Вообще так делается merge sort, именно как ты описал.
>>509989 В первом случае ты считываешь в память, считай, 1 число из одного файла и 1 число из другого файла. Выбираешь наименьшее из чисел, записываешь в выходной файл. Считываешь из соответствующего файла еще одно число. В итоге в памяти у тебя всегда не больше 2х чисел. А файл целиком в память можно не считывать. Вроде так.
>>509992 Если честно, тестовое задание на стажировку. Про файлы рассказывали на первом курсе и я что-то позабыл, как это дело происходит. Да и не требовалось что-то.
>>509993 Да, ты прав, торможу. Почему-то подумал, что буду весь файл совать в буфер. Бывает.
>>509993 В памяти будет размер соответствующих буферов чтения. Поэтому лучше не выебываться и доверить буферизацию ("использование памяти по полной") системе.
>>509972 Это не регламентировано стандартом жи. Библиотека предоставляет тебе некоторую абстракцию файла, который может находиться где угодно. Например, ты открываешь последовательный порт как файл, или удаленный файл на чужой пекарне. В *nix вообще все считается файлами даже небо, даже Аллах. Понятно, что последовательный порт или поток ввода который ВНЕЗАПНО тоже файл нельзя схоронить в оперативную память, потому что неизвестно, что в них будет потом. Но даже если ты оперируешь с "хорошим" файлом с диска, он банально не может влезть в память. Пораскинь мозгами, анон, когда ты открываешь йоба-фильм в .mkv на 30 гигабайт, он целиком не влезает в твою память, но видеоплеер, несомненно, открывает его как файл. А разгадка одна - интерфейс fstream ничего не говорит о том, где находится файл. Он передает строку с именем операционной системе, та достает нечто, что в ее понимании отвечает твоему запросу, и тебе предоставляется к этой сущности доступ. Она физически может быть где угодно, и ты не можешь "заметить" этого, потому что время доступа к файлу тоже не регламентировано. Более того, получится ли открыть файл - тоже не регламентировано, эта ответственность возлагается на ОС, как и способ хранения кусков открытого файла. Скорее всего, нормальная ОС будет загружать файл по кускам и кэшировать. Но теоретически она может попытаться загрузить весь файл в память, памяти не хватит, и конструктор fstream кинет исключение емнип. И такое поведение абсолютно нормально и не выходит за рамки стандарта. такие дела.
Анон, подскажи мне, где можно красиво использовать variadic templates, кроме функций с переменным числом параметров? Я посмотрел примеры, но все остальное или непонятно зачем нужно, или представляет из себя какую-то вырвиглазную хуету.
>>510103 Метапрограммирование жи. Поиск максимума из n чисел во время компиляции: [code lang="cpp"] template <int head, int ... tail> struct Max { const static int value = (head > Max <tail ...>::value) ? head : Max <tail ...>::value; };
template <int ... tail> struct Max { const static int value = std::INT_MIN; }; [/code]
>>510271 >emplace-методы, это и есть функции с переменным числом параметров Не путай, тебе же станет известно количество параметров еще при компиляции, поэтому переменное количество параметров, значит, делать variadic function не требуется. Например, у тебя есть класс ChlenSemyi, в котором unique_ptr <T> chlen_, где T может быть TvoyaMamka, у которой конструктор принимает 10 параметров-кусков мяса, либо TvoyBatya, который дохуя спортсмен и принимает только один параметр-салат. Тебе нужно инициализировать этот указатель в конструкторе класса ChlenSemyi. И ты можешь создать один variadic template конструктор, который принимает любое количество любых параметров и пытается пихнуть их в конструктор T. Без них тебе бы пришлось описывать для каждого набора параметров отдельный конструктор. >каррирование проще делать лямбда-функциями Не всегда. До C++14 нельзя было переименовывать параметры и захватывать члены класса как переменные из зоны видимости, например, а вариадики подбавляют гибкости. >и нахуя это нужно? Потому что это позволяет перенести часть вычислений на этап компиляции, потом тормозить будет меньшея могу, иди на хуй.
>>510305 Хвостовая рекурсия же. Он на каждом этапе сравнивает первый параметр и уже вычисленное value в структуре, где параметров на один меньше. Когда остается ноль параметров, он вернет наименьший возможный int. Да, я знаю, что это немного костыльно, просто первое, что пришло в голову. Вообще, гугли метапрограммирование или Александреску из шапки читай.
>>510306 >значит, делать variadic function не требуется При чем тут вообще variadic function, если изначально речь идет о шаблонах? >До C++14 нельзя было переименовывать параметры и захватывать члены класса как переменные из зоны видимости если речь идет о [&,=], то это прекрасно работало и в 11. Скинь какой-нибудь пример каррирования шаблонами
>>510509 >При чем тут вообще variadic function >emplace-методы, это и есть функции с переменным числом параметров Ты походу не отличаешь template <typename ... Args> func () от func (TvoyaMamka arg1, ...). >если речь идет о [&,=], то это прекрасно работало и в 11 Нет, речь о [var = expression] {}. >Скинь какой-нибудь пример каррирования шаблонами [code lang="cpp"] template <typename Function, typename ... OldArgs> class Bind { const Function function_; const std::tuple <OldArgs ...> old_args_;
>>510702 В оперативной памяти есть специальный стек, когда ты вызываешь функцию, в него помещаются передаваемые ей параметры, а функция при обращении к параметрам считывает их из этого стека. Речь идет о том, кто должен удалять эти данные из стека при выходе из функции: сама функция или вызывающая программа.
>>510723 Прости, но я не могу в английский. Можешь пояснить что он тут имел ввиду? >all local variables and function parameters are a known constant offset from this register for the duration of the function call. >At the start of the function, ESP is decremented by the appropriate value.
SP указывает на вершину стека и с помощью его можно ложить/брать верхний элимент, а для чего BP?
И в википедии писалось что когда Си ложит переменную меньше 4 байт в стек, то она расширяться до 4 байт. Имеется виде переменная из объявления функции, а не локальная? А если я буду передавать как параметр массив char, то его размер в 4 раза увеличивается? В С++ так же?
>>510699 Ты заебал, я тебе аж джва примера привел. Максимум чисел на этапе компиляции для адептов метапрограммирования, каррирование без костылей с обертками вокруг лямбды как более практическая вещь.
>>510740 >all local variables and function parameters are a known constant offset from this register for the duration of the function call. Когда ты пишешь внутри функции int i; int j; int k компилятор превращает это в [ebp - 4], [ebp - 8], [ebp - 12]. То есть переменные превращаются в смещение относительно регистра ebp. >At the start of the function, ESP is decremented by the appropriate value. В начале функции на стеке выделяется память путем вычитания из ESP. Тогда в промеждутке между EBP-ESP находятся твои локальные переменные. Далее push/pop модифицируют ESP, а вот EBP используется для адресации локальных переменных.
>А если я буду передавать как параметр массив char, то его размер в 4 раза увеличивается? Нет. Массивы обычно передаются по ссылке, но если даже передашь по значению, то размер округлится до кратного 4-х.
>>510719 Да. Если посмотришь книжку Пильщикова, которая была выше в треде, там наглядно это показано. Идиома такая, что один из регистров (BP для 8086 архитектуры, EBP для 32bit, RBP для 64bit) схороняется в стек, дальше в него записывается вместо старого значения адрес текущей верхушки стека, и все локальные переменные отсчитываются как BP - смещение, а все параметры (и адрес возврата) как BP + смещение.
>>510747 Всё. Спасибо. Теперь точно понял. На всякий случай уточню. Если в функцию передавать 100 параметров типа char, а не 1 массив из 100 элементов, то тогда каждая переменная будет занимать 4 байта?
>>510751 Это емнип зависит от архитектуры. Грубо говоря, ты не должен делать предположений об этом, стандарт не регламентирует. На некоторых архитектурах выравнивание строго обязательно, на других его можно вырубить, но тогда увеличивается время доступа. Изнутри крестов ты это не сможешь контролировать, по крайней мере платформонезависимо.
>>510751 Массивы вообще передаются по ссылке, а сколько будет занимать переменная типа char зависит от архитектуры и компилятора и в с++ тебя это волновать не должно.
>>510750 >книжку Пильщикова Она слишком сложная. Не осилил и 10 страниц. Если осилю лекции что выше в треде рядом с этой книгой, то пойму что в ней написано? Если нет, то реквестирую что попроще Пильщикова.
>>510755 >Пильщикова >сложная Эээ, шта? Она же очень поверхностная, я помню, как мне на первом курсе вечно не хватало детализации из нее и приходилось гуглить, лол. Попробуй тогда навернуть лекций по архитектуре для начала, там выше я кидал ссылку на ргхост.
var ba:ByteArray = new ByteArray(); ba.length = 8; ba[1] = 1;
Now we can access ba[] items and write numeric byte values into ba[]. Also we are allowed to write objects into ByteArray. For example:
var obj = new MyClass(); ba[0] = obj;
AS3 will try to implicitly convert the MyClass object into numeric value by calling the MyClass.valueOf() method. This method can be easily redefined within the user's code:
Let's see how that implicit conversion occurs inside the native code:
push esi mov eax, [esp+8] // the offset value from "ba[offset] = obj" push eax add ecx, 0x18 // ecx = this = "ba" object pointer call ByteArray.getStorage() // gets ba[offset] storage pointer and mov esi, eax // saves it in esi
mov ecx, [esp+0xC] // "obj" pointer push ecx call AvmCore.toInteger() // call MyClass.valueOf() add esp,4 mov [esi], al // writes returned byte into array
pop esi ret 8
On high-level language this will look like:
void ByteArray.setObjInternal(int offset, obj) { byte dest = this.getStorage(offset); dest = toInteger(obj); }
So the array storage pointer is saved in local variable, then AS3 valueOf() is invoked from the native code and returned byte is written into destination pointer at the end. If valueOf() changes the length of byte array (see above) and reallocates its internal storage, then local destination pointer becomes obsolete and further usage of that pointer can lead to UaF memory corruption.
Using this vulnerability, it's very easy to control what byte will be written and at which offset this corruption will occur.
3. AFFECTED SOFTWARE Adobe Flash Player 9 and higher
...
Стало интересно пусть они могут записать в освобожденную область памяти, но откуда они знают что эта память уже снова выделена (причем это должно произойти после освобождения но до записи значения) и как она используется?
>>510761 Ну это классическое переполнение жи. Обычно тактика такая - засрать всю доступную тебе для записи память пустыми командами, а в конце цепочки поставить RET туда, куда тебе надо. После этого с нехилой вероятностью управление попадет на одну из этих команд и уплывает по ним до твоего RETа.
>>510763 Но для этого надо, чтобы А) эту память не перезаписали перед использованием Б) чтобы она была в исполняемом сегменте. Не? не очень понимаю в байтоебстве и асме, не ругайся
>>510765 Ну вообще да, и энивей сейчас делают всякие защиты запрет исполнения из сегмента данных, автоматическую проверку границ массива с генерацией исключения при выходе, или вообще запускают все недоверенное в песочницах. Переполнение это классика взлома как бы. Но по факту иногда пусть и с изъебствами это работает. Там дохуя разновидностей каждый день придумывают, их быстро патчат, но потом придумывают снова, ну ты понел. Например, лет десять назад нашли фишку с переполнением кучи куча и стек обычно в одном сегменте делались и росли навстречу друг другу, было довольно популярно ее юзать. Но вообще, если тебе это интересно, то ты должен серьезно обмазаться байтоебством. Уровень семестрового асма точно будет необходим. Если хочешь, могу кинуть видео с лекций, которые нам в лабе читали, там одна или две как раз про это, довольно популярно разжевывалось вроде.
>>510766 Это из архива hacking team readme, у них сэмплы есть которые хорошо работают (под винду и макось). Можешь их исходники посмотреть если разбираешься http://t.co/nfqck54YhT
Хм? В С++ треде последнее время ассемблера больше чем С++. Может кто-то осмелиться создать ассемблер тред и возьмёт на себя не лёгкую задачу по составлению шапки?
>>510758 > Подробно работа отладчика студенты факультета вычислительной математики и кибернетики МГУ изу- чают в курсе третьего семестра "Системное программное обеспечение". Что это за курс? Он у тебя есть? Можешь показать?
>>510787 >>510758 Ну вот. Снова на самом интересном месте. Чем ты в этом МГУ занимаешься? Аспирант? Где эти курсы искать? В гугле только краткое описание на 2 страницы.
>>510709 Да, делал как в приложении, только у меня это приложение В.
>>510711 На 2 скрине я, вроде, не использую библиотеки, в которые нужно добавлять .h? Там же рядом учебник написан, вроде оттуда всё скатал, а не работает...
>>510843 >Там же рядом учебник написан, вроде оттуда всё скатал, а не работает... Другой компилятор или другая версия. В MS не работал, но возможно там надо .h и для стандартных библиотек. Ещё попробуй на первом скрине удалить из скаченого файла #include <hash_map>
>>510776 Няш, ну я бы мог, конечно, но с асмом не такая движуха, как с крестами же. Вангую, что тред будет мертворожденным просто, иногда кто-то будет заходить из-за шапки и все. Да и я, если честно, в асме шарю только на уровне, чтобы понимать, что вообще происходит, и иногда ломать что-то. Асм-погроммистом меня никак нельзя назвать. >>510787>>510805 У нас изменилась программа, учебник же старый. Сейчас в третьем семестре вместо этого операционные системы , а СПО читают только на кафедре СП емнип. Про отладчик было примерно поллекции, я выше давал ссылку на книжку Машечкина по операционным системам, она в точности по лекциям, так что можешь обмазаться. Там про трассировку, точки останова и вот это все. >>510799 Не, пока еще студент. Ну, во-первых, пошарь по сайтам погроммистских кафедр, это cs.msu.su с префиксами al. , sp. , asvk. Еще есть http://esyr.nizm.ru/ и http://tka4.org/materials/, там много материалов. мимооп
>>510705 замени hash_map на unordered_map, заинклудь <unordered_map>, измени подсистему в настройках проекта на /SUBSYSTEM:CONSOLE (Project->Properties->Linker->System->SubSystem)
>>510805 По поводу обработчиков сигналов - это довольно просто, лол. В nix процессы могут посылать друг другу сигналы это просто числа, которые обозначаются как константы через #define, например, SIGKILL, эти сигналы передаются и обрабатываются отдельно от потоков ввода-вывода, файлов и других инструментов взаимодействия. Когда процесс получает сигнал например, нажатие Ctrl+C в консоли посылает SIGINT работающей программе, ищется обработчик сигнала с таким номером и вызывается. Обработчик это просто функция вида void func (int), в параметр ей суется номер сигнала. Процесс имеет изначально обработчики по умолчанию которые при получении сигнала вырубают процесс нахуй, но если тебе не нравится, то ты можешь переопределить обработчик на кастомный. Для этого есть функция signal, она выглядит как void (signal(int sig, void (*func)(int)))(int), то бишь принимает номер сигнала и указатель на новый обработчик, заменяет его, и возвращает указатель на старый обработчик. Вот и все. Но это такие дебри Pure C, лол, в крестах обходятся без такой хуйни обычно.
Ну посоветуйте что-нибудь по алгоритмам. А то вот все пиздят, мол главное чтоб знал АЛГОРИТМЫ. А я вообще не знаю, что это значит. Я что, должен запомнить какие-то алгоритмы как паттерны и уметь ебашить их по памяти? Например на листочке написать кучу разных методов сортировке? Выглядит это все так, как будто нахуй не нужно. Что почитать вообщем, чтоб на работе сказали маладца, как устраиваться буду.
>>511015 >А то вот все пиздят, мол главное чтоб знал АЛГОРИТМЫ. Вообщем-то правильно пиздят, но не совсем. АЛГОРИТМЫ - это не знание, это навык\способность\умение - приходит с опытом. Чем больше ты реализуешь алгоритмов, тем больше опыта ты набираешься. Так что гоу в сортировку. Научисть в блок-схему алгоритма. Пойми рекурсию. Потом всякие стеки очереди реализуй. Потом деревья, кольцевые буферы и всякие там скип-листы. Потом разберись с потокбезопасностью - критические секции, мутексы, семафоры, спин-локи и пр. Потом всякие потокобезопасные lock-free, wait-free алгоритмы на interlocked-операциях ебашь, узнай что-такое ordering, cache-line и false sharing. Как-то так. >Выглядит это все так, как будто нахуй не нужно. Только это и нужно. ЯП - это вторичное, тебе к тому времени уже должно быть похуй на каком языке\парадигме и под какую ОС что писать.
Может тут есть знатоки QT QML и при этом еще и альтруисты. Очень нужно проконсультироваться по некоторым нубским вопросам. Много времени не отниму. Если кто готов помочь - добавляйтесь в скайп icy_ua. Спасибо.
>>511028 >приходит с опытом Ну ко мне то что нужно пришло, так как программирую для себя уже хуй знает сколько лет. Просто хочу надрочиться в этом, чтоб сказать: "Да, алгоритмы знаю". Советы схоронил, книжки >>511027 тоже. Спасибо.
Так вот, в чем вопрос: мне всегда казалось, что приведение типов никак не влияет на передаваемые данные, это просто способ обойти ограничения компилятора, однако tmp и tmp2 ведут себя по разному, получается приведение типов генерит какой-то код?
>>511109 Передаешь 10 - rvalue передается, печатается, устанавливается в 100500 и исчезает. Передаешь tmp - компилятор не дает передать и испортить lvalue. Передаешь (int &&) (tmp) - аналогично std::move ты показываешь, что tmp можно портить как rvalue. Сгенерится ссылка и передастся в функцию, как и в случае 10. Код будет такой же как для 10, ибо приведение указателей не генерит нового кода если нет приведения между наследующими классами, у которых смещения разные. Передаешь (int)(tmp2) - здесь ты приводишь не указатели, а значения. Поэтому вызовется "конструктор" int на самом деле у int нет конструктора, но упрощенно можно считать, что произойдет то же, что при конструировании нового объекта класса, ведь даже синтаксис тут фактически соответствует: ты пишешь int (tmp2), вот тебе и конструктор. В итоге tmp2 скопируется во временный rvalue int, и уже ссылка на него будет передана в функцию. Этот временный int изменится на 100500, а старый, разумеется, нет. А разгадка одна - приведение не для указателей, а для самих объектов очень даже может генерировать код и не только явное, например, int в double приводится не бесплатно, хранятся они совершенно по-разному.
Я увожу через шаблонов стон,
Я увожу к олдфажным наставлениям.
Был Симулой мой Зодчий вдохновлён:
Я высшей силой, полнотой всезнанья
И чистым байтоебством сотворён.
Древней меня лишь вечные созданья,
И с вечностью пребуду наравне.
Входящие, оставьте упованья.
Литература:
Для нюфань:
Три классических учебника для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Герберт Шилдт - C++. Базовый курс - http://padabum.com/x.php?id=15127
Роберт Лафоре - Объектно-ориентированное программирование в C++ - http://padabum.net/x.php?id=16885
Стивен Прата - Язык программирования C++ - http://bukin.su/share/%D0%9A%D0%BD%D0%B8%D0%B3%D0%B8/cpp/Prata_C++.pdf
Учимся не писать говнокод:
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все.
Скотт Мейерс - Эффективное использование C++ - http://www.e-reading.club/book.php?book=1002058
Скотт Мейерс - Наиболее эффективное использование C++ - http://www.proklondike.com/var/file/C/Scott_Meyers_-_More_Effective_CPP(RUS).rar
Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ - http://coollib.com/b/176648
Тонкости языка (для гурманов):
Ад и хардкор.
Бьерн Страуструп - Язык программирования C++ - http://www.proklondike.com/var/file/straustrup-yazyk-c-speciazdanie.zip
Андрей Александреску - Современное проектирование на C++ - http://www.proklondike.com/var/file/C/Andrei_Alexandrescu_-_Sovremennoe_Proectirovanier_CPP.rar
Герб Саттер - Решение сложных задач на C++ - http://www.studfiles.ru/dir/cat32/subj1104/file8061.html
Стандарт языка (на ангельском) - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Отдельные аспекты:
Читать по необходимости.
Энтони Уильямс - Параллельное программирование на C++ в действии - http://www.proklondike.com/var/file/Paralelnie_programirovanie.zip
Николаи Джоссатис - C++. Стандартная библиотека - http://www.proklondike.com/var/file/C/Nicolai_Josuttis_-_STL(RUS).rar
Ссылки:
Годный блог, в котором все просто и понятно тян не нужны кококок борщ - http://alenacpp.blogspot.ru/
Краткие описания библиотечных функций и контейнеров - http://ru.cppreference.com/w/
Памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Предыдущий: