"... Жалчайший род, чей жребий несчастливый И молвить трудно. Ты на костыле Вновь самокат приладил, нечестивый!"
Мы оказались в метафункций мгле. Стонало эхо крестоблядков голосами, Увязших в коде, как комар в смоле.
Взглянув окрест, я вмиг поник глазами: Шаблоны, источая тяжкий смрад, Лежали над несчастными пластами.
Внизу ж, суливших, что определят В compile-time размер факториала, Толпа, снося ошибок жутких град,
Сквозь стон Александреску проклинала.
Литература:
Для нюфань: Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется. Стэнли Липпман, Жози Лажойе и Барбара Му - Язык программирования C++ (2014) - https://goo.gl/kVaela Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2011) - https://goo.gl/nAFUXa
<устарело> Герберт Шилдт - C++. Базовый курс (2010) - https://goo.gl/qMLAFl <устарело> Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - https://goo.gl/QvjR6x
Учимся не писать говнокод: Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все. Скотт Мейерс - Эффективное использование C++ (2005) - https://goo.gl/wsDXGz Скотт Мейерс - Наиболее эффективное использование C++ (1996) - https://goo.gl/tHa0tO Скотт Мейерс - Effective Modern C++ (на ангельском) (2015) - https://goo.gl/uImH0J Скотт Мейерс - Эффективное использование STL (2002) - https://goo.gl/QtS8Dc Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ (2005) - https://goo.gl/Cpk4YR
Тонкости языка (для гурманов): Андрей Александреску - Современное проектирование на C++ (2002) - https://goo.gl/e1V5BC Герб Саттер - Решение сложных задач на C++ (2002) - https://goo.gl/iWaa6S Герб Саттер - Новые сложные задачи на C++ (2004) - https://goo.gl/4nn512
Также для легкого чтения подойдет книжка c историей создания C++: Бьерн Страуструп - Дизайн и эволюция C++ (1994) - https://goo.gl/FqbPwo
Отдельные аспекты: Читать по необходимости. Энтони Уильямс - Параллельное программирование на C++ в действии (2012) - https://goo.gl/qJfBkD Николаи Джоссатис - C++. Стандартная библиотека (2012) - https://goo.gl/PEyiMH Дэвид Вандевурд, Николаи Джоссатис - Шаблоны C++. Справочник разработчика (2003) - https://goo.gl/0M4NpG Роберт Седжвик - Фундаментальные алгоритмы на C++ (2001) - https://goo.gl/4jwxSl (части 1-4), https://goo.gl/yDuQgG (часть 5) Ариндам Мукерджи - Learning Boost C++ Libraries (на ангельском) (2015) - https://goo.gl/b0gPN1
Под шиндошс удобно использовать IDE Microsoft™ Visual Studio®. Базовую версию (2015 Community) можно бесплатно скачать, следуя инструкциям с этой страницы: https://www.visualstudio.com/ru-ru/products/free-developer-offers-vs.aspx. Чтобы начать писать код, нужно запустить Visual Studio, кликнуть "Файл - Создать - Проект - Пустой проект", после создания кликнуть слева правой кнопкой мыши по пункту "Файлы исходного кода", выбрать "Добавить - Создать элемент - Файл C++". Свои хэллоуворлды писать в этот файл, в дальнейшем можно добавить другие файлы и хедеры. Чтобы скомпилировать и запустить проект, нужно нажать "Сборка - Собрать решение", а затем "Отладка - Запуск без отладки".
Под *nix, как правило, уже предустановлен компилятор gcc (если нет, используй sudo aptitude install gcc), так что достаточно сохранить хэллоуворлд, набранный в текстовом редакторе, и выполнить g++ helloworld.cpp и ./a.out. Но удобнее установить какую-нибудь IDE, например, Code::Blocks (sudo aptitude install codeblocks) и работать в ней.
Можно также не устанавливать ничего, а запускать свои хэллоуворлды на http://ideone.com, выбрав в левом нижнем углу язык C++14.
Софт и библиотеки:
IDE, призванная похоронить Visual Studio пока не особо получается. Удобные свистелки и перделки присутствуют. Тормоза и баги пристуствуют. Кросплатформенность присутствует - https://www.jetbrains.com/clion/
Вопросу по синтаксису идут на хуй. Лабы идут на хуй. "Как мне сделать Х на чистых крестах без библиотек" идут на хуй. Все идут на хуй. Хейтер сосет члены на пару со своей мамашей.
Страуструп для ньюфагов заменен на djvu с навигацией. Добавлено последнее издание хардкорного Страуструпа на ангельском, Липпман для ньюфагов, книга про boost. Структура шапки переработана. Добавлен раздел про софт и библиотеки.
Призывается анон, который поделился книгой про boost. Будет восхитительно, если ты хотя бы примерно сможешь вспомнить, где ее взял. Дело в том, что это одна из тех книг, которых нет в гугле и вообще в открытом доступе, и там, где ты ее нашел, может быть и другая уникальная годнота, которую следует включить в шапку.
>>546862 Ну я не говорил, что конкретно эта там есть, но я там находил достаточно много вещей, которые сложно или невозможно было достать в других местах. Извиняюсь, если зря в разговор влез.
>>546867 Да нет, что ты, речь как раз шла не про эту книжку, а про МОАР. Вообще, чем больше анон запилит ссылок на книги, тем лучше, потому что я пролистываю каждую новую встреченную библиотеку в поисках книг, которые могли бы хорошо для шапки подойти, и вообще.
Посмотрел про переполнение стэка. Как он заполняется? Есть например простой хэлоувод с выходом за границы массива. Как не запуская программу узнать какие данные будут перезаписаны?
>>546893 С точки зрения стандарта, это UB, и ничего определенного утверждать нельзя. По стандарту компилятор вообще может не использовать стек, например ну вдруг какой-то извращенец напишет что-то подобное только чтобы поднасрать тем, кто не читает стандарт. На практике переменные кладутся в стек в порядке определения, так что если у тебя твой массив определен самым первым в функции, то сразу за ним будет адрес возврата, плюс-минус выравнивание. Но опять же, надо учитывать, что функция может инлайниться, что используемое соглашение о вызовах может предполагать передачу адреса возврата через регистры, ну ты понел. Так что нужно смотреть конкретную платформу, компилятор и его параметры, чтобы сказать абсолютно точно.
>>546911 Это сильно зависит от того, какой отладчик. Например, в gdb я до сих пор не могу и буду рад, если анон распишет за него или даст рилейтед ссылок. В Visual Studio просто включаешь режим отладки, и тебе показывается графически вся память ячейками, например.
Есть пара вопростов 1- Я не могу читать книги по 500 странпиц. Я "тур по с++" в 190 страниц 2 месяца читал. Как с этим бороться? 2- В какую интересную сферу я могу вкатиться зная с++ ?
>>546976 Быстро читаешь - формируешь в голове карту знаний с белыми пятнами, которые потом заполняешь. Причем, в разных книжках одни и те же факты (самые важные и распространенные) повторяются. Читая одну книгу медленно, у тебя нет карты, поэтому мозгу тяжело строить ассоциации, ты не можешь отличить важные факты от второстепенных, и в итоге имеешь проблемы.
Т.е. 2 раза прочитать одну и ту же книгу быстро во много раз лучше, чем читать ее же, но в 2 раза медленнее. В реальности все намного хуже - книга на 500 страниц читается за 2 вечера, а ты ее растягиваешь на 2 месяца. Ты бы ее раз 10 прочитал бы за это время, если бы хотел, и понял бы намного больше. Чтение - это процесс загрузки данных в мозг, который потом эти данные переваривает, обычно нужно поспать, а ты ждешь мгновенного ПОНИМАНИЯ здесь и сейчас.
>>547008 Я уже спрашивал тут, но спрошу снова. Через пол года олимпиада и нужно задротить алгоритмы. Прочитал хуй знает зачем. ни с кем не советовался две книги страуструпа почти нихуя не понял но это отдельная тема там ещё задания ебанутые и заканчиваю лафоре. Нужно хорошо знать STL и алгоритмы. Теперь даже сортировку с помощью функции из стандартной библиотеки сделать не могу не залезая в гугл. И алгоритмы плохо знаю. Для STL и заодно 11ого стандарта советовали Джоссатиса второе издание. А алгоритмы Седжвик. Не могу решить с чего начать когда закончу лафоре.
C++ How to ProgramАноним21/09/15 Пнд 21:04:07#44№547019
Аноны, что можете сказать о книге Дейтелов "Как программировать на C++"?
Господа, нид асистанс! Объясните пазязя по-фасту, за область памяти под названием стек и свободное хранилище памяти. У С.Праты по местной книге в главе 9 об этом рассказано несколько путано - нихера не понял
>>546742 (OP) подскажите как реализовать на С++ класс "Множество размерности n" с разными функциями, присущими множествам(пересечение, умножение, проверка, входит ли элемент в множество)?
>>547094 Для малых n - на отсортированном vector, для больших - на хэше (в стандартной библиотеке set::unordered_set) или красно-черном дереве (std::set). Правда, подозреваю, что ты хочешь, чтобы мы за тебя лабу сделали.
>>547147 Я бы предпочёл борду в виде графа постов. Чтобы можно было отметить интересные ветки обсуждения и непринуждённо форкать треды, дабы не читать школовопросы и обкидывания говнами.
>>547158 Блять. Это же ГЕНИАЛЬНО Я бы этим занялся, но в конечном итоге будет интересно лишь нам с тобой. Без веб интерфейса же, а сейчас все в себе, все в вебе...
>>547102 И по какой размерности тогда его сортировать/хэшировать? Не, тут надо как-то хитрее придумать разумеется, если множества маленькие, то похуй вообще.
>>547170 >>547169 В соседнем треде пилят распределенную борду, можно примазаться. Я бы занялся подобном, если найдется хотя бы 2-3 коллеги, которые не будут хуи пинать, сваливая друг на друга всю работу. мимотретий анон
>>547182 Я только оттуда, больше не вернусь, обычный скайп без конструктивизма. Моё мнение - асинхронность и P2P - от лукавого, графы и система отбора -то, во что нужно бить. И вообще, это должно быть /pr/ ориентированным.
>>547191 План действий такой: 1. Техлиды с сеньорами расписывают гуглодок с техзаданием. МАКСИМУМ разделяем всю работу на компоненты, выясняем способы взаимодействия этих компонент (CFFI, pipes, middleware, etc). 2. Каждому вручаем по компоненту с ясно озвученными минимальными требованиями, лишь бы хоть как-нибудь работало. Он выполняет этот компонент на своём любимом ЯП (желательно конечно ограничиться 2-3 на весь проект). 3. Организуем автоматическую сборку проекта. В итоге получаем суперсырой первый билд. 4. Заводим багтрекер и расписываем путь развития проекта. Каждый берёт себе какие хочет задачки и делает. 5. Каждый месяц релизим очередную версию.
Очень желательно запилить всё в переиспользуемой манере, так как срач p2p vs server неминуем.
Бабки на хостинг будем собирать когда запилится самая первая версия.
>>547191 Все ссылки пока что в соседнем листе с результатами переписи, пописать в гуглодок можно уже сейчас. Туда же попадут гитхабы-битбакеты и прочие данные. Если наберётся достаточно народа, или у меня лично будет дохуя терпения, запилим отдельный координационно-агитирующий тред.
>>547181 >ссылки в соседнем листе с результатами переписи, пописать в гуглодок можно уже сейчас >>547184 Закатывайся, будем пилить универсальный код и отделять компоненты. Там процентов 70 будет одинаковое. >>547169 >Без веб интерфейса Можно без, а можно и с. Как вариант запускать локальный сервер и открывать браузером. Ну и декстопы-мобилки в опроснике стоят отдельно, опять же, интерфейс можно запилить один раз, а потом подключить его к п2п модулю или апи сервера.
>>547193 Срач уже здесь. Ты ведь не будешь спорить, что для взлета у борды должна быть киллер-фича? Так вот, способ представления в виде графов и форканье на таковую явно не тянут, это как если бы ресторан позиционировал себя не имеющим аналогов потому что у них у ложек ручки длиннее. Надо, чтобы от сотен остальных борд отличалось резко, смекаешь? К тому же, есть дохуя анонов, которые хотят постить цп и всякие непотребства и вынуждены жрать говно на медленном хидденчане. С этих джвух позиций выбор p2p очевиден, оно станет той самой недостающей изюминкой. А графы будут приятным бонусом.
>>547202 Ну а я и не против этого срача. Только я предлагаю уже начать напиливать хотя бы общее. Договориться с компонентами и апи. А потом как из конструктора каждый сам себе соберёт.
>>547203 Возможность лучше отсутствия возможности. Аудиторию это привлечет, а законопослушные аноны всегда могут скрыть неугодный контент. Можно алсо сделать теги специально для этого, или типа того.
А есть гуглодок? Я только форму нашел, ебаться с почтами неудобно жи. Лучше на начальном этапе сделать гуглодок, в который каждый насрет напишет свои идеи и вообще.
Граждане, а накидайте пример использования буфера для потока std::istream is, а то на en.cppreference.com и cplusplus.com как-то не совсем то и непонятно. Ситуация следующая:
std::string line; std::getline(is, line);
if (is.eof() && !is.fail()) { is.clear(); line += '\n'; //here I want put line back in istream -- may be using a buffer std::getline(is, line); }
Объясняю, почему нельзя просто просто в обратном порядке побросать все символы строки, начиная с '\n' и заканчивая line[0]: потому что is передаётся в функцию по ссылке и открыт только на чтение (чтобы если это файл, то не менять его, иначе в конец файла '\n' добавится, а файл нужно не менять). Просто сдвинуть seekg() на line.size() назад тоже не вариант, т.к. нужно прочесть line += '\n'.
И там какого-то чёрта происходит следующее: 1) делается backup буфера std::cout; 2) затем в std::cout подменяется буфер с его на буфер файла psbuf; 3) в std::cout что-то пишется, и, видимо, это следует в файл; 4) в std::cout возвращается его прежний буфер.
Попробовал скомпилировать эту херню. std::cout ничего не выводит, а файл test.txt полностью переписывается на This is written to the file
>>546742 (OP) То есть SFINAE - это анальные трюки на шаблонах, чтобы получить типа hasattrib в бидоне? Действительно пиздец! Нет чтобы завести нормальную рефлексию.
>>547267 Я тут подумал. При этом cout может иметь размера буфера меньший, чем line.size() + 1. Тогда лучше просто новый отдельный буфер запилить и всё.
>>547268 Они замечательные, это же прям магия. Тот, кто понимает [code lang="cpp"] static void test (); template <typename T> static decltype (declval <T> ().tvoyaMamka (1488)) test (); [/code] , тот будет гуру, и все девки будут давать. А в пистон и дурак сможет.
>>547440 Почему противоречие? Смотри, пишу while (true) {} a == b, не выводит ничего a <= b (или a < b) выводит Почему? Ведь по логике и a == b должно делать вывод пока а не станет равно б? Или я что-то не до понял?
>>547439 Если ты тролль - съеби. Если ты реально не понимаешь, - тоже съеби, ибо такой зашкварный мозг иметь для программирования нельзя, тебе нужен новый. %%while(a==b) выполняется, пока переменная a равна переменной b. Поскольку ноль не равен десяти, цикл не выполняется не разу.
>>547442 >while(a==b) выполняется, пока переменная a равна переменной b. Поскольку ноль не равен десяти, цикл не выполняется не разу. Я думал не так, но спасибо за разъяснения.
>>547501 Команда break выполняет мгновенный выход из текущего цикла. Программа продолжает своё выполнение с команд находящихся сразу за циклом, из которого ты вышел с помощью break.
Подскажите, никак не могу задачку с учебника решить. Решение расписал в тетради, всё должно работать, но, почему-то, в реальности ответ не совпадает с задуманным - непонятно почему число 9 (а если брать больше, то еще и делящиеся на 5), проходит проверку, хотя не должно - деление на 3 даёт 0. Проверку выделил красным.
>>547569 А, всё решил, я понял ошибку - там где был брейк, если на 2 сразу не делилось, то пропускало любые числа. Вот верное решение - заместо брейка сделал чек и вынес добавление за цикл.
>>547572 Если уж так, то выучи для чего в языке есть continue и break. А ещё тебе numbers не нужен, а если и будет нужен, то ты любой элемент и так за константное время можешь вычислить.
Анон. Послезавтра собеседование. С++ и STL знаю норм, а вот бустом никогда не пользовался, хоть и указал его в резюме. Где его можно быстро поднять. Какой-нибудь summary всех либ, либо самое важное?
>>546742 (OP) двач, помоги пожалуйста почему-то код при освобождении памяти выдаёт ошибку, не могу понять в чём дело, начинает не работать с 61 строки http://pastebin.com/eZkYLEZe
>>547885 >strcpy_s говно для педиков. Используй strcpy();
p.s нахуя ты пишешь глупые комментарии? >delete[] str4;//освободим память блядь, и так ясно что delete освобождает память >StringsWork story;//создаем объект same shit
Подскажите, как создать несколько объектов класса с именем из переменной типа string?
Другими словами: Class man; //Объявили класс string name; string lastname; ... string peremennaya; cin >> peremennaya;
man peremennaya; // тут должно быть значение, записанное в переменной peremennaya. Я пробовал всякие кавычки-скобки - компилятор ругается. А если написать без всего - то созщадлется объект peremennaya.Ваш КЭП.
>>547947 Хорошо. Я понял. Класс - это как средство нового типа данных + функции. Так? Тогда как мне реализовать создание "чего либо" с типом "моего класса"?
>>547956 Вопрос исчерпан, я это и так знаю, хуйню спорол. Хорошо, а как тогда мне хранить некие данные? В переменных моего "нового типа". Но тогда классы != переменные. Хранить данные в них не получится. Я прав?
И как мне выкручиваться? Где хранить мои "смешанные" (int + string) типы данных"? В массивах? В отдельном файле?
>>547956 С типом ты в С++ ничего не можешь сделать, можешь создать экземпляр (instance) своего типа и там уже хранить что тебе нужно. Ты уже это делал в "man peremennaya;", просто оно у тебя не компилировалось, потому что вместо class имя{поле1;поле2;}; ты сделал class имя;поле1;поле2;
допустим, есть класс: Class yoba { public string text; int number; };
Есть объект этого класса kolobok: yoba kolobok;
Хочу записать в мой тип данных набор с клавиатуры: cin >> text; cin >> number;
Данные собраны (то есть это дело не одноразовое, можно пустиьт по циклу и собирать еще). Желаю хранить это дело в массиве (или векторе).
Создаю массив array с созданным мною типом данных "yoba" в количестве 10 элементов: yoba array[10];
Допустим, что класс я инициализировал и хочу записать собранные данные моего типа yoba в первую(нулевую) ячейку массива: array[0]=... Что? Чему равняется?
Я кажется начинаю туго понимать про классы. Моё мышление о классах как о неком выделенном "местечке" для хранения информации было ошибочным. Сейчас то я в том направлении? Не кидайтесь говном, пожалуйста, подскажите, как записать в нулевой элемент массива array данные типа yoba с уже некоторыми набранными величинами переменных text и number.
>>547974 Но мой препод сказал мне реализовать мою задачу при помощи классов. Зачем мне тогда классы, если я могу напрямую всё записать в массив?
Поясни, пожалуйста: array[0].text = text; //Что означает эта запись? Каждая "ячейка" массива имеет свои поля (которые я указал в классе yoba?), потому что я создал массив с таким типом?
Антоны, нужно написать хук на функцию. В хуке нужно будет пошамать с функциями и вызвать оригинальную. Уровень знаний - hello world. Что нужно прочесть, для скорейшего написания сей приблуды?
>>547989 Няша, ты пишешь полную неведомую хуйню. Объясняю как надо: Добавляешь к своему коду комменты с ошибками компилятора у соответствующих строк. Заливаешь на пастбин или аналогичные сервисы. В посте лепишь ссылку на это дело и описываешь чего пытаешься добиться и что вместо этого получается. На вопросы вида "вот строчка кода, почему не фурычит" ответ один - хуй его знает.
Страуструп для ньюфагов, в нём введение и 4 главы: >Part I: The Basics 41-342 >Part II: Input and Output 343-580 >Part III: Data and Algorithms 581-802 >Part IV: Broadening the View 803-1070
Прошёл (i.e. сделал все упражнения) введение, Part I и первые 2 параграфа (10, 11 -- iostreams) Part II. После этого последующие 5 параграфов (12-16) второй главы посвящены графике, и текста там просто дочерта, 170 страниц и куча задач. Оно вообще нужно? Part III мне вообще кажется куда полезной, или книга построена так, что без второй главы третью не поймёшь?
Что делать? 1) прочесть графику и сделать упражнения; 2) прочесть графику; 3) сразу приступать к Part III.
>>548249 Я до сих пор не прочел IO, например за дохуя лет. Там вроде даже в начале написано, чтобы читали первую часть и дальше выборочно, что интересно и соответствует задачам. Так что пролистай ее быстренько и лезь в третью.
Господа, по вводу\выводу (fstream, все дела) посоветуйте что-нибудь, плз. Читаю Липпмана - было норм, пока не пришли к классам и к вводу выводу. Не знаю, может быть рассчитано на тех., кто уже в теме, но мне сложно идёт. в других книгах для ньюфагов тема разбита на разные части и туда-сюда мотаться сложно. особенно учитывая, что в каких то книгах ++11, а в каких то нет. т.е на что смотреть
не разберёшься, потому что Страуструп (зло?)-намеренно мешает в кучу std::basic_ios::good и std::basic_ios::operator bool , которые отличаются на значение std::basic_ios::eof
>>548410 >>548402 Мне кажется, вы страдаете хуйней, если честно. Серьезно, стандартную библиотеку изучают после ядра языка, а в ней потоки ввода-вывода по важности и интересности где-то на дне. Сосредоточьтесь на действительно полезных вещах лучше: STL, concurrency, аллокация. Вся ебля с io сложнее простых << и >> нужна крайне редко, для всех нетривиальных вещей энивей прикручивают библиотеки.
>>548409 >А вообще как успехи? Какие успехи? Я теперь чуть-чуть знаю I/O в крестах. В целом мои нужды перекрывает с запасом.
>>548430 >Мне кажется, вы страдаете хуйней, если честно. Серьезно, стандартную библиотеку изучают после ядра языка Мне собственно от языка кроме I/O ничего и не нужно-то по моим маленьким потребностям. Но вот данные/алгоритмы по-любому изучить бы.
Боже, крестобляди, какие же вы опущенцы, просто пиздец. https://events.yandex.ru/lib/talks/2588/ - перемотать на 9:22: >Сборка браузера занимает порядка полутора-двух часов на очень хорошем Макбуке. Вы, как разработчик, не можете позволить себе делать фичу, а потом ждать полтора часа. Мы это решили: мы берём несколько клонов одного и того же репозитория, и пока в одной директории собирается ваш браузер, в соседней вы работаете над другой фичей. Вместо того, чтобы сделать нормальные модули, которые бы упростили сборку и позволили бы наконец не пересобирать весь проект, когда вы нажимаете энтер в файле zaloopa.h, используемого везде, продвинутые крестобляди предпочитают во время сборки, чтобы не скучать, делать ЧТО?.. Правильно - работать над другим таском! И похуй, что внимание, которого при пердолении C++ нужно дохуя, идёт по пизде - зато пацанам из Комитета Стандартизации Крестоговна будет бесплатный цирк из кресточушек (пацаны сами к крестоговну не прикасаются, конечно же).
Аноны, ну что за хуйня? Есть какие-нибудь нормальные IDE под Ubuntu? Хоть что-нибудь сравнимое с Visual Studio? Ах да, ещё я криворукий, поэтому не могу собрать проект в Code::Blocks (почему-то не линкуются .h-файлы), а в Eclipse вообще нет пункта для C/C++. Может кто-нибудь пояснить? Почему у меня в Eclipse, кроме Java и ещё каких-то пунктов, ничего нет, в том числе пункта с выбором C/C++? Уже устал от этой хрени.
>>548450 >Вы, как разработчик, не можете позволить себе делать фичу, а потом ждать полтора часа. Чушь. Я ухожу гулять, гоняю чаи с коллегами, играю в плойку, скролю зк.
>>548449 >template самая неудачная часть языка и много где в каких проектах запрещен. Пользуйся #define >Наследование самая неудачная часть языка и много где в каких проектах запрещен. Пользуйся void *. >printf самая неудачная часть языка и много где в каких проектах запрещен. Пользуйся MOV AH, 9; INT 21h.
>>548472 А не подскажешь, как сделать, чтобы приложение запускалось в консольку в KDevelop? Ибо неудобно, когда оно в какое-то своё окошко выводит всё.
Че Страуструп пишет, что если в классе определить функцию, то при её вызове идет подстановка тела этой же функции в то место, откуда была она вызвана, а если определять НЕ в классе, то идет простой вызов функции. Так что ли? Ну а в чем тогда разница?
>>549593 Очевидное правило гласит: не помещайте тела функций-членов в объявление класса, если вам не нужна повышенная эффективность программы за счет ис- пользования небольших подставляемых функций. Большие функции, скажем, со- стоящие из пяти и более строк, ничего не выиграют от подстановки. Не следует де- лать подставляемыми функции, содержащие более одного-двух выражений.
>>549594 >>549595 А тут [1] вот питухи с SO поясняют, что неявный inline зделан для того, чтобы можно было переопределять функцию несколько раз. И inline не обязательно означает реальную подстановку тела функции в место вызова.
>>549594 Короче, из вышенаписанного вывод один. Страус — труп (пикрилейтед) обосрался. inline никогда не был ПРИКАЗОМ компилятору встраивать тело в место вызова; тем более неявный inline.
Термин inline мне Страуструп будет только через полсотни страниц рассказывать (судя по Ctrl+F), но SO прочел я. Не особо понимаю >>549600 пост, выше две ссылки говорят об обратном же вроде. (ну помимо ещё того, что он используется для того, чтобы ошибок не было, если определение функции расположено в другом файле)
>>549601 Страус-труп говорит что функции, определённые в объявлении класса, неявно помечаются как inline, а, значит, встраиваются в место вызова.
SO говорит что неявный inline это правда, но нужен в первую очередь для разрешения переопределения функции. И что компилятор волен встраивать и волен не встраивать тело функции в место вызова. Пост >>549600 это и говорит.
Приветствую Господа, катиться мимо вас толстая веб-пхп-макака, это я. В веб пошёл от нужды быстро работу найти, но подобное программирование никогда не привлекало, сейчас хочу уйти от туда. Думаю либо про андроид с жабой, либо про кресты. За спиной паскаль, руби, два курса вуза, Кормен и т.п., и чувство что это моё. Но вот в чем вопрос, чем сейчас занимаются программисты на C/C++ ? Меня интересуют конкретные задачи. И какой уровень нужен для поиска работы? Что в портфолио положить?
Вот с вебом всё ясно, с мобильными тоже. А вот чем вы на работе заняты я не очень понимаю. Помогите разобраться.
>>549816 ирл знаю людей, пилящих: - CAD'ы (нужно знать матан и линалг), - софт для voip эндпоинтов (железяки и windows клиенты). если железяка на ведроиде, то там борщ из сей, плюсов и джабы, иначе си и плюсы. - софт для кол-центров (дикая смесь из шарпов и крестов). сам больше не видел продакшен применений крестовщины. может ананон ещё накидает примеров
На хабре-то пишут, что этой осенью в студию уже завезут модули. А оп-вебм утверждает, что нет. Кому верить, и откуда вообще эта истерия на модули пошла? Раньше говно жрали большой ложкой, а теперь из ядра почти сделали конфетку, но неосиляторам все равно мало?
>>549168 И снова тупой вопрос. Что нужно доставить, чтобы открылись настройки проекта? Не могу туда зайти, ибо кнопка просто неактивна (cmake поставил). Алсо, у меня почему-то автоматом не поддерживается C++11: не распознал nullptr. В общем, анон, если не сложно, расскажи, что да как, а то я уже устал маяться с этим, а венду нет пока ни желания, ни возможности поставить.
>>549816 google-точка-ру "работа погромист си-плюс-плюс" Если без кучи побочного груза, чистый c++ программист используется в проектах, требующих высокой производительности; в основном игры, различные 3d проекты и 3d игры.
>>550011 Я, разумеется, нуфаг, но такое положение дел мне не нравится, ибо я уже осваиваю классы, потихоньку подбираясь к шаблонам, поэтому в проекте получается много файлов и т. д. Хотелось бы больше внимания уделить написанию кода, нежели пердолингу с консолью, IDE и прочими радостями жизни. Мне сейчас просто нужна рабочая IDE, поддерживающая 11-й (желательно 14-й) стандарт, с подсветкой ошибок. Всё, больше я ничего не хочу. Постоянно возникают какие-то траблы с IDE под Linux. Вот сейчас не открываются настройки проекта, вернее сам пункт неактивен. Это значит, что я что-то не установил? или, может быть, проблема в чём-то другом? В общем, я не против поебаться с Linux'ом, но сейчас мне просто нужно писать свои Laba1.
>>550016 Тогда поставь сперму со студией и не еби нам мозги. Ну серьезно, разработка под никсами без охуительной настройки всего под себя всегда была болью.
Наверно немного глупая и наивная просьба, но дело в том, что никогда не имел дело с большими проектами. Но сейчас на работе подкатили именно такой и я решил все-таки писать его на плюсах. Раньше справлялся на обычном Си, но сейчас понимаю, что нужна более-менее нормальная архитектура с возможностями добавления разных фич. Подскажите хороших проектов, в которых можно увидеть грамотный код. В проекте будет обработка данных в потоке и различные виды отображения обработанных данных, если в общих чертах. Пишем под Шинду.
>>550142 >более-менее нормальная архитектура с возможностями добавления разных фич llvm, clang. Рассмотри вариант скриптового языка с ядром на С++. LuaJIT быстрая и удобная штука.
>>550271 Не понимаю я. После него весь код комментируется. И не понятно си это или кресты и какой стандарт. Дай пожалуйста простой хулоуворд в 3 строчки. Неужели сложно?
Есть один класс huj.cpp, часть функций/структур/etc которого вынесена в .h/.cpp файлы, например pizda.h и pizda.cpp. Объявления для функций из pizda.cpp находятся в huj.h, в описании класса. При попытке вызова функций jigoorda() из pizda.cpp в huj.cpp получаем undefined reference to Huj::jigoorda()
Как корректно расставить инклуды, чтобы подключайть только *.h файлы?
Привет анон. Сейчас начали в инсте изучать WinApi, написали пару программ, мне понравилось, сейчас захотел для практики написать себе прогу. Суть: должна авторизовываться на сайте, парсить одну страницу, заходить по ссылкам и вводить там числа в форму для отправки. Собственно вопрос. Что погуглить по этой теме или мб. есть готовые библиотеки? сайт на html.
Сап аноны. Ударился тут в спортивное программирование. Когда сдаю задачку в проверяющую систему, то в зависимости от того, как выделил память, ловлю Runtime Error. Поясните за статическое выделение - неужели 118 килобайт пробивают стек? На VS задавал размер стека в 16 мегабайт - результат тот же. На моем компьютере все работает.
>>550435 Зачем тебе на стеке столько? На стеке выделяй маленькие вещи, особеонно если их дохуища по одночке нужно создавать. Выделять мегабайтный массив на стеке один раз за программу практически бессмысленно, разве чтобы потом free() не проебать, но в main похуй, вся память все равно освободится после кила программы.
>>550451 Ну просто все в олимп. прогр. выделяют статически, т.к. на куче выделить - потерять времени, поэтому я и попробовал тоже выделить на стеке. В реальных программах я так не делаю. Вопрос не в правильности, вопрос в том, почему 10001 * 12 байт кладут программу, ведь если верить FAQ проверяющей системы, размер стека на всех компиляторах, кроме VS, 64 мегабайта. Runtime Error появляется на любом компиляторе (там доступны VS, GCC, clang).
>>550459 Оно крашится вообще во время printf, стек здесь не при чем. Небось в куче-то защита не срабатывает, когда ты считать не свое пытаешься, а на стеке срабатывает.
Cэджвика стоит читать? Хочу хоть немного надрочить алгоритмы, на собеседованиях просто доебали уже ими. Слышал, что Кормэн лучше, но там очень много не шибко нужной информации. Какой выбор сделал бы ты, анон?
>>550573 Никогда курсеру не юзал. там платная подписка, или в чем прикол? Чем это лучше наворачивания печатного издания? Алсо, джаву не перевариваю, лучше уж на питоне.
Анон, помоги долбоёбу. Нужно повернуть с помощью гиперкомплексных чисел фигуру так, чтобы у неё не изменился объем. У меня н в два раза режется при каждой попытке поворота.
>>550574 Course Format There will be two lectures (60-75 minutes each) each week. The lectures are divided into about 4-6 segments, separated by interactive quiz questions for you to to help you process and understand the material. In addition, there will be a problem set and a programming assignment each week and there will be a final exam.
>>550435>>550451>>550462>>550534 Ну и что молчим-то? Вопрос правда интересный. Каков минимальный размер стека среди всех компиляторов? Я тут тоже (почти-)спортивным программированием увлёкся, хочу небольшой массив в стэк передвинуть, а то на этапе компиляции всё известно для конкретной задачи, а считать долго и муторно, используя этот массив.
32768 байт имеются в моём распоряжении или нет? Если 16384, то мне уже не хватит.
>>550751 Никто не знает. Стандарт размер стека не регламентирует. Он зависит от системы, от компилятора и от настроек компилятора. Также никто не гарантирует что твой массив действительно окажется на стеке. Гарантируется только автоматическое управление памятью - он удалится по выходе из скоупа. А компилятор спокойно может большие массивы кидать в кучу. Никто минимальным размером стека особо не заебывается - его размера достаточно для того для чего он предназначен (хранения адресов возврата). Хранение пользовательских данных на нем - грязный хак, если у тебя из-за него что-то падает то это твои проблемы. Стек для хранения маленьких переменных/структур. Если нужна скорость пишется аллокатор под нюансы конретной задачи. Все остальное суют прямо в кучу.
>>550793 Прошли тѣ времена, когда размѣръ стека страницы памяти ограниченъ былъ, мы послѣднюю EC ЭВМ на свалку списали въ 1999-мъ году. Ну, съ разморозкой меня!
>>550751 Возможно, проверяющая программа запускается ебанутым компилятором, который не делает alloca_probe? Попробуй сделай примерно так: void my_alloca_probe(void object, size_t size) { for (size_t i = 0; i < size; i += 4096) { ((uint8_t*)object+i)=0; } } и вызови до первого доступа к твоему большому объекту.
Какого хуя опять со звёздочками? *test >>550846 Ну да похуй, я все равно наебался. В общем, суть в том, чтобы обращаться к каждой страницы стека в обратном порядке (а не как у меня), чтобы ОС поняла, что тебе нужно моар и выделила страницы памяти.
>>550435 >Поясните за статическое выделение Ты путаешь. Стек - это автоматическая память, а не статическая. Статическое выделение - это вот так:
static Node nodes[10001];
И это самый грамотный вариант, если нет рекурсии.
Размер стека определяется не компилятором, а линкером, который из объектных файлов собирает executable. Причем все сильно платформо-зависимо, в windows мире размер стэка задается в заголовке PE-файла (и есть соответствующие #pragma), в линуксе - свои заморочки, о которых я понятия не имею.
А если хочешь йоба-крестовое решение, то хапни побольше в глобальную переменную (int yoba[100000000]) и перегрузи operator new так, чтобы память выделялясь в yoba методом bump ptr, а operator delete не делал ничего. Тогда, если памяти хватит, скорость будет максимальной без всяких стеков (не считая нелокальности кэша - но тут уж и не знаю, чем помочь): http://ideone.com/mQYppn
>>550846 Я не он, я сочувствующий. И у меня объекты гораздо меньше (провёл оптимизацию по уменьшению объектов), краша в 15 студии не происходит. Интересно, как в других компиляторах дела обстоят и вообще, почему до сих пор знатоки стандарта не высказались?
>static Node nodes[10001]; >И это самый грамотный вариант, если нет рекурсии.
А вот здесь можно подробнее? Да, я обращаюсь к функции, где например char dohuja[10001]; несколько раз.
>>550860 >почему до сих пор знатоки стандарта не высказались? С точки зрения стандарта тебе уже пояснили все. В стандарте нет понятия "стек". И даже если забыть про это, ежу понятно, что размер стека не может не быть платформозависимым. У меня валяется ардуина, там памяти 16 килобайт, из которых дохуя уходит просто на хранение инструкций. И внезапно под него тоже пишут на крестах с небольшими оговорками. Как ты думаешь, там может на стек выделиться "1 МБ, на которые всегда можно рассчитывать", как тут выше кто-то спизданул?
>>550944 Ну и чем это принципиально отличается от ситуации, когда в твоей ардуине new не сможет выделить столько же? Ах, ты это обработаешь? Лол, но как, если тебе НУЖНО 1 мб для работы?
>>550860 >Интересно, как в других компиляторах дела обстоят и вообще, почему до сих пор знатоки стандарта не высказались? Стандартный С++ - Тьюринг-полный язык, а любое ограничение по памяти делает его не Тьюринг-полным. Было бы странно, если бы в стандарте что-то об этом говорилось. >А вот здесь можно подробнее? Если ты пишешь под пека, то в static-переменную или глобальную влезет намного больше, чем в стек.
>>551069 На что? Если ты можешь реализовать на языке брейнфак, это будет Тьюринг-полный язык. Но только если под рукой у тебя бесконечная память. Иначе уже нет (и в таком случае - конечной памяти - проблема остановки принципиально разрешима).
>>551071 >а в его реализациях - нет? Машина Тьюринга в природе существовать не может, потому что ей требуется бесконечная память. Поэтому и реализаций нет. Не может быть. >Пруф, что по стандарту C++ - Тьюринг-полон Теоретически ты можешь себе представить size_t (и void*), реализованный через длинную арифметику. В стандарте на это нет запрета (The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object.). Значит и ограничений на размер памяти нет. Другой вопрос, что 64-битных указателей хватит всем.
>>551073 >Машина Тьюринга в природе существовать не может, потому что ей требуется бесконечная память. Поэтому и реализаций нет. Не может быть. Я это прекрасно знаю
>Теоретически ты можешь себе представить size_t (и void*), реализованный через длинную арифметику. В стандарте на это нет запрета (The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object.).
Подозреваю, что "unsigned integer type" это как раз и есть запрет на это. >Значит и ограничений на размер памяти нет. Ну так это как раз значит, что реальный компилятор C++ на реальном компьютере может соответствовать стандарту.
>>551067 >Если ты пишешь под пека, то в static-переменную или глобальную влезет намного больше, чем в стек. LOLWTO? static-переменная разве не на стэке лежит?
>>551218 3.7 Storage duration [basic.stc] 1 Storage duration is the property of an object that defines the minimum potential lifetime of the storage containing the object. The storage duration is determined by the construct used to create the object and is one of the following: (1.1) — static storage duration (1.2) — thread storage duration (1.3) — automatic storage duration (1.4) — dynamic storage duration 2 Static, thread, and automatic storage durations are associated with objects introduced by declarations (3.1) and implicitly created by the implementation (12.2). The dynamic storage duration is associated with objects created with operator new (5.3.4). 3 The storage duration categories apply to references as well. The lifetime of a reference is its storage duration
3.7.1 Static storage duration [basic.stc.static] 1 All variables which do not have dynamic storage duration, do not have thread storage duration, and are not local have static storage duration. The storage for these entities shall last for the duration of the program (3.6.2, 3.6.3). 2 If a variable with static storage duration has initialization or a destructor with side effects, it shall not be eliminated even if it appears to be unused, except that a class object or its copy/move may be eliminated as specified in 12.8. 3 The keyword static can be used to declare a local variable with static storage duration. [ Note: 6.7 describes the initialization of local static variables; 3.6.3 describes the destruction of local static variables. — end note ]
>>550951 Ничем, я про то и толкую. Глупо надеяться, что стандарт даст какие-то гарантии по поводу производительности железа, объемов памяти и вот этого всего. Берешь конкретно свою платформу и смотришь уже в ее спецификациях, какие гарантии предоставляются а они даже на десктопе достаточно скудные.
>>551201 Она 2004 года, описывается старый стандарт. Соответственно, в каждом втором примере оттуда будет говно наподобие NULL вместо nullptr, именованных функторов вместо лямбд, const вместо constexpr, ну ты понел.
Как из встроенного питона/луа получить доступ ко внутренним сиппшным переменным? Или так не делается и я могу только функции вызывать и забирать результат?
>>546742 (OP) помогите пожалуйста с программой у меня не работает функция пересечения двух множеств, причём если размер первого множества меньше размера второго, то у меня не полностью выводится второе множество, и если в двух мноествах встречается больше чем один одинаковый элемент, то выводится только первый элемент http://pastebin.com/jFNdkDcg
>>551228 Они в плане неизменных вещей все примерно одинаковые. Но учиться лучше сразу хорошим практикам, чтобы потом не узнавать с удивлением, что так, как ты, никто уже давно не пишет.
Решил в свободное от работы и пьянок время накодить какую-нибудь простенькую игрушку. Но вот встал вопрос, чтоб писать под DirectX надо сначала заботанить винапи или можно это пропустить?
Помогите пожалуйста нубу в домашнем изучении. Короч допустим у нас есть массив символов. char ARR = new char[SIZE];
Компилятор мне ругается на вот такую строчку ARR[1] = "a";
Мол invalid conversion from 'const char*' to 'char'
При этом, если я делаю ввод с клавиатуры, всё прекрасно работает и он записывает в элемент под номером 1 то, что я напишу. cin>>ARR[1]; Не понимаю, как так получается, помогите плз.
>>551648 Ну и вообще, чтобы накодить простенькую игру в свободное время, directx - очень оверкилл. Намного больше времени потратишь на его освоение и написание рендера, чем на саму игру. Бери готовый движок лучше или либу вроде sfml.
Господа, нужен ваш совет. Практикую классы в С++. Есть класс BankAccount, имеет три свойства. Этот класс имеет простой метод, это снятие денег со счета. Просто снять деньги получается, но я решил добавить проверку, что бы снимаемая сумма была не больше той, что есть на счету. И в случае, если сумма снимаемая больше имеющейся суммы, повторять ввод, пока не выполнится данное условие. И вот не получается нормально, первый раз когда я ввожу снимаемую сумму, происходит проверка, сумма снимаемая оказывается больше той, что имеем, и меня просят ввести снимаемую сумму еще раз. Я целенаправленно ввожу снимаемую сумму больше той, что имеем, и мне выводится инфа, что у меня от имеющейся суммы отняли сумму, которая больше чем кол-во денег, что мы имеем. Вот метод класса. http://pastebin.com/f0cDH9pf А вот весь проект, т.к. делал многофайловый проект. https://madokami.com/96iemv.rar IDE msvs2010
Учителка сказала, что не будет проверять мои Лабы на джаве, грит перекатываться на кресты. Подскажите необходимый максимум, чтобы программировать линейный, ветвящийся и циклический алгоритм в рамках laba3.cpp
Программаны, поясните про различие классов и структур. Есть ли какие-то серьёзные отличия в работе? Например, если надо будет создать парочку свойств в виде public, будет ли разница в работе программы между классом и структурой?
>>551750 >>551756 1е условие проверяет, что если введено число, которое больше баланса, вводить числа до тех пор, пока число которое ввели не будет меньше баланса. Т.е. баланс будет больше вводимого числа, 2е условие.
>>551855 >пока число которое ввели не будет меньше баланса Это repeat-until(condition) (которого в c++ нет, есть просто do-while(!condition)). do-while(condition) же повторяет цикл, пока условие верно (а не пока оно не станет верно).
Срочно прошу CLion-господ ответить мне на интересный вопрос — я должен каждый сорс файл вручную прописывать в cmakelists, или есть всё же более удобные альтернативы?
>>550849 Окей, спасибо за разъяснение. Если я пишу static, то где выделится память для массива/переменной? Алсо, попробовал сдать задачу, приписав static к объявлению массива - все тот же runtime error. Может я там в коде что-то делаю не так? Глянь, если не лень будет, пожалуйста.
>>551942 Не будь как маленький, поставь брейкпоинт сразу после аллокации массива. Если не доходит до него - проблема в массиве. Если доходит - где-то еще.
>>551908 При добавлении файла можешь указать галочку, он сам добавит сорцы. Но норм люди пишут симэйк обычно руками. Структура проекта: / /Logger/сорцы /Custom/Core /Custom/Plugins /writter/win/сорцы /writter/mac/сорцы
>>551969 Публичный член CEGun, возвращает bool, подчиняется соглашению о вызовах методов класса thiscall, когда указатель на объект, от имени которого вызывается метод, записывается в ECX.
>>551047 SDL не использовал, когда выбирал между ними больше понравился SFML, поэтому напишу только про него: 1) норм, проблем не было. 2) мне скорости хватало, рисовал все через VertexArray. Вообще странный вопрос, т.к. что SDL, что SFML просто обертки. 3) хз, вроде на форумах что-то было. НИНУЖНО/нормальному гую похую к чему прикручиватся. 4) вроде норм. Что не понравилось: у SFML нету нормальной матлибы, есть потешные структурки "типа" векторы, но без каких-либо методов/конструкторов. Стороннюю либу взять можно, но приходилось конвертировать свои векторы/цвет в это потешное говно. НАХУЙ ТАК ЖИТЬ. Был баг при потери фокуса окна, но его мгновенно пофиксили. Но вообще, достаточно симпатично.
Зазывают в достаточно крупную международную компанию POS/банковских сервисов. Прошел первый этап собеседования, выяснил для себя что кодить нужно на чистом Си.
Нет, я конечно писал на нем и много, но: может кто сталкивался - в чем специфика? Почему именно Си? Я как-то всегда наивно считал (до этого писал медийный хайлоад), что весь банковский софт пишется на плюсах и джаве. А вот оно как.
>>552465 Цэ - потому что быстрый. Не кресты - потому что тяжкий крест груз стандарта и обратной совместимости с Си и ненужных обвесков-заплаток, которыми никто не пользуется. 0x14 сейчас вроде актуальный стандарт, они в последних стандартах толковой хуеты надобавляли(лямбды, замыкания, moving semantics, constexpr, STL smart pointers, threads, hashtables) - но нужно во всём этом разбираться. Копаться в чьих-то сколь-нибудь сложных templates - это адский ад. Хотя сама штука весьма полезная и нужная по задумке, реалии мира же суровы. Квалификация нужна повыше, чем в Цэ соответственно. Иногда чистого Цэ хватает за глаза для определённых задач(где не надо ООП, полиморфизма). Например те же вычислительные/алгоритмические задачи, где надо пережевать огромный входной файл/базу во что-то полезное.
>>550770 >Никто минимальным размером стека особо не заебывается - его размера достаточно для того для чего он предназначен (хранения адресов возврата). Он также предназначен для локальных переменных(к примеру тех же временно живущих указателей, в которые распределяешь кучу, временных значений при вычислении) и передачи параметров(т.н. фреймов вызова функций) - и рекурсии соответственно.
>>552480 Тогда по старинке - комментируешь половину кода и посылаешь. Есть rt-error – ошибка в незакомментированном коде. Только сам сначала проверяй, что полученная каша запускается.
Пытаюсь освоить очереди, чет вообще пока грустно. Есть задача: Заявки 1-го типа поступают в "хвост" очереди по случайному закону с интервалом времени Т1, равномерно распределенным от 0 до 5 единиц времени (е.в.). В ОА они поступают из "головы" очереди по одной и обслуживаются также равновероятно за время Т2 от 0 до 4 е.в., после чего покидают систему. Найти, например, время прохождения 1000 заявок. Как-то запрограммировать? Очень желательно без stl
>>552719 Я думаю, что сначала лучше разобраться "как всё устроено", пописать свои pop-push/подобное руками, а потом уже stl использовать. Но вообще, я буду рад любому решению, которое я смогу понять, ибо задачка выше-это кусок большой задачи, которую мне потом нужно сделать.
>>552716 > без stl В твоей постановки он не нужен. Тебе не надо хранить очередь, нужна только её текущая глубина.
http://www.r-bloggers.com/simulating-a-queue-in-r/ Вот так, только на cpp. Хотя нахуй cpp, на R это проще, только при генерации времени следующего прихода/ухода вместо rexp() заюзай runif(). Я, когда писал дипломную, обернул тот код в функцию, которая принимает на вход функцию распределения времени прибытия и обработки событий и листы с параметрами для первой и второй функции и гонял с разными параметрами.
>>546742 (OP) Позавчера попалась книга Хакинг. Искусство эксплоита. Открываю значит, ознакомился с содержанием. Там язык С. Про который я думал, что он мертв. Неужели, чтобы понять и применить на практике(с целью ознакомления) все хуитки из книги я должен пердолить С? Все эти работы с памятью, эти сдвиги, че несут вообще. Никакой альтернативы нет? три курса хтмл+цсс и жбскрипта.
sdl - это палка и верека, исключительно подменяет прослойку между окноопй подсистемой и opengl, ну и пле немножко обработки ввода, евентов, таймеров и звука, но плохо, если надо лучше, надо вкорчивать в программу платформозависмые костыли сразу
sfml полноценный фреймворк, к тому же на крестах, а сдл на чистом си, впрочем там настолько все просто о и тупо что на крестах это не сделать даже если бы и захотели бы
Поясните, почему такая хуйня не работает. Я же получаю указатель на переменную, т.е., если изменится её значение, я узнаю об этом.
И как мне тогда реализовать такую схемку - вначале у меня кучу раз добавляется всё в этот map, а потом одним вызовом всё инициализируется? И все указатели, которые были получены до этого через Submit, мгновенно становятся валидными?
>>552947 Указатель указывает на какое-то место в памяти. В твоём случае он указывает в никуда. Возвращая его из метода ты копируешь его. А он всё так же указывает на пустоту. Как и с обычной переменной это твоя локальная копия. Если бы этот указатель указывал на определённый адрес в системе, то ты бы по нему менял объект по этому адресу. При этом сам указатель бы не менялся. Повторюсь, т.к. это просто копия. И эта копия хранится совсем в другом месте, нежели то, что в мапе или то что создано в методе. При условии, что отсутствует оптимизация компиля.
А вот сейчас осторожно. Для твоего воgроса о слежении за изменениями объекта по указателю тебе и нужно брать адрес этого указателя. И таким образом ты сможешь отследить появился ли объект там, куда указывал указатель. Изменился ли он и т.п.
И почитай много хорошей лит-ры. Этот код очень не хорош, за него даже не пизят по ебальнику, а просто закапывают :3 Сохранил твою структуру, чтобы тебе было проще понять как оно работает. На этапе обучения это важнее
Ещё забыл добавить, что твой возврат из метода map[key] тоже не очень хорошо. Если ты зайдёшь вот сюда http://en.cppreference.com/w/cpp/container/map , то увидишь "Search, removal, and insertion operations have logarithmic complexity". Это, увы, обозначает что ты потратишь в худшем случае log(map_size) времени на повторный поиск. А ещё учти посимвольное странение строк. Короче, проебёшь кучу времени. И от таких ситуаций оптимизация компилятора не спасёт. Поэтому теперь переводим свой взгляд на http://en.cppreference.com/w/cpp/container/map/insert и http://en.cppreference.com/w/cpp/container/map/emplace и видим что-то такое:
std::pair<iterator,bool> insert( const value_type& value ); ... Return value 1-2) Returns a pair consisting of an iterator to the inserted element (or to the element that prevented the insertion) and a bool denoting whether the insertion took place. 3-4) Returns an iterator to the inserted element, or to the element that prevented the insertion. 5-6) (none)
Вот. Отсюда, мы вернём указатель с гораздо меньшими затратами. Надеюсь не зря простыню написал и что-то ты понял :3
>>552963 Так у меня не этап обучения, а менеджер текстур. С условием, чтобы не было никакой подгрузки в рантайме. И с условием, чтобы одна и та же текстурка не грузилась дважды. А ещё с условием, что текстуры могут быть как ID3D11ShaderResourceView, так и ID3D12Resource, так и какой-нибудь OpenGL-овский unsigned int.
Ну ладно, с типами данных легко, можно создать map<string, void*>, возвращать этот же войд и делать reinterpret_cast в рендерере. Да, немного костыльно, но по-другому нельзя. Зато reinterpret_cast не ест тактов процессора.
Условие, чтобы она не грузилась дважды, сделать тоже легко - взять map с ключом - именем файла. И проверять на наличие в map этого ключа.
А вот что делать с отложенной инициализацией... Созданные текстуры раскиданы довольно много где.
Я думал о том, чтобы ввести систему ID текстур и просто получать их по ID. Да, неплохо, но оверхед пугает, да и друг сказал, что не нужно и можно обойтись. Жёсткий рантайм всё-таки.
Возвращать двойной указатель? Тогда и хранить двойной указатель нужно во всех местах, где он используется. А это выглядит не очень хорошо.
>>552965 Я знаю про логарифмическую сложность. Поэтому и взял map - в нём поиск всегда занимает логарифмическую сложность, что означает, что это будет происходить довольно быстро.
>>553052 Если static применён просто так, к глобальной функции - то это будет означать, что доступа к функции не будет из других файлов, она будет видна только в этом. Если в классе - то это будет означать, что не нужно создавать объект класса, чтобы вызвать функцию.
>>553066 Хуйню написал. static для нелокальных сущностей deprecated, следует использовать анонимные пространства имен, если хочешь запретить доступ из других файлов.
>>553156 Хм, ну да, формально все верно. Но энивей лучше не использовать, когда есть возможность в анонимные пространства имен, они же более наглядны у static вообще сильно многозначная семантика.
2 Вопроса к знающим господам (спрошу у вас, потому что все вы наверняка знаете Си): почему компилятор не выдает ошибку, когда я пытаюсь положить значение в область памяти, которая моей не является? вот код: int mas=(int)calloc(10,sizeof(int)); int mas2[10]; if (mas!=NULL) { mas2[10]=1; mas[10]=1; } 2) является ли эта ситуация undefined или unspecified behavior?
>>553256 > почему компилятор не выдает ошибк Компилятор не следит за границами массивов. Это UB. UB даже просто установить указатель за границы выделеного именно для этого указателя массива памяти, за исключением одного элемента следущего прямо за выделеным блоком. Тоесть mas+=10; - норма, mas+=11; - UB, *(mas+10) - UB.
Как можно в C/C++ открыть RTMP-стрим и выводить видео на экран? В гугле по запросу с rtmp ничего по теме не гуглится. Нашел, что можно вывести через directshow, но мне бы кроссплатформенное что-нибудь.
>>553168 Не, я в том смысле, что одно и то же ключевое слово, в зависимости от контекста, означает разное. Это вообще довольно больное место C++, потому что из-за static, или, например, virtual которое может обозначать как виртуальный метод, так и виртуальное наследование грамматика не является бесконтекстной, и разбирать ее сложнее. И компиляция замедляется.
>>553265 за исключением одного элемента следущего прямо за выделеным блоком - почему так?? там же уже мусор лежит и это не выделенная память? получается, я могу положить любое значение в любой участок памяти, выделенной процессу (и на стеке и в куче), если он уже не используется мной же?
>>553311 > там же уже мусор лежит и это не выделенная память? Ты не знаешь, что там лежит, т.к. не можешь разыменовывать указатель. > за исключением одного элемента следущего прямо за выделеным блоком - почему так? Потому что массивы принято описывать как полуоткрытые интервалы.
>>553342 >>553345 > If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined. 5.7(5)
>>553349 Потому что размер массива в общем случае известен только в рантайме. Ты можешь сказать, что в твоем конкретном случае это не так, но компилятор статическим анализом не занимается, и он понятия не имеет, заходишь ли ты за границы массива или нет.
>>553311 > за исключением одного элемента следущего прямо за выделеным блоком - почему так Чтобы в цикле можно было удобно пройти по выделеному блоку памяти, что-то типа for(i=0, i <size; i++), где i - указатель. На последней итерации указатель станет указывать на участок памяти сразу за выделеным, что доспукается, но разименовывать уже нельзя. И дальше передвигать нельзя. Есть системы где сама ОС следит чтобы ты не вылез за выделеный буфер, я деталей не знаю, но там наверное указатель не просто переменная с адресом, а объект который выдается системой (типа мьютекса), и система следит как ты с ним работаешь. Если ты запросил указатель для работы с блоком памяти то при попытке передвинуть указатель вне блока система пошлет нахуй. > я могу положить любое значение в любой участок памяти, выделенной процессу Вообще да, но могут всплыть нюансы. Гугли "переполнение буфера".
>>553354 Ты не понял, что это значит. Это значит, что если прибавить к адресу последнего элемента единицу, то переполнения не случится, то есть нельзя расположить массив в памяти по адресам N - последнее возможное число. А вот по адресам N - последнее возможное число минус один - можно.
>>553363 > никто не запрещает Угу. Но и никто не гарантирует. Указатель, полученный из рандомного числа не является safely-derived и его поведение unspecified.
>>553354 Если вкратце, что гарантирует стандарт: можно присвоить указателю что угодно, все будет WB. Можно разыменовать указатель на существующий объект, WB. Можно сравнивать указатели на любые корректные объекты при помощи == друг с другом и с nullptr, будет WB. Можно сравнивать при помощи <, >, <=, >=, но WB будет только если это элементы одного массива, либо точка сразу за концом массива (поэтому и гарантируется отсутствие переполнения по твоей цитате - чтобы можно было пройти по массиву, сравнивая с точкой за его концом, чтобы вовремя остановиться), либо члены одного объекта. Для всех прочих указателей сравнение будет unspecified behaviour, т.е. программа корректная, но конкретный результат неизвестен и зависит от реализации.
>>553357 Не совсем так. Дальше передвигать можно, без разыменования UB не будет в любом случае. Но отсутствие переполнения уже не гарантируется, т.е. в указателе может появиться теоретически рандомный адрес, ну как если бы ты без инициализации его определил, с мусором. Вроде все корректно, но использовать нельзя.
>>553361 >Ты не понял, что это значит Я прекрасно понимаю что это значит. Это пункт об арифметике указателей и о том, когда и что можно к ним прибавлять. Так вот, прибавлять к указателю можно когда он является указателем на элемент массива и так, что можно вылезти только на один элемент после конца массива. Всё остальное — UB.
>>553358 Он может заниматься, но не обязан. Даже в случае ill-formed программы стандарт не всегда требует диагностики, а уж отслеживать предполагаемое UB в рантайме точно от компиляторов не требовалось и не будет.
>>553384 Нет же. Переполнение возможно, но это нихуя не UB. Если ты сложил два MAX_INT, то UB не будет, ты просто данные свои же попортишь. Тут то же самое.
>>553382 Зауисит от компилятора. Если запустишь шланг с какими-нибудь опциями проверки нелегального доступа к памяти, то возможно он во время запуска сообщит. А может какой-нибудь компилятор и просто с -Wall -Wextra даст ворнинг, хз. А может ты попытаешься обратиться к памяти, которая принадлежит не твоей программе, и тебе операционка завершит твою прогу.
>>553376 Unspecified это не критично же, программа не поломается, если ты знаешь, что делаешь. Если ты сделал двойной каст в исходный тип через тип большего размера, то ты пройдешь через unspecified и вереншься в нормальное поведение, гарантированно. А если ты попытаешься приойти так через undefined, то это некорректно, потому что все может нахуй сломаться.
>>553399 Блджад, покурил стандарт и таки да. Мне всегда казалось, что это unspecified. Энивей, "most existing implementations of C++ ignore integer overflows".
>>553384 Неа. Остальное UB - только если действительно случится переполнение. А если не случится, то никакого UB. Так что эта хуйня рандомно в реальном мире скорее всего никогда может превратиться в UB, типа такого
if (get_random_int() == 100500) { invoke_undefined_behaviour(); }
>>553402 >Неа Ты не понимаешь, к чему относится "otherwise". Оно относится к "If both the pointer operand and the result...", а не к "shall not produce an overflow".
>>553404 По факту никто не следит, всем похуй, и просто портятся данные, с отбрасыванием старшей единицы. А в стандарте это типа как отказ от ответственности.
>>553401 >most existing implementations of C++ ignore integer overflows Я уверен, что это не совсем так. Как минимум выдача ворнингов, если статический анализ выявит, что переполнение гарантированно будет - что-то типа MAXINT + MAXINT прямо в коде. А иногда еще какие-нибудь компиляторские оптимизации производятся на основании того, что если овервлоу, то это UB. А еще я сейчас опять подумал и припомнил, что где-то читал, что UB это переполнение то ли только signed чисел, то ли только unsigned. Не помню, каких именно.
>>553404 Вообще процессор за этим следит и в случае переполнения ставит флаг, что случилось переполнение. C и C++ вроде как не предоставляют возможности работать с этим флагом. Так что в реальном ирл мире если у тебя в программе складываются два числа и случается переполнение, и язык у тебя используется не какая-нибудь Джава, а что-то типа C или C++, то вероятно оно переполнится, и язык на это не обратит внимания, и программа дальше будет работать.
>>553407 Зависит от. Можно компилировать с флагом защиты от переполнения, плюс ос может вскукарекнуть, если ты, например, залезешь на адрес возврата. А может и не вскукарекнуть.
>>553410 Статический анализ это да, но в целом я не могу представить реализацию, когда случится что-то плохое от присваивания указателю рандомного значения, хоть даже запрещенного/с переполнением. Ну, только если это специально вставлять код, который будет это отслеживать и срать в кашу неаккуратным погроммистам.
>>553402 >>553406 Вот, сишная версия этого утверждения. Она-то точно однозначно трактуется. Unless both the pointer operand and the result point to a member of the same array object, or one past the last member of the array object, the behavior is undefined
>>553406 Ладно, ты прав, там так написано. Но 1. Я не уверен, так ли это в C++, а еще я где-то что-то читал, что вроде противоречит этому, так что хуй знает 2. Я это вообще нашел в каком-то там The New C Standard, и я хуй знает, что это такое 3. Стоило привести весь абзац от начала, чтобы было понятно, что речь вообще про математические операции плюс и минус между указателем и числом.
>>553419 >Стоило привести весь абзац от начала, чтобы было понятно, что речь вообще про математические операции плюс и минус между указателем и числом. Ну а как ещё получить указатель на конец массива, кроме как прибавляя к указателю на начало длину массива?
если прибавить или отнять сколько-то от указателя на сишный массив, не на что-то другое, так вот - прибавить или отнять столько, что результат не вписывается в [начало массива; конец массива плюс 1], то это UB.
Это в C++ стандарте.
для >>553421 про разыменование там ничего не сказано
Но я на 100% уверен, что разыменование конца массива плюс один, если ты на эту ячейку получил указатель не каким-то другим способом, то если не через какую-то другую переменную, это UB
>>553432 Чтоу? Стандарт определенно где-то говорит, что в случае такого разыменования поведение не определено. Просто не в том месте, которое приведено тут. Ведь это место - оно про операции сложения и вычитания.
>>553434 Сишный стандарт говорит " If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined. If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated." В C++-стандарте последнего предложения нет. Вот и думай тут.
>>553439 Очевидно, C++-ный стандарт просто по-другому структурирован. А в C-стандарте получается это написано в двух местах - ведь в описании оператора * унарного наверняка написано, что если он не указывает на подходящий объект, то UB.
>>553441 Ну вот есть такое: If an object of type T is located at an address A, a pointer of type cv T<star> whose value is the address A is said to point to that object, regardless of how the value was obtained. [ Note: For instance, the address one past the end of an array (5.7) would be considered to point to an unrelated object of the array’s element type that might be located at that address. There are further restrictions on pointers to objects with dynamic storage duration; see 3.7.4.3. — end note ]
>>546742 (OP) http://pastebin.com/ameqBHY9 помогите плиз, не корректно работает программа, хотя код вроде бы правильный мне нужно создать массив, в котором находятся элементы, которые содержатся в двух множествах если общий элемент один, то всё верно, а если их несколько, то программа не работает, что не так?
>>553809 Если ты на cout пишешь юзай cout.imbue() передавая туда объект C++ локали. Попробуй разные локали - на винде win1251, dos866 пробуй, не помню какая уже.
>>553895 Ну давай разберем по частям тобой написанное. Складывается впечатление, что ты вообще не имеешь представления о безопасности исключений. В конструкторе set ты память выделил? Выделил. А что будет, если T выбросит исключение в операции присваивания, ты подумал? Потечет твой массив из памяти, как твоя мамка при виде куска сала, ибо объект не будет считаться созданным, и деструктор не вызовется.
>>554439 Кроме Spirit есть еще несколько реализаций генераторов лексических парсеров (lexer один из них называется или что-то вроде этого). Задаешь грамматику в БНФ вроде. Погугли lexical parser generators У них свои плюсы/недостатки перед Spirit. Например, не надо ебаться с шаблонным метапрограммированием.
Поясните, где прочитать (или тут) про цикл for. Прям подбробно, как он выглядит изнутри. Допустим, цикл принимает вот такое for( действие; действие; действие, действие) но ругается на такое for( действие, действие; действие; действие)
Страуструпа в ОПпосте открывал, там подробностей нет, в гугле тоже инфа уровня for(тут можно задать перменную; тут условие; тут инкремент)
>>554523 Потому что "," - это "оператор запятая", который действует так: вычислить выражение до запятой, вычислить выражение после запятой и вернуть его. Поэтому i=0,j=0 работает. Но ты пишешь типа, это уже не "оператор запятая", а разделение имен переменных в объявлении. Поэтому "int i=0, int j =0" не работает. Точно так же, как не работает в отдельной строчке:
int main() { yoba(); int i=0, int j=0; yoba2(); }
Зато for(int i=0,j=0;...) работать будет по той же причине, что и работает
>>554601 Открываешь его как ifstream и читаешь, это обычный файл же. Алсо, если тебе просто нужно рандомное число, используй встроенный генератор std::mersenne_twister_engine, например.
>>554779 Ну почему же. Если ты хочешь повторно использовать мономорфный код, то правильно будет просто сделать именованный функтор. Но вообще это дело вкуса, делай, как тебе удобно.
>>554779 Нет, не отжили, но их сильно потеснили. Лямбды - для анонимного inline определения функтора, используемого на месте, это нужно для алгоритмов в основном. Еще у лямбд замыкание есть, а это экономит время - и может даже быстрее выполняться(если оно реализовано ссылкой на стек, вместо копирования переменных). Если же функтор не привязан к окружающему коду(используется вне контекста алгоритмов), и является обычной функцией с состоянием - то можно его объявить и классически.
>>554830 Где можно почитать про lvalue/rvalue/xvalue, чтобы понять это дерьмо? Сколько ни пытался понять - так и не выходит. Просто не у кого больше спросить.
>>554832 Ты должен понять мотивацию. Мотивация простая - тебе нужен механизм детектирования "временных" объектов - которые сдохнут в этой же строке от "постоянных", которые еще поживут. Зачем? Ради скорости. У временного объекта ты можешь забрать все ресурсы, все равно он труп, а вот из постоянного объекта все придется или копировать или еще как извращаться. Например в выражении `y=f(g(x))` результат g(x) тут же сдохнет, не дожив до следующей строки. А вот `y` эту строку переживет. И вот механизм детектирования заключается в том, что временные объекты являются rvalue references (обозначаются они не int&, а int&&). Это значит, что они могут существовать только справа от знака присваивания. Поэтому, сделав конструктор, принимающий rvalue-ссылку, ты можешь быть уверен, что ты принимаешь временный объект, который сдохнет и делать ты с ним можешь что хочешь. Например, забрать у него все unique_ptr и толстые векторы через std::move. Это - мотивация, поэтому почитай о move-семантике и сделай класс, который может move'иться. А lvalue/rvalue/xvalue оставь разработчикам компиляторов С++.
Двачик, помоги с лабой пожалуйста. Задание: Распечатать только простые числа в диапазоне от 1 до N. Вот мой код: #include <stdio.h> #include <iostream.h> #include <math.h> #include <conio.h> void main() { clrscr(); cout <<"Lab-02"<<endl; cout<<"Zadacha-6"<<endl; int N,k,count,d; cout <<"N = "; cin>>N; for (k=1;k<=N;k++);//Generator chisel ot 1 do N { count=0;//kol-vo delitelei priravnivaem k 0 for (d=2;d<=k;d++)//Generator delitelei ot 2 do k if (k%d==0) count++;//yvelichivaem kol-vo delitelei na 1 printf("%4d ",count); if (count==2) //ecli 2 delitelya - chislo prostoe printf("%4d",k); //vivodim k } getch(); }
>>555043 Что нет-то? Обоснуй. Суть rvalue - что не нужно временный объект создавать/копировать(он всё равно справа от присвоения будет), можно запихнуть сразу в левую часть присвоения(т.е. компилер может передать в функцию указатель, вместо возврата и копирования/переноса объекта). В чём я не прав?
>>555047 >cout вместе с printf >i++ вместо ++i >код не отформатирован >стало лень разбираться facepalm.jpg Решето эратосфена возьми рабочее, скопипасти и заюзай.
>>553401 >Блджад, покурил стандарт и таки да. Мне всегда казалось, что это unspecified. Энивей, "most existing implementations of C++ ignore integer overflows".
СУРЬЁЗНО? Я может неправильно понял? У меня есть код, в котором (не один раз) встречаются (упрощённо) следующего вида циклы for:
Я хочу проходить по 4 значения array, присваивая им текущее значение счётчика. Array состоит из четырёх миллионов значений. За счёт ++i вместо i++ я хочу выиграть миллисекунду, я жадный.
В самую первую итерацию в первый инкремент у меня происходит переполнение i с size_t_max до предполагаемого нуля. И в MSVS Express 2013 это работает ровно так, как я и ожидал -- обращается к array[0] и т.д. Тем не менее, вопросы:
std::size_t i = static_cast<std::size_t>(-1); ++i;
1) Это UNDEFINED behaviour? да/нет 2) Это unspecified behaviour? да/нет 3) Можно привести прямую цитату из стандарта, разъясняющую этот момент?
И молвить трудно. Ты на костыле
Вновь самокат приладил, нечестивый!"
Мы оказались в метафункций мгле.
Стонало эхо крестоблядков голосами,
Увязших в коде, как комар в смоле.
Взглянув окрест, я вмиг поник глазами:
Шаблоны, источая тяжкий смрад,
Лежали над несчастными пластами.
Внизу ж, суливших, что определят
В compile-time размер факториала,
Толпа, снося ошибок жутких град,
Сквозь стон Александреску проклинала.
Литература:
Для нюфань:
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Стэнли Липпман, Жози Лажойе и Барбара Му - Язык программирования C++ (2014) - https://goo.gl/kVaela
Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u
Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2011) - https://goo.gl/nAFUXa
<устарело> Герберт Шилдт - C++. Базовый курс (2010) - https://goo.gl/qMLAFl
<устарело> Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - https://goo.gl/QvjR6x
Учимся не писать говнокод:
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все.
Скотт Мейерс - Эффективное использование C++ (2005) - https://goo.gl/wsDXGz
Скотт Мейерс - Наиболее эффективное использование C++ (1996) - https://goo.gl/tHa0tO
Скотт Мейерс - Effective Modern C++ (на ангельском) (2015) - https://goo.gl/uImH0J
Скотт Мейерс - Эффективное использование STL (2002) - https://goo.gl/QtS8Dc
Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ (2005) - https://goo.gl/Cpk4YR
Наиболее детальные описания языка:
Бьерн Страуструп - Язык программирования C++ (на ангельском) (2013) - https://goo.gl/XkAiOX
<устарело> Бьерн Страуструп - Язык программирования C++ (2010) - https://goo.gl/iZBDiV
Стандарт C++14 (на ангельском) - https://github.com/cplusplus/draft/raw/master/papers/n4140.pdf
Последняя на данный момент версия черновика стандарта C++17 (на ангельском) - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4527.pdf
Тонкости языка (для гурманов):
Андрей Александреску - Современное проектирование на C++ (2002) - https://goo.gl/e1V5BC
Герб Саттер - Решение сложных задач на C++ (2002) - https://goo.gl/iWaa6S
Герб Саттер - Новые сложные задачи на C++ (2004) - https://goo.gl/4nn512
Также для легкого чтения подойдет книжка c историей создания C++:
Бьерн Страуструп - Дизайн и эволюция C++ (1994) - https://goo.gl/FqbPwo
Отдельные аспекты:
Читать по необходимости.
Энтони Уильямс - Параллельное программирование на C++ в действии (2012) - https://goo.gl/qJfBkD
Николаи Джоссатис - C++. Стандартная библиотека (2012) - https://goo.gl/PEyiMH
Дэвид Вандевурд, Николаи Джоссатис - Шаблоны C++. Справочник разработчика (2003) - https://goo.gl/0M4NpG
Роберт Седжвик - Фундаментальные алгоритмы на C++ (2001) - https://goo.gl/4jwxSl (части 1-4), https://goo.gl/yDuQgG (часть 5)
Ариндам Мукерджи - Learning Boost C++ Libraries (на ангельском) (2015) - https://goo.gl/b0gPN1
Блоги:
Годный блог, в котором все просто и понятно тян не нужны кококок борщ - http://alenacpp.blogspot.ru/
Краткие описания библиотечных функций и контейнеров - http://ru.cppreference.com/w/
Блог Герба Саттера (на ангельском) - http://herbsutter.com/
Блог Скотта Мейерса (на ангельском) - http://scottmeyers.blogspot.ru/
Куда писать код:
Под шиндошс удобно использовать IDE Microsoft™ Visual Studio®. Базовую версию (2015 Community) можно бесплатно скачать, следуя инструкциям с этой страницы: https://www.visualstudio.com/ru-ru/products/free-developer-offers-vs.aspx. Чтобы начать писать код, нужно запустить Visual Studio, кликнуть "Файл - Создать - Проект - Пустой проект", после создания кликнуть слева правой кнопкой мыши по пункту "Файлы исходного кода", выбрать "Добавить - Создать элемент - Файл C++". Свои хэллоуворлды писать в этот файл, в дальнейшем можно добавить другие файлы и хедеры. Чтобы скомпилировать и запустить проект, нужно нажать "Сборка - Собрать решение", а затем "Отладка - Запуск без отладки".
Под *nix, как правило, уже предустановлен компилятор gcc (если нет, используй sudo aptitude install gcc), так что достаточно сохранить хэллоуворлд, набранный в текстовом редакторе, и выполнить g++ helloworld.cpp и ./a.out. Но удобнее установить какую-нибудь IDE, например, Code::Blocks (sudo aptitude install codeblocks) и работать в ней.
Можно также не устанавливать ничего, а запускать свои хэллоуворлды на http://ideone.com, выбрав в левом нижнем углу язык C++14.
Софт и библиотеки:
IDE, призванная похоронить Visual Studio пока не особо получается. Удобные свистелки и перделки присутствуют. Тормоза и баги пристуствуют. Кросплатформенность присутствует - https://www.jetbrains.com/clion/
Статический анализатор, который умеет находить в коде ошибки и неоптимальные места. Швабодный. Есть плагин для Visual Studio - http://cppcheck.sourceforge.net/
Детектор утечек для Visual Studio. Предельно прост в прикручивании - https://vld.codeplex.com/
Гугловские утилиты для контроля корректности кода - https://github.com/google/sanitizers
Гугловский фреймворк для автоматизации тестирования - https://code.google.com/p/googlemock/
Йоба-набор библиотек, способный удовлетворить даже самые скотские фантазии - http://www.boost.org
Библиотека для удобной высокоуровневой работы с сетью - https://casablanca.codeplex.com
Простая в обращении библиотека для работы с графикой и аудио - http://www.sfml-dev.org
И многое другое - http://en.cppreference.com/w/cpp/links/libs
Памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Старший брат:
Предыдущий: