И я увидел, долгий взгляд вперяя, В stderr погрязших мыслям вопреки: Была свирепа их толпа дурная.
Визжа, на стол роняли кулаки, То лоб клавиатурой разбивая, То мыши норовя изгрызть в клочки.
Учитель молвил: "Сын мой, здесь страдают Те жалкие, кто выбрал путь крестов. На гуще из compile-errors гадают
Несчастные. О них довольно слов."
Литература:
Для нюфань: Три классических учебника для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется. Герберт Шилдт - C++. Базовый курс (2010) - http://goo.gl/qMLAFl Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - http://goo.gl/QvjR6x Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u Для желающих сразу начинать с Откровений Создателя - классика (может показаться суховатым): Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2009) - https://goo.gl/87qXtW
Учимся не писать говнокод: Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все. Скотт Мейерс - Эффективное использование 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) - http://goo.gl/0M4NpG
Под шиндошс удобно использовать 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.
Памятка:
Вопросу по синтаксису идут на хуй. Лабы идут на хуй. "Как мне сделать Х на чистых крестах без библиотек" идут на хуй. Все идут на хуй. Хейтер сосет члены на пару со своей мамашей.
>>525241 Черновики стандарта на ангельском, которые в третьем пункте литературы. В них можно уточнить самые детали от безысходности, если больше нигде инфы не находишь.
Поясните за колбэк. Да, я понял что это грубо говоря функция которая вызывается во время наступление некоторого события, это если объяснять словами. Но вот как это все реализовано, у меня в голове не укладывается. Всюду простые примеры кода типа такого(пикрелейтед) Здесь просто вызывается функция ссылку на которую содержит указатель на функцию. Но в таком примере можно это можно заменить непосредственным вызовом функции, да и всё. Непонятно когда именно очень необходим этот самый колбэк. И еще. > которая вызывается во время наступление некоторого события
Неясно каким это магическим образом оно узнает что событие наступило. Оно что запускает в потоке бесконечный цикл и все время проверят наступило ли событие(например нажатие мыши) или как? Как это физически происходит? Как оно узнает какую именно функцию ей нужно вызвать в том или ином случае?
>>525225 (OP) >Под шиндошс удобно использовать А почему в IDE про Eclipse ничего нету? Он неудобный? Там вроде даже рефакторинг какой-то из коробки и Git. /мимонафаня
>>525307 Профит в том, что ты можешь передать указатель на свою функцию куда-то, и там, имея этот указатель, и зная какие аргументы ей можно передавать, ее могут вызывать когда пожелают передавая в аргументы что-нибудь полезное.
Можно показать на примере куска кода регистрации обработчика событий окна шиндовс: http://ideone.com/qzuf7T
>>525315 > и там, имея этот указатель, и зная какие аргументы ей можно передавать, . Что-то еще более не понятнее стало. Почему бы просто не вызвать функцию и передать те же аргументы. > ее могут вызывать когда пожелают передавая в аргументы что-нибудь полезное Как вызов то происходит, как система узнает что вот сейчас пора вызывать, а когда не надо?
>>525321 > Как вызов то происходит, как система узнает что вот сейчас пора вызывать, а когда не надо? на очереди тредик висит и выковыривает из неё сообшченьицца
>>525321 >Как вызов то происходит, Ты передал указатель. С его помощью можно вызвать. >, как система узнает что вот сейчас пора вызывать, а когда не надо? Система сама решает, что пришло время о чем-то сообщить.
>Почему бы просто не вызвать функцию и передать те же аргументы. Допустим, твое приложение хочет узнать где в данный момент находится указатель мыши на окне, которое ты создал.
Ты подписываешься на это сообщение - каждый раз как пользователь будет перемещать мышь, ОС совершит вызов твоей функции, и передаст в качестве аргумента координаты курсора.
Можно было бы опрашивать ОС о координатах раз в секунду, но это не так эффективно, поскольку курсор движется быстро по экрану, а пользователю твоего окна придется ждать когда твое приложение отошлет запрос и обработает положение мыши на экране. К тому же, ты будешь опрашивать ОС даже тогда, когда курсор находится за пределами твоего окна, а это неэффективно.
>>525307 Ты не забывай еще, что хотя бывают указатели на методы, наподобие int (TvoyaMamka::*) (int), делать их коллбэками нельзя, тому що вызов методов не совместим ни с какими соглашениями о вызовах VC вон указатель на this передает вообще в регистре. И даже если метод статический, хотя по факту он везде будет нормально работать как коллбэк, если объявить его с _cdecl соглашением о вызовах, стандарт запрещает делать его коллбэком все равно, ибо нехуй. Используй глобальные функции, будь алтфаком.
>>525321 Самая банальная ситуация - у тебя есть какой-нибудь libcurl библиотека для работы с http, написана на pure c. Ты хочешь скачать этот тред при помощи своей программы. Поскольку pure c не может в std::string, он хочет писать код страницы в обычный char . Но буфер из ограниченного по размеру char передавать ему некошерно, ибо тред может быть большим и не влезть в него. Что делать? Ответ прост - ты передаешь в libcurl собственную функцию-обработчик потока символов, который генерится из кода страницы. Этот обработчик знает, куда пихать символы, он может юзать std::string, или уточнить размер буфера, или еще что-то придумать. Важно, что библиотека не может знать всего, поэтому она передает ответственность за схоронение твоему коллбэку, и дальше ее не ебет.
Если весь код твой, то, в принципе, можно обойтись без коллбэков. Если библиотека новая и на крестах, то тоже. Коллбэки же нужны именно для работы с чужим кодом на pure c, и вообще на других языках.
>>525419 Я делал и такие: setlocale(LC_ALL, "rus"); setlocale(LC_ALL, "russian"); Всё равно не работает как надо. А что в консоли делать? Я в гугле читал про: SetConsoleCP(1251); SetConsoleOutputCP(1251); Оно? Но не совсем понял куда вставлять.
Где найти все понятия по С++? Все эти инициализация, объекты, типа, литералы етц? Я учебник страуструпа читаю, там есть далеко не все понятия, а некоторые немного размыты.
Поясните, я сделал программку с учебника, но она получилась очень громоздкой с кучей копипасты. Я подумал - можно ли как-то было укоротить решение? Но так, чтобы использовать только простые, стандартные функции, типа if или while? А так же тип стринг. https://ideone.com/s591kt Сама задача: Напишите программу, предлагающую пользователю ввести определенное коли- чество 1-, 5-, 10-, 25-, 50-центовых и долларовых монет. Пользователь должен по отдельности ввести количество монет каждого достоинства, например “Сколько у вас одноцентовых монет?” Результат должен выглядеть следующим образом. У вас 23 одноцентовые монеты. У вас 17 пятицентовых монет. У вас 14 десятицентовых монет. У вас 7 25-центовых монет. У вас 3 50-центовые монеты. Общая стоимость ваших монет равна 573 центам. Усовершенствуйте программу: если у пользователя только одна монета, выве- дите ответ в грамматически правильной форме. Например, “14 десятицентовых монет” и “1 одноцентовая монета” (а не “1 одноцентовых монет”). Кроме того, выведите результат в долларах и центах, т.е. 5,73 доллара, а не 573 цента
>>525382 Я всё понял :3 >>525336 То есть система несет ответственность за то когда курсор дернется и когда это произойдет она передает ссылку на свою функцию как аргумент в мою функцию, которая выполняется в отдельном потоке? >>525386 Это же другая ситуация, если нам просто нужно подставить свою реализацию в некоторую функцию. Вот в вики написанно:
Об обратном вызове можно думать как о действии, передаваемом некоторой основной процедуре в качестве аргумента. И это действие может рассматриваться как:
1. подзадача и использоваться для обработки данных внутри этой процедуры; 2. «телефонная связь», используемая для того, чтобы «связываться» с тем, кто вызвал процедуру, при наступлении какого-то события (англ. callback дословно переводится как «звонок обратно»).
>>525493 >Я подумал - можно ли как-то было укоротить решение? >Я функции еще не изучал. >Вынеси поворяющийся код в функции форман джипег. Вот иди изучи и упростишь
>>525499 На самом деле это концептуально одно и то же. Чужой код не знает как совершить действие и использует твой "обработчик". А что конкретно он делает - обрабатывает данные или обращается к тебе - это уже дело десятое.
>>525499 >То есть система несет ответственность за то когда курсор дернется и когда это произойдет она передает ссылку на свою функцию как аргумент в мою функцию, которая выполняется в отдельном потоке?
То есть система вызывает метод в библиотеке (которая отвечает за работу с UI), когда ты дернул мышь: void mouseMoved(int x, int y);
анон, помогай, у меня трабл с файловым выводом. Вывожу в файл экземпляры класса second, производного от first, все идет норм, выводится, читается, до тех пор, пока я не делаю функции базового класса first виртуальными, после этого ни в какую не читает экземпляр из файла. какой там танец с бубном нужно станцевать?
>>525581 >некоторые любят С принятием C++11 эти некоторые оффициально считаются говноедами. Если раньше альтернативой было только const TvoyaMamka kukareku, которую хуевый компилятор уносил в рантайм даже если она использовалась только как константа времени компиляции, то теперь есть православный constexpr, для которого не сгенерируется никакого кода, и при этом не будет проблем с областью видимости и статическими проверками типов, которые есть у #define.
>>525508 Всё, теперь вроде наконец понял. Есть метод в системе который заточен для того чтобы добавлять субскрайберов(указатели на функции) на метод изменения координат курсора - этот метод взаимодействует с этим списком субскрайберов и когда мышь изменяет координаты выполняет каждую из функций, которые были на него подписаны, а уже что там за реализация не имеет значения для этого метода.
>>525621 Можно в дальнейшем заменить пустоту на #define kukareku c + же. Если написать a + kukareku + b, то для пустоты не сработает, а так можно добавить любое количество слагаемых.
>>525675 похуй же. Говно какое нибудь делает. А программистом любой аутист с гуманитарным образованием сможет стать при должном усердии и наличии интернета.
Есть что почитать про правильное и неправильное использование инклудов, а то я заебался с этими "does not name a type", "has no member named", "expected primary-expression before 'int'" и остальными ошибками из-за неправильного использования инклудов. Вроде и везде гарды стоят, но все равно говно получается.
>>525747 В начале каждого .h ставишь #pragma once, либо весь файл целиком в include guard. Константы у include guard не должны, блджад, повторяться, поэтому в подавляющем большинстве случаев удобнее не следить за этим, а использовать прагму кококок нестандарт символические ссылки.
Итак, в каком-то .h описан твой класс. Если ты, хуила, вынес из класса определение метода, но оставил его в том же .h файле, а не перенес в соответствующий .cpp, то подставляй свою сраку - это говно иногда будет компилироваться, а иногда нет.
Где-то в другом файле ты хочешь использовать свой класс TvoyaMamka. Если он используется только в сигнатуре функции, или ты используешь ссылку/указатель на него, но не обращаешься к его членам, то достаточно в начале файла написать class TvoyaMamka, то есть, просто объявить его. Никаких инклудов делать не надо, понял епту?
А вот если ты в новом файле наследуешься от него, хранишь или создаешь его экземпляры, обращаешься к членам - короче говоря, делаешь что-то, для чего нужно знать внутренности или размер этого класса, то ты должен в начале нового файла написать include.
Если у тебя возникла ситуация, когда файлы инклудят друг друга, то у меня для тебя плохие новости - ты долбоеб. Чтобы избавиться от циклического включения, необходимо выбрать из этих двух файлов "главный". В "главном" файле ты оставляешь инклуд "неглавного", а в "неглавном" приводишь код к такому виду, чтобы, блядь, инклуд "главного" не требовался - переходишь к указателям, выносишь все говно в .cpp и так далее. И потом вместо инклуда "главного" просто объявляешь его с помощью class.
Это далеко не все, но достаточно, чтобы ты не срал в штаны слишком уж часто.
>>525764 А если у меня есть три файла A.h, B.h и C.h, причем А и B используют говно из С stdlib, например, а у класса в А есть член-экземпляр класса из В, то только А должен иметь инклуды оставшихся двух?
>>525764 Чему в новом стандарте не откажутся от .h и всей сопутствующей ебли зависимостей? Почему не позаимствуют опыт других языков, например того же шарпа, в котором компиль справляется с генераций без всяких дополнительных заголовков?
>>525777 Обратная совместимость потому что. А в плане опциональной поддержки вроде что-то замышлялось, но вряд ли это будет до C++20. >>525776 Тогда в A включен B, а A и B могут при необходимости включать C, но по возможности следует этого избежать. Например, подключать stdlib транзитом это плохой тон. Нужны тебе куски stdlib в A - подключай их непосредственно в A. Это уменьшает зависимости же, вдруг ты потом решишь переделать C, чтобы он не использовал stdlib.
>>525490>>525502 Ребята, это Страуструп для ньюфагов, будьте снисходительны. Страуструп сначала заставляет перекусить ржавую трубу собственным анусом, и только потом рассказывает про ножовку где-то страниц через сто.
>>526098 А Лафоре/Прата рассказывают только про ножовку, информация про ржавые трубы стыдливо спрятана в конце книги, а о том, что у человека есть анус, не упоминается вообще.
>>526134 ну тем не менее это нужнее, и после них Стратоуструпа можно просто пролистать просмотреть листинги. У меня первой книгой был как раз Стратоуструп, и я наверное целый месяц осмысливал первую программку где калькулятор предлагает сделать.
>>526210 >осмысливал первую программку где калькулятор предлагает сделать не понял как на это реагировать, ты ебанутый(да)? в основном тебе нужно было понять как работать с классами(начально) и разбивать программу на функции. ВСЕ, там даже задания не нужно делать, если ты все понял, потому что они настолько ебанутые, что иди нахуй просто.
>>526224 Я никогда не пользовался, самому интересно. Но вроде это какая-то ебала, хороша только когда очень много гигантских хедеров, ибо из-за предкомпиляции накладываются ограничения.
>>526350 Побитовый сдвиг числа влево и вправо. Например, у тебя есть char tvoya_mamka = 3, это 00000011 в двоичной системе. Ты пишешь char tvoya_babka = tvoya_mamka << 1, и бабка инициализируется значением 6, которое равно 00000110 в двоичной системе и получено сдвигом влево на один бит. Это можно использовать для умножения на степени двойки, ибо сдвиг иногда работает быстрее настоящего умножения.
Поскольку операции сдвига можно перегружать, а сдвиг с правым аргументом, не являющимся целым числом, смысла не имеет, было решено использовать их как операторы ввода и вывода, когда справа стоит что-то кроме целого числа.
>>526363 Т.е. это операторы ввода и вывода? А как они точно описываются? Я их использую для cin или cout, например: cin >> var; Т.е. ввожу что-то в вар. cout << "test"; Ввожу что-то в команду вывода. Так?
Вот стандартная сигнатура перегруженного для класса TvoyaMamka оператора. Внутри оператора может быть что угодно, стандарт не обязывает делать именно ввод и вывод. Но обычно ты внутри каким-то образом форматируешь члены класса и вызываешь операторы вывода для них. Они, в свою очередь, выводят свои члены... Когда доходит до примитивных типов, например, double или int, вызываются стандартные функции <<, которые используют низкоуровневые функции вывода, зависящие от операционной системы.
>>526134 >А Лафоре/Прата рассказывают только про ножовку ... для ньюфагов это очень плохо. Я это говорю фактически как ньюфаг. Надо наступить на максимальное количество граблей, чтобы потом действительно оценить разбиение на функции и прочие ножовки сто страниц спустя.
>>526210 >ну тем не менее это нужнее, и после них Стратоуструпа можно просто пролистать просмотреть листинги ... и совершенно не понять эволюцию его кода в том же калькуляторе. Т.е. ты сможешь его править, а переписать целиком вряд ли. А я переписывал, вот. Но самое главное, я понимаю, как он работает. Потому что перекусил анусом много ржавых труб.
>>526210 >и я наверное целый месяц осмысливал первую программку где калькулятор предлагает сделать Если ты и про шестую, и про седьмую главу вместе, то ты просто гений. Я над шестой главой месяц ебался, кажется.
Скажите мне, это STL такое говнище, или я как-то неправильно ей пользуюсь? Возникала тут задачка на работе, которую численными методами решить надо было, с хуйлиардом входных данных. Я прикинул - а оно всё на мапы и векторы идеально ложилось. Ну я и набросал за пару дней няшную компактную програмку, отдебажил, запустил на реальных данных, и сел ждать результаты первой порции. И что-то как то МЕДЛЕННО. Запускаю профайлер - а оно 99% времени проводит в вызовах map. В общем, я охуел и выкорчевал нахуй весь stl-код из проекта, после чего всё стало работать в стопицот раз быстрее. Ну вот как так? Или STL вообще не предназначена для высоконагруженных приложений?
>>526217 >>526409 да про нее. Я тогда был школодроном с максимализмом и не пониманием как можно что то учить самому, и только после бейсик. Зашел в магазин и увидел этот монолит Стратоуструпа на полке, купил. Вроде бы все было легко до ебучего калькулятора, там я месяц сидел в отладчике и пошагово выполнял каждую команду, и где то спустя чуть более месяца на меня наконец то снизошло озарение, как же там блять все работает. Потом где то до середины досчитал и бросил, вернулся к ней только на втором курсе.
Как сделать, чтоб указатель указывал на переменную-защищенный член класса? Метод clss::a(int* pointer) { pointer = &clssVar; } сработает? Или надо адрес переменной возвращать? Как вообще все эти функции и методы с переменными работают? Копируют значения или читают по реальным адресам?
>>526416 Ну что за задача-то? Вроде умный человек, решаешь какие-то задачи, а никакой конкретики нет. STL писали для быстрой работы с памятью в 90% стандартных ситуаций. Может, ты просто не умеешь её готовить -- я имею в виду выбрать правильный контейнер для твоих задач.
>>526416 Предназначена. Но надо понимать, а не просто бездумно укладывать все на контейнеры. Если у тебя там были, блядь, поэлементные присваивания этих векторов, а вместо unordered_map с грамотной хэш-функцией обычная map с ключами из string, когда при каждом обращении к элементу идет O(log(n)) сравнений строк, то удивительно бы было, если бы оно быстро работало.
>>526419 Сам указатель-параметр копируется, а то, на что он указывает - нет. Если присвоить что-то разыменованному pointer, то оно запишется по реальному адресу, навсегда. Если присвоить что-то самому pointer, то изменится только копия параметра внутри функции, после выполнения никакого эффекта не будет. Чтобы был эффект, нужно сделать [code lang="cpp"] int clss::a () { return &clssVar; } //либо void clss::a (int pointer) { pointer = &clssVar; } [/code] Второй вариант удобен, когда таких указателей несколько, чтобы не пихать их все в возвращаемое значение. Делать изменение по ссылке типа int & pointer некошерно, ибо можно выстрелить себе в ногу.
>>526481 &classVar это указатель на int pointer это указатель на указатель на int, разыменованный pointer это указатель на int. Как что все там нормально будет, присваиваются указатели на int.
[code lang=c++] //raw - указатель на QDataStream raw->readRawData(temp, 4); [/code] Выдает ошибку [code] invalid type argument of unary '' (have 'int') *raw->readRawData(temp, 4); ^ [/code] Что я делаю не так?
Почему многие рикаминдуют сначала выучить С, чтобы потом учить С++? Ведь это разные языки, и если тебе надо С++, то не проще сначала учить то что надо, а потом уже посмотреть его отличия от того же С? Ну, я ещё понимаю советы для ньюфагов, которые ничего не понимают в программирование, но если взять уже человека который понимает что-то, нахуя ему С учить?
>>525225 (OP) Плюсобоги, помогите, гугл ничего не дал, да и скорее всего не даст, так как это что-то странное. В чем суть:
Есть конструктор класса. Туда агрументом я передаю указатель на рендерер и хочу чтобы он сохранился в ren(private SDL_Renderer N_Texture::ren)
когда я создаю класс в main.cpp и даю в конструктор рендерер, то с ren НИЧЕГО НЕ ПРОИСХОДИТ N_Texture::N_Texture(SDL_Renderer renderer) { Texture = NULL; width = 0; height = 0; ren = renderer; }
Но если я сначала создам экземпляр, а потом в коде программы вызову вот это: void N_Texture::setRenderer(SDL_Renderer* renderer) { ren = renderer; }
то ren таки становится равен переданному значению. Конечно, можно для каждого экземпляра вызывать эту функцию, но это какой-то костыль
>>526601 помогите, почему в конструкторе присваивание не происходит, а в функции происходит?
У меня конечно есть подозрение, что это из-за того что я объявляю экземпляр ВНЕ блоков(т.е. не в main или любой функции). Но как тогда вызывать конструкторы глобальных переменных?
А то у меня будет этих N_Texture просто гора и для каждой вызывать setRenderer...это просто стена кода будет. А если нету иного пути, можно это сделать как-то красиво?
>>526613 Глобальные переменные определяются не всегда по порядку. Можешь создать вспомогательный класс, установить в нем renderer один раз, а потом просто вызывать метод N_Texture Factory::N_Texture() { return N_Texture(renderer); }, можешь запилить статичную переменную-член и установить её значение в main(), можешь запилить отдельный глобальный класс, а потом просто читать из него renderer каждый раз, когда понадобится.
>>526572 Я бы не сказал что это разные языки. И в проекте написанном на C++ можно ебаться в сраку с битами и указателями. Просто если не хочешь быть тупой макакой которая просто складывает программу из непонятных ему кусков, лучше изучить более низкоуровневый язык, для того чтобы знать что стоит за всей этой хуйней.
Не могу нагуглить сам. Накидайте код дискретного преобразования Фурье (ДПФ) для одномерного массива значений произвольной длины. ДПФ, подчёркиваю, т.е. мне не нужно гнаться за n X log(n). Хочу просто увидеть несколько строчек преобразования Фурье, скажем, для int_array размера array_size. Будем считать, что значения int_array отстоят друг от друга на единичку.
Что мне нужно на выходе? Массив амплитуд или мощностей (энергий) частот. Ради такой мелочи не хотелось бы возиться с подключением fftw.
Реквестирую книгу по алгоритмам и структурам данных с нуля и примерами на С++ уровня выучил за 21 день. Также реквестирую гайд по оптимизации не улучшения читаемости и красоты программ на С++ не изменяя алгоритм их работы.
>>526941 Ну тогда самое время начать его учить, потому что это самый главный язык на погроммиста. В душе неебу, не читаю корявые переводы уже давно, но до этого встречал всего пару раз не полное говно
>>526996 >>526996 Понял. А что было бы если бы foo f1,f2,f3; Было в глобальном пространстве имён? Имело ли значение до или после int foo::count = 0; они объявлены?
>>526953 Наоборот, это вредно, как правило. Потому что сериализовываться, по идее, должно только видимое извне состояние мамки. Внутри могут быть служебные данные, которые негоже использовать при выводе. Лучше сделать публичный метод у мамки, который вернет все,что необходимо напечатать.
>>526997 Схуяли нельзя? Можно, просто порядок вызова конструкторов статических членов не определен. Гарантируется, что это произойдет до первого обращения емнип. Это и сюда >>526998 ответ, поведение будет unspecified а может даже и undefined, хуй знает, вот это было бы здорово прояснить, потому что неизвестно, в каком порядке они инициализируются.
>>527018 Чтобы таких проблем не было надо пиать static int count=0 и не заморачиваться с отдельным объявлением и определением? Когда полезно писать так как на том пике?
>>527021 Ну не знаю, какие-нибудь настройки хранить, когда одни параметры зависят от других. Конечно, можно и нужно юзать синглтон тогда, но общее направление понятно.
Котоны, решил тут подтянуть немного скилл и поиграться с dll-inj и написать какого-нибудь бота. С инжектом и хелловорлд-длл всё получилось, но вот как из этой длл мне читать нужные значения и дёргать нужные ф-ии - я нихуя не понимаю. Может кто-нибудь тут уже занимался подобным долбоебизмом?
>>527015 > сериализовываться, по идее, должно только видимое извне состояние мамки Схуяли? Если сериализовать только видимое до десериализовать нельзя будет, объект не полный же.
>>527187 Речь не идет о том, чтобы сериализовать только публичные члены-данные. Просто за установку приватных данных должны отвечать методы самого класса, если это возможно.
[code lang="cpp"] class TvoyaMamka { std::size_t height_; std::size_t weight_;
std::short weight_in_tons_; //Чтобы избежать переполнения в ряде случаев
Если дать сериализующим функциям доступ к внутреннему состоянию объекта, то они легко могут сделать вес мамки в тоннах несоответствующим весу мамки в килограммах и нарушить инварианты. Чтобы этого не было, необходимо контролировать весь дружественный код, чтобы тот поддерживал инварианты, легко запутаться.
>>527250 Книги из оппоста это не необходимое и не достаточное условие. У каждого свой путь же. Однако собранные в одном месте хорошие материалы всегда полезны, особенно для новичка, который не знает с чего начать.
>>527304 Ну вот я новичок, тот самый кто поднял этот вопрос. Прочитал книгу "С++ за 21" купил Прата. Читается и вроде понимается. Прочту. А что дальше?
Плюсаны, киньте пожалуйста ссылку на док или книгу, где показано, как расположены объекты в памяти со всякими vtable'ами, выравниваниями, наследованием и проч. Чтобы с картинками и пояснениями.
Господа, возник вопрос немного не по теме треда, но все же думаю стоит задать его здесь, тем более что Си-тред я чего-то не нашел.
Я тут выяснил, что первая цивилизация, написаная на голом Си без плюсов, имела разные форматы сохраненок со звуком и без. Соответственно, игру, начатую со звуком, без звука продолжить было невозможно.
Хуй знает, если возможность сделать звук была изначально, то даже не знаю, зачем такое нужно было делать. Вполне возможно, что какая-нибудь бета-версия была без звука, а потом, когда добавили звук, сохраненки получили новый формат, который из-за криворукости кодеров был несовместим со старым. И решили оставить оба. Но это только моя догадка, я вообще про это в первый раз слышу и нагуглить ничего не смог.
Расскажите, господа, как грамотно работать со сценой и айтемами в Qt. У меня есть поле из квадратиков, по квадратикам ходят разные ребята. Кто должен думать, как ребятам ходить? Вроде по абстракции сам айтем должен решать, как ему выбирать путь. С другой стороны, он не знает о других айтемах ничего, а сцена знает. Получается, она должна давать ему маршрут?
Еще вопрос с обработкой столкновений. Вот два айтема столкнулись. Как они должны взаимодействовать? Нужно просто проходить по collidingItems и дергать у каждого функцию "обработать столкновение", передавая туда все нужные параметры типа, не знаю, шкварит ли айтем при соприкосновении? Или этим тоже должна заниматься сцена, самостоятельно дергая айтемы за нужные веревочки?
В общем, интересно понять, как с этой системой работать нормально, не делая тонны костылей.
Вдогонку: чтобы осуществлять взаимодействие по шагам, мне нужно каждый такт игры дергать какую-то функцию у QGraphicsItem, которая будет запускать дальнейшее поведение объекта. Корректно ли использовать для этого advance(), про которую в справке написано, что она для анимации? Или лучше сделать свою функцию?
Вообще, не очень понимаю, стоит ли опираться на стандартный айтем или все-таки сделать своего наследника (где будут прописаны всякие общие параметры, типа размера, который у всех айтемов одинаковый) и каждый раз кастовать к нему? Кастовать не хочется, но похоже Кьют рассчитан именно на такой педерастический подход. Я что-то не понимаю или реально так?
>>527407 Нет, можешь в одном месте выделить, передать указатель куда-то и там удалить. А ещё лучше не удалять память вручную, а использовать умные указатели и/или всякие принципы владения.
>>525225 (OP) У них есть не только виртуальный деструктор но ещё и чисто виртуальный деструктор, они там размножаются делением, в общем.
Недавно анон задавал вопрос в 87-м ньюфаг-треде: >10 минут в крестах - почему деструктор авторы одного SDK всегда выносят из хедера в сорсы, если он обычно совершенно пуст? То есть просто две фигурные скобки. Это просто для порядка или какая-то особенность крестов?
Антош, мне нужно захватывать изображение из работающей игрушки, чет гуглил-гуглил, не осилил. Работаю в куте, хелпаните плз. Более детально: Открыто окно с игрой, программа получается цветные кадры из этого окна, для их последующей обработки.
>>527890 Ну как бы да. Но нахуя ты сюда это принес, это же азы, лол. Чисто виртуальный деструктор может быть, почему бы и нет, но он в итоге должен быть определен, поэтому его определяют либо в каждом потомке через ::, либо вне объявления класса в .cpp файле (синтаксис не позволяет определять чисто виртуальную функцию на месте). Поэтому обычно так делают только когда других чисто виртуальных методов нет, а запретить создание объектов из-за абстрактности хочется.
>>527890 Нееет, тут виртуальный деструктор может быть не замешан вообще. Суть такова: когда ты делаешь класс с pimpl-членами то есть в классе вместо членов указатели на них, это позволяет работать в хедере с неполными классами и уменьшить время компиляции, хэдеру не нужны полные типы для этих указателей и объявлений функций. А конструктору и деструктору - нужны, потому что они должны уметь создавать и удалять их например, когда через unique_ptr хранится это все, и конструктор инициализирует через make_unique. Конструктор обычно с телом и, понятное дело, выносится в .cpp. Но деструктор тоже выносится, несмотря на пустое тело, потому что он должен неявно вызывать deleter у unique_ptr'ов, а этот deleter, естественно, требует, чтобы объект, на который указывает unique_ptr, был полного типа. Поэтому пустой деструктор тоже выносится в .cpp, только потому что в .cpp подключаются все нужные хэдеры и тип становится полным, а не предварительно объявленным. Такие дела. Перепости это туда, где спрашивали, интересный вопрос же.
Поясните за интересную вещь, почему при запуске этйо программки проигрывается какой-то звук? Конкретно я заметил что на 137 звука нет, на 138 есть. Такой как ПИК!
>>528281 Очевидно, что символ с кодом 137 используется для проигрывания звука (предупреждения) в терминале.
Алсо, ты занимаешься хуйней. Сразу выкинь using namespace, "\n" замени на std::endl, а еще установи ОПЕРАЦИОННУЮ СИСТЕМУ, чтобы не было setlocale и _getch.
>>528304 >Сразу выкинь using namespace Без него не работает. >"\n" замени на std::endl Поясни где про это узнать? >а еще установи ОПЕРАЦИОННУЮ СИСТЕМУ, чтобы не было setlocale и _getch. На какую? У меня 7. Есть еще ноут с линуксом, но как я понял - лучшая де для с++ это вижуал, а его на линуксе нет?
Поясни пожалуйста, я, просто, недавно начал читать учебник...
>>528173 Б-же упаси. Я же говорю, это специфические случаи. Когда у тебя настоящий интерфейс без хуев и нестатических членов, то, как правило, кроме деструктора есть еще чисто виртуальные методы иначе пустой интерфейс нахуй не нужен, лол. И тогда тебе не надо делать деструктор чисто виртуальным, достаточно просто сделать виртуальным, с пустым телом и без выноса в .cpp.
>>528306 >не работает Либо пишешь using std::cout и т.п. для всего, что используешь из стандартной библиотеки, либо ничего не пишешь, а в местах использования пишешь std::cout вместо cout. Это классика, блядь. >где узнать В шапке есть ссылка на cppreference, там можно в поиске вбить любую сущность и посмотреть. >на какую Если у тебя спермерка + VS, то никаких setlocale быть не должно, окстись. Все итак работает если ты не ломал настройки, хуиная голова. getch тоже не нужен, IDE автоматически добавляет "нажмите любую клавишу", только запускать надо из самой IDE, а не кликом по бинарнику, блядь.
>>528417 >Либо пишешь using std::cout и т.п. для всего, что используешь из стандартной библиотеки, либо ничего не пишешь, а в местах использования пишешь std::cout вместо cout. Это классика, блядь. Где про это почитать? Я учусь по книге Страуструпа, там нет такого, сейчас удалил namespace std; Заметил что теперь пишет на vector без std:: что он не идентифицирован. Поясните смысл этого, в книге не написано. >Если у тебя спермерка + VS, то никаких setlocale быть не должно, окстись. У меня русские буквы в терминале без локала отображались как крякозябры, сетлокал исправил всё. >getch тоже не нужен, IDE автоматически добавляет "нажмите любую клавишу", только запускать надо из самой IDE, а не кликом по бинарнику, блядь. У меня такой код без getch запускается и сразу закрывается: int main() { std::vector<int> v; v.push_back(2.7); v.push_back(5.6); v.push_back(7.9); std::cout << v[1]; return 0; }
>>528441 >где почитать В книге это есть в разделе про пространства имен. >кракозябры Когда кракозябры, нужно исправлять консоль, а не программу. Иначе гроб гроб кладбище непереносимость. >закрывается Ты что-то сломал. Там сверху в панели инструментов есть кнопка переключения режимов завершения, найди ее и нажми. Или Ctrl-Alt-Пробел.
>>528458 >В книге это есть в разделе про пространства имен. Пока не дошёл до туда, а в чём смысл выносить using namespace std; или сразу писать с ним? 1 вариант же проще. >Когда кракозябры, нужно исправлять консоль, а не программу. Иначе гроб гроб кладбище непереносимость. А что исправлять? Просто, я установил чистый ВС, в общем всё. Хотя, я не уверен. Но в книге, в начале говорили создавать win32 приложение, а я создаю empty project. Может из-за этого? >Ты что-то сломал. Там сверху в панели инструментов есть кнопка переключения режимов завершения, найди ее и нажми. >Просто, я установил чистый ВС, в общем всё.
>>528478 >в чем смысл Не захламляется глобальное пространство имен. Когда получишь первый конфликт имен из-за подключения двух библиотек, поймешь. >что исправлять chcp 1251 в консольке перед запуском, например. Это все гуглится легко, попробуй. >чистый вс У меня пару раз была такая хуйня, из-за неправильных настроек проекта. Создай новый проект в точности как описано в оппосте и скопируй код туда. Должно помочь.
>>528497 >chcp 1251 в консольке перед запуском, например. Это все гуглится легко, попробуй. 1 пик - что выдёт. >У меня пару раз была такая хуйня, из-за неправильных настроек проекта. Создай новый проект в точности как описано в оппосте и скопируй код туда. Должно помочь. Сделал как в оппике, всё равно сразу пропадает. Но у меня немного не так как там, я создаю файл *.срр как на 2 пике. Всё правильно?
>>528521 Сделал, ничего не изменилось. Там была пустая строка до этого. Кстати, я юзаю vs pre-release 2015 candidate, может баги? Хотя, я как-то делал тоже самое на комьюнити 2012 года, было всё тоже самое.
>>528527 Такого быть не может, что не изменилось. Я только что проверил. Попробуй еще раз, и сверху выбери не Active (debug), а all configurations. Потом перекомпилируй и запускай по ctrl-f5.
>>528549 Ну тогда используй наиболее универсальное решение. Внутри все текстовые строки делаешь юникодовскими, двухбайтовыми. wchar вместо char, wstring вместо string. Работа с ними абсолютно такая же как с обычными. И для потоков ввода-вывода таки делаешь setlocale с пустыми кавычками во втором параметре. Тогда под любой системой будет установлена ее дефолтная локаль и не будет проблем, если у китайского юзера не окажется русского языка, но при этом твои сообщения останутся корректными, потому что юникод.
>>528562 У всех мест с кавычками так сделать надо, ну очевидно же, анон! Когда ты пишешь "твоя мамка", компилятор воспринимает это как строковый литерал const char []. Отсюда ошибки. Пиши L"...", и все будет ништяк.
>>528566 >ошибки Ты опять не перед всеми поставил L, лол. Еще раз: перед ВСЕМИ строками в кавычках поставь L. L"\t", L"Median temperature: ", всеми, блядь. Хватит добавлять по одному L каждый раз и жаловаться на ошибки. >даже в определении Везде. Видишь открывающую кавычку - ставишь L. >одни ошибки Это из-за смешивания char и wchar. Если кратко, то в обычной вычислительной консольной программе не должно быть русского языка вообще. char это обычно байт, следовательно, поддержка русского языка для char строк оборачивается еблей с кодировками и ужасной хрупкостью с невозможностью ничего запустить на другой пекарне. Поэтому я советую в хэллоуворлдах, которые не предназначены специально для изучения локалей, использовать латиницу и не париться.
В серьезных программах, где требуется именно ввод-вывод на пользовательском языке, выделяют обычно отдельный модуль для этого. В нем используются только wstring, wchar и L"...", без смешивания с обычными строками. Это дает требуемую переносимость и надежность, но довольно громоздко, поэтому по возможности ничего просто не локализуют, опять же.
>>528577 Хм... Вроде, получилось. Спасибо. Но я не тролль, как тут написал кто-то:>>528573 Просто, я недавно начал учить язык, сейчас изучаю векторы по Страуструпу.
Ты тоже программируешь на С++, так?
Кстати, подскажи еще 2 вопроса: 1. Как сделать так, чтобы >>528521 это ставилось во все проекты автоматически? Я сейчас создал новый, там была эта строка пустая. 2. Можно ли как-то в ВС переключаться между проектами? А то я пока делаю так: закрываю текущий, открываю новый.
>>528581 Да не за что. Обращайся, тред для того и висит. >автоматически Оно и должно автоматически, по идее. Возможно, это из-за того, что не релизная версия. На релизных 2010, 2013, 2015 ставится всегда. >переключаться Неа, вроде никак. Но можно открыть вторую копию студии, будет два окна с разными проектами.
Аноны, у меня тут лежит Прата размером с войну и мир, и почти такая же здоровая по Qt4 Шлее. Инглиша не знаю, поэтому приходится ебаться с таким пиздецом. Сил нет, лень, сука. Хочется взять и что-то как-то начать осваивать быстро, интенсивно, без повторения материала и тысяч страниц. Что-то вроде learnxinytimes только более подробно и по всему языку от и до. Чуть-чуть программировать умею, поэтому утомляет в десятый раз читать объяснения про то, что такое if-else, а среди этих объяснений умудрились затесаться важные вещи. Как быть? Может Специалиста по крестам скачать? Повторюсь, инглиша не знаю.
>>528714 http://cmcmsu.no-ip.info/2course/ Читаешь все за 4 семестр, что относится к C++. Делаешь практические задания оттуда же. В качестве справки используешь талмуд и книги из оппоста. Когда сделаешь - считай, что начало пройдено, и можно уже читать Мейерса и остальное в оппосте.
Здарова, чуваки, добрался я до главы с передачей аргумента функции ссылкой. (читаю Страуструпа для зеленых) Там он расписывает, мол так и так, когда нужно использовать, когда необязательно. И появился вопрос, а есть ли разница в скорости передачи аргумента в функцию между: - Ссылкой и обычным копированием значения в функцию (при условии, что передается обычное число, а не какой-то массив или вектор etc.) - Ссылкой и константной ссылкой.
>>528744 1. Ссылка преобразуется в указатель, указатель по размеру обычно как int. Если что-то меньше int, по значению быстрее все равно не факт что будет, выравнивание, все дела. 2. Одинаково, константность ни во что не компилируется.
>>528752 > 2. Одинаково, константность ни во что не компилируется.
Не всегда. Компилятор может положить константу в read-only memory для ускорения доступа. Вообще, хороший тон - использовать константные ссылки как можно чаще. Неконстантная ссылка = выходной параметр.
>>528741 Всё, извини, не разобрался. Про Qt что-нибудь скажешь? Может что-то подобное есть? Ты как это на такой сайт набрел? Много в рашке такого, лол? Ну, выложенных материалов с годных вузовских семинаров, лекций...? Кроме очевидного интуита?
>>528762 Ты путаешь константы и константные ссылки. Константность ссылки не значит ничего абсолютно в ассемблерном коде, объект уже создан в другом месте, константный или нет - все равно.
>>528778 Я набрел на этот сайт главным образом потому что я учусь на там и в свое сдавал экзамен по этому курсу точнее, получил автомат, но энивей. За куте не скажу, мне он не очень нравится, и я не особо интересовался. У них вроде неплохая документация, но она на ангельском, конечно же.
>>528807 Именно из-за этого там обязательно окажется что-то, что тебе не понравится, как реализовано. Гораздо приятнее искать библиотеки по мере необходимости, не понравилась - заменил на аналогичную, и устанавливать кучу говна не надо.
>>528714 Если еще дадите каких-нибудь советов, кроме лекций и книжки выше, буду благодарен. Ну, интенсивы типа. Скажите таки что-нибудь насчет бауманского Специалиста. Говно?
>>526481 У меня тоже "[code lang="cpp"]" видно Просто они каким-то сторонним скриптом пользуются, когда это пишут. Я так понял что Абу не будет допиливать. А тот скрипт обновляется каким-то антоном, подгружает иконки с его сайта, и прочими странными вещами занимается.
>>527351 В стандарте это не описано. Каждый компилятор будет их располагать по-своему. А для отладочной версии он вообще все подряд будет обрамлять опкодами прерывания, чтоб при случае выхода за пределы сразу в отладчик IDE вылетать.
Посоветуйте способ фиксирования знаний? Исходники с комментариями писать, тетрадку вести, файл текстовый или вордовский? Как конспектировать информацию, короче? Чтоб вот если забыл все после перерыва, прочитать и все вспомнить? Учу кресты, разумеется.
Реквестиую книгу по оптимизации кода без изменения алгоритма работы и не важно на его красоту и читаемость. Мейерс не подходит. Т.к. ам ещё советы про читаемость и переносимость.
>>527351 Ищи статью в RSDN magazine про vtable и прочие страшные штуки. За много лет общая идея не изменилась, разве что компиляторы стали лучше оптимизировать все это и избавляться от лишних промежуточных сущностей.
>>528915 Я не видел интенсивов по крестам и, если честно, сомневаюсь, что они существуют. Понимаешь, анон, кресты это сложный и объемный язык, его надо осваивать вдумчиво и серьезно. Все рассказы про 21 день это полный бред, так только питон можно выучить. Точнее, ты можешь за 21 день выучить синтаксис и простейшие примеры порешать, и такие курсы, несомненно, есть, но это ничем не лучше прочтения какого-нибудь самоучителя для ньюфагов, да чтоб потоньше. Но духу языка ты так не научишься, однозначно. Так что лучше сначала набрать базовые знания, а вот уже потом есть и годные книжки про детали, и мастер-классы тот же Мейерс ведет на ангельском, разумеется, по вполне доступным ценам.
>>528990 У меня обычный тхтшник, в который пишу хитрые детали, good practices, вопросы, на которые сам пытаюсь ответить, ну ты понел. И периодически перечитываю его. Но самое главное это писать код, только во время написания живого кода такой тхтшник быстро наполняется. Переписывать из книжки - это совсем не то.
>>529068 Про макрооптимизации алгоритмов асимптотика и вот это все читай Кормена "Алгоритмы", отличная классическая книга. Она не про кресты, а вообще. Про микрооптимизации сэкономить на сложении и всякая хуйня читай "Effective STL" Мейерса, ибо детали на крестах обычно реализуются STL, а у Мейерса там больше половины про оптимизации. Еще наверни Джоссатиса про STL, там тоже много про ее оптимальное использование, но уровень выше, чем Мейерс. Наконец, есть неплохие книжки - "Жемчужины программирования" Бентли и "Алгоритмические трюки для программистов" Уоррена мл. Там тоже не только про кресты, но описаны всякие мелкие оптимизации.
>>529099 Есть проблема: мне по роду деятельности приходится вебмакакить и там все паттерны проектирования, гуд практисес и подобное нахуй не нужны, там это только время отнимает и непонимание вызывает, ну и вообще там плюсами даже не пахнет. Плюсы для меня - хобби, хочу когда-нибудь игрушки писать. Соответственно, я могу забросить написание кода резко и хоть на полгода из-за какого-нибудь аврала, потом захотеть вернуться и быстро "вспомнить всё".
>>525307 Забей на сраные коллбэки, они мало того что не интуитивны, так и еще нетипобезопасны. Посмотри в сторону Qt с сигналами-слотами, они интуитивно понятны и типобезопасны.
>>529206 Ты заебал, как ты, блядь, прикрутишь куте/буст/tvoa_mamka_anal_interface_lib_3000, если речь идет про работу с сишным легаси-кодом? Он не понимает ничего, кроме коллбэков, поэтому классику надо знать и точка. Куте он захотел прикрутить, вообще пушка.
>>529209 В том, что [code lang="cpp"] for (auto it = std::begin (mamkas); it != std::end (mamkas); ++it) { if (it->isGoodMamka ()) good_mamkas.push_back (*it); }
f1(object, &value); // добавляем наш VARIANT в object
// вот тут _bstr_t освободит память, выделенную для BSTR, насколько я понимаю }
// Итак, у нас есть IDispatch *object; // Вызываем функцию f2() f2(object);
// ...
// А вот тут мы что-то делаем с object, в частности используем то, что добавили с DISPATCH_PROPERTYPUT [/code]
Внимание, вопрос. Что происходит с VARIANT value в строчке, которую я отметил соответствующим вопросом? Если оно куда-то копируется, то копируется ли BSTR вместе с ним? В общем, не будет ли проблем в использовании объекта object после того, как функция f2() завершится? Не будет ли у него невалидный BSTR, который уже свободился?
>>525225 (OP) Парни у меня возник вопрос. Может ли изменить значение приватной переменной класса функция которая передана по указателю методу класса как аргумент?
>>529283 ну я вот читаю Прату. И там было задание нужно сделать что бы в классе можно было изменять переменную с помощью функции(ну либо уменьшать либо вычитать). У меня возникло в голове несколько решений. 1) Хуярим две функции одна увеличивает другая уменьшает значение. 2) Создаем перечисление в Enume если функции значение перечисления где она внутри функции с помощью if'ов определяет что надо сделать. 3) Создаем две функции одна увеличивает, а другая уменьшает. Внутри класса один метод который принимает ссылку на одну из этих функции, и передает этой функции указатель на закрытую переменную. Само собой вроде как второй метод оптимальный во всяком случае с моей нубо колакольник, но третий вызвал любопытство пытаюсь реализовать и не получается. Хотя возможно потому что я криворукий.
>>529286 ах блять можно же одну функцию создать внутри класса где все будет складываться, но передавать туда либо положительные либо отрицательные значения.
>>529286 Тупонул. Если метод имеет доступ к значению приватного члена класса, то он может дать его как аргумент другой функции. Почему в 13ой строке нельзя написать cout<<g(p)<<'\n'<<p<<'\n';? Почему в 20ой строке нельзя написать A a.h(k);?
С++ без красноглазияАноним13/08/15 Чтв 09:59:12#277№529324
Программач, успокой меня. Я захотел поучиться С++, потому что мне нравится лаконичный синтаксис, производительность. я хотел бы пилить игрушки, а в современных движках используются кресты, хотел бы писать производительные корпоративные приложения или может быть даже какие-нибудь числодробильни на тему нейронных сетей. При этом при всем использовать современное ООП-api, красивые библиотеки вроде Qt и наслаждаться жизнью. Но меня тошнит от всех этих указателей на указатель, нечитаемого кода, мамотноподобного тайп-каста и подобного пиздеца. Хочу просто писать красивые, производительные программы без байтоебли, указателеебли, типоебли и п подобных развлечений. Возможен ли С++ без всего этого или мне нужно что-то другое? >>529299 И без подобной вот блевотины "h(int(*g)(int&))" в реальных задачах?
>>529327 Не нрав синтаксис, привязка к майкрософту и вообще подход. >>529328 Думал об этом, но ну его нахер, не доставляет ни то, ни другое >>529331 Ну да, в отсутствии контроля длины массива и введении регулярных выражений спустя 30 лет развития языка - это тоже ничего плохого, но это колхоз, а я бы не хотел быть колхозником с красными глазами, я хотел бы взять достоинства языка и забыть про недостатки.
>>529342 Игры можно пилить и мультиплатформенные, и на консоли, и на носимые устройства. Это не привязка к инструментарию, разработанному майкрософтом, меняемому по желанию левой пятки майкрософта и в соответствии с представлениями этой компании о прекрасном. Нахер такое. Нахер шарп, нахер .Net, нахер Visual Studio, нахер их понимание красоты в отношении библиотеки классов. Даже ява приятнее. Мне нравится С++, он красивый, лаконичный в целом, а особенно красив Qt. Но вот type_cast, указатели, все эти сочетания круглых скобок с угловыми, вот это вот все уже ни разу не красиво и не доставляет. Зачем оно мне? Могу я обойтись без этого? Если хочу производительно, лаконично, читабельно, удобно для написания. Стилистически мне вполне нравится lua, php, python, больше, чем ява или шарп. В первой смущает комбайновость, перегруженность, зависимость от виртуальной машины, во втором сама суть и привязка к майкрософту. Но в любом случае, python или php я к UE4 не подключу и нужно привыкать к крестам, потому что они везде и все библиотеки под кресты. Вопрос - можно ли это сделать, не одев свитер и не испортив зрение.
>>529348 >Вопрос - можно ли это сделать, не одев свитер и не испортив зрение. Скорее всего нет. Указатели точно нужны.
Не совсем понял. Ты хочешь писать кроссплатформенные игры на С++, но тебе не нравиться его синтаксис? Ну синтаксис ты точно не поменяешь. Можешь попытаться библиотек или фреймворков подключить, но я не знаю каких.
>>529324 Придется заниматься и вот этим всем, если понадобится писать аллокаторы, контейнеры и прочее своё под задачу. Другое дело, что можно таки писать читаемый код с помощью typedef, alias и auto, маленькими функциями. Поверь бро, это не сложно и есть даже проги которые парсят все эти многозвездочные объявления в человеком читаемый вид лол
Поясните за external linkage. Как понять то, что какая-та переменная доступна в других translation unit-ах? Есть int i в глобал скоупе в одном .cpp файле. Как к нему получить доступ в другом .cpp файле?
>>529435 Она сама не может, это метод класса может вызвать эту функцию чтобы изменить свой член. Создатель класса в данном случае представляет такое API.
>>529350 Ну вот смотри, все эти языки, которые я указал, им нахер не нужны указатели, к примеру. Вопрос, почему я не могу обойтись без указателей в крестах? Синтаксис нравится, не нравятся вот эти отдельные элементы. >>529419 Вот тут можно подробнее? Про парсеры
>>529435 f может изменять т.к. медот класса передают её ссылку на приватный член, а v не может изменять, а только читать т.к. медот передаёт ей только значение приватного члена класса. И никакие указатели на функцию не нужны.
>>529280 Нет, не может. Видимость это уровень компиляции, зависит только от места, где функцию описана. Компилятор не знает, что ты ее потом передашь в объект класса, и видимость не дает. Наоборот, если создать в методе класса лямбду и потом отдать ее другому классу, видимость останется, потому что объявлена была внутри первого класса.
>>529341 Просто ты начал читать какой-то хуевый учебник с начала, посмотри там в конце, про STL и C++11 должно быть. Никакого байтоебства, все на высшем уровне.
Программисты, поясните, я тут видел где-то картиночку, типа язык С быстрее языка С++. Но, насколько я знаю, С++ - это как надстройка над С? Или мои знания не верны? Просто, я читал что С и С++ одинаковы в плане кода, просто, у ++ есть доп. фичи. И, теоретически, зная С++ я знаю С - так ли это? Правда ли что С быстрее С++?
Вы реально это используете, считаете удобным и не имеете альтернатив? >Try these examples: >int ((foo)(void ))[3] >declare bar as volatile pointer to array 64 of const int cast foo into block(int, long long) returning double Зачем? Как так получилось, что все остальные языки обходятся без этого поноса, а С++ - нет?
>>529504 cout << a << b << c эквивалентно operator<< (operator<< (operator<< (cout, a), b), c). Порядок вычисления аргументов не определен, поэтому у тебя компилятор считывает p до выполнения g(p).
>>529514 Если написать такую, то будет так же быстро, как в C. Но так никто не делает, потому что если ты хочешь писать как на C, то ты можешь написать на C, лол.
>>529515 В cout порядок выполнения не определён? Когда придётся использовать несколько cout чтобы такого не было? Можно как-то компилятору сказать делать всё по порядку?
>>529523 Не порядок не определен. Порядок вывода определен, но он может сначала, например, вычислить и запомнить самый правый аргумент, потом вывести остальные, а затем уже его. Можно добавить точек следования, самое простое - разбить на несколько операторов, как у тебя сделано, или с помощью запятой.
>>529517 Без >int ((foo)(void ))[3] блеовотины, там это будет как угодно, "int foo[3]", к примеру, не не вот эта чертовщина тип((имя(тип))[размер]. Что за пиздарики под двойными скобками, зачем этот пиздец? И зачем выносить квадратные скобки наружу, раз уж решили всю хуйню внутрь запихать?
>>529537 Затем, что ты видишь int (...) [3] и понимаешь, что после применения такой функции у тебя будет массив интов. Это удобно, потому что по объявлению функции можно понять, во что она превратит аргументы при вызове, а разбираться в ее работе не всегда хочется. Читать такие объявления тоже весьма легко и без всяких typedef, есть четкий алогритм, как читать изнутри наружу. "Найти имя сущности, читать вправо до скобки, читать влево до скобки, повторять, пока не кончится выражение".
>>529544 >есть четкий алогритм, как читать изнутри наружу. "Найти имя сущности, читать вправо до скобки, читать влево до скобки, повторять, пока не кончится выражение". Точно вспомнил. Это тебе.
>>529512 > Зачем? Как так получилось, что все остальные языки обходятся без этого поноса До 8 джавы джависты, когда им требовалось передать функцию, передавали объект анонимного класса, реализующего определённый интерфейс. Теперь они могут передавать лямбды и функции.
>>529548 Спасибо, но что насчет внутренностей-то скажешь? (void ) - вот это и вообще двойные скобки нахуя? Почему не int foo [3]? Что будет, если я захочу объявить массив массивов каких-нибудь объектов некоторого класса? Вообще же нечитаемый пиздец.
>>529570 Ааааа, вон оно как получается...блядь, ну реально как-то не слишком понятно. Почему тогда не написать было int [3] function foo (void) или просто int [3] foo ()? Зачем опять эти скобки, разделения...ебанись.
>>529571 Если бы функция могла вернуть массив, то было бы int foo()[3], да. А так приходится скобками звездочку отделять, чтоб компилятор не решил, что возвращается массив указателей.
>>529590 Вот код: https://bpaste.net/show/be3d38894653 Собственно, я не знаю в чём дело, проверил 2 раза. Суть в том, что если я введу слово из спамлиста - у меня qwe и test, то они должны заменится на BLEEP, но они заменяются не корректно. Суть кода проверки на пике.
>>529592 Ты понимаешь, что у тебя выделенный кусок кода перезаписывает check во время каждой итерации цикла? В итоге имеет значение только чекнулось ли оно при последней j или нет.
>>529592 А еще рекомендую использовать ключи компилятора -Wall -Wextra -pedantic и когда компилятор тебя ткнет в то, что ты используешь int'ы вместо size_t как индекс у векторов, исправить это.
>>529594 Так я так и хотел. У меня так: ЧЕК=0, берётся 1 элемент 1 массива и сравнивается со всеми элементами 2 массива. Если во 2 массиве есть слова из 1 массива, то ЧЕК=1. Если ЧЕК=1, то вывод такой. ЧЕК=0. Потом берётся 2 элемент 1 массива...
>>529596 Не понял, это одна из начальных задач по страуструпу, если что. Я пока не очень в крестах разбираюсь.
>>529576 Хуй знает, но он работает со всеми, для которых это будет осмысленно. С %, возможно, не будет, с логическими тоже. С побитовыми и сдвигами должен.
>>529700 Работаю, senior c++ engineer. Дома для себя постоянно пишу что-нибудь. Отношусь к программированию как к искусству, творчеству. Язык - инструмент, кисти и краски, например. Быстро вхожу "в поток", могу всю ночь, например, решать какую-нибудь задачу, а утром пойти на работу. Пару лет назад на хабре была статья про химеру программистов - создание и поддержка целой вселенной в голове в процессе работы. Меняй отношение к делу. Если процесс нравится, то он затягивает.
>>529841 В срр. В хедере должны быть только инклюды родительского класса (если есть) и библиотек. Это в идеале, естественно. Реальная жизнь может вносить свои коррективы, но нужно стараться как можно меньше инклюдить в хедеры - в основном чтобы было меньше перекомпилировать после изменений, и чтобы не пердолится с цикличными инклюдами.
>>529324 Антоны тебя немного троллят. Одна из основных идей, заключенных в плюсах, это как раз демонтаж красноглазия.
Точнее, как -- в плюсах можно писать си-стайл с вот этой вот страшной ебенью, и это даже бывает нужно, но это как правило задачи, связанные с тонкой оптимизацией или низким уровнем (написание драйверов, например).
Если же ты не хочешь с этим ебаться, то для тебя в C++ есть стандартные контейнеры и умные указатели. И их вполне хватает чтобы делать все, что угодно. Я более чем одинарные указатели, например, использую крайне редко, и то только для того, чтобы запихнуть их в контейнер.
>>530040 Просто, так в задаче написано, я думал, но не придумал как это сделать: Там, просто, надо будет потом операции с числами делать. У меня, в целом, есть идея через пробел писать текст. Вот текст задачи: >Добавьте к каждому введенному числу типа double единицу измерения; иначе говоря, введите значения, такие как 10cm , 2.5in , 5ft или 3.33m .
>>530040 Попизди мне тут. >>530042 Например, пишешь: [code lang="cpp"] //double нельзя, можно long double //суффикс m переводит сантиметры в метры constexpr double operator "" m (long double num) { return num * 100.0; } [/code]
>>530075 А как им в этом случае пользоваться? Кину я значения в стринг, но они же складываться не будут. Я бы мог сделать что-то, если бы умел определять текстовую часть и цифровую отдельно. Ладно, я уже сделаю так, что буду писать число и стринг через пробел.
>>530075 Наркоманы в треде. Этот "костыль" -- мощное нововведение 11-го стандарта, созданное как раз для подобных случаев. >>530062-кун, сделай через суффиксы, как делают нормальные современные пацаны.
>>530075 Костыль? Костыль? А лямбды тоже костыль? Правильно, нахуя эти непонятные квадратные скобки, лучше еще один функтор именованный написать. unique_ptr тоже костыль? Деды raw-pointers с дерьмом вместе ели, и мы будем. Чего там, variadic templates тоже костыль. Нахуя нам эллипсисы непонятные, пачки какие-то, лучше через void * сделать! Стандартизация не нужна! Даешь C с классами! >>530086 Пиздос. Я даже это комментировать не буду.
Только понял - если вводить так как я сделал, всё верно же получается, пикрелейтед. Я думал выдавать ошибку будет, ведь разрыв по пробелу происходит? Почему если я пишу 4ft, то разрыв всё равно идёт, а не пишет ошибку?
>>530094 [code lang="cpp"] //Пусть оператор с long double из предыдущего уже описан где-то раньше long double distance1 = 10.0; //10 сантиметров long double distance2 = 10.0m; //10 метров = 1000 сантиметров [/code]
>>530094 Немного не в тему вопрос, но я только задумался: если надо не считать наибольшее и наименьшее значения, а у меня всего 1 или 2 значения вбито - их надо будет считать или нет? Вроде, 1 значение является и наибольшим и наименьшим, но я не уверен.
>>530094 Если кому интересно, вроде написал программку, это конечная задача по учебнику Страуструпа в главе 4.7: https://ideone.com/lAsE78 Если что неправильно написал - пишите, я открыт для критики.
не понимаю, почему в гцц не сделано sso для строк. шёл 2015 год, а мы до сих пор имеем тормозмозные аллокейшены в каждом присваивании и в каждой подстроке в обоссаном выжеэл студии 2003 года уже был сделан sso для строк! вы тут про высокие материи, мол лямбды и вариадики - это прорыв, при этом для юник_птр в ++11 нет мейк_юник, при том что маке_шаред всё таки есть, надо писать километровые строки в коде и скроллить это говно по горизонтале, каждую версию ожидаешь, что избыточного кода станет меньше, а в итоге почти та же ссанина что и 10 лет назад, ссука для сетки ни одной отдельной либы, только монстры типа буста и кьюте или нужно использовать сишное говно от системы, где кода проверки ошибок на порядок больше, чем реальной работы
>>530175 >не сделано sso для строк Ну поставь SGI реализацию, если тебе так критично. >нет мейк_юник >2015 Пора бы уже про 14 подумать, в нем все есть. И основные фичи реализованы в компиляторах. >для сетки ни одной отдельной либы Casablanca же, маленькая, шустрая, все фичи из новых стандартов поддерживает.
>>530234 Почему? >if (value == "cm") >array.push_back(number); >else if (value == "m") >array.push_back(number / 100); Если см, то добавляем так, если метры, то делим на 100.
>>530263 Давай проведем анализ размерностей. Что известно: 100 см/м. На входе: 1. number :: см => array.push_back :: см -> () 2. number :: м => array.push_back :: (м / (см / м)) -> () Раскрываем скобки: м / (см / м) = м^2 / см Получаем несоответствие - с одной стороны push_back принимает сантиметры, а с другой - квадратные метры на сантиметр.
>>525225 (OP) Короче спрошу здесь, не хочу отдельный тред создавать.
Есть предположим ВЕКТОРЫ и МАТРИЦЫ и это все надо перемножать. На CPU это ОЧЕ долго, поэтому я хочу воспользоваться возможностями GPU. Но при этом не хочу покупать этот самый GPU, потому что он стоит денег, даже самый днищенский.
Сейчас есть процессоры с типа встроенной видюхой. Есть материнские платы со встроенной видюхой. Потенциала этого барахла хватает, чтобы показывало десктоп, делаю вывод, что должно хватит и на матрицы.
Вопросы такие. 1) Есть ли библиотеки для прямого доступа к возможностям встроенного в мать/проц GPU и если так, то на каких машинах это будет работать. Без анальных привязок и кросс-платформ.
2) Можно ли использовать opengl в таком случае и перемножать матрицы на вертекс шейдере? Какая версия opengl будет доступна? Насколько кросс-платформенно?
>>530293 >1) Есть ли библиотеки для прямого доступа к возможностям встроенного в мать/проц GPU и если так, то на каких машинах это будет работать. Без анальных привязок и кросс-платформ. Касательно Intel - только DirectCompute или C++AMP а он внутри все равно использует DC. Вроде AMP пытались прикрутить и к clang.
>>530314 Хотя там ссылки теперь ведут на Kalmar, а он, суда по всему, не будет работать с Intel. Но если тот же код скомпилить Visual C++, то запустистя на Intel. Но только под винду. Короче хз.
Обычная материнка со встроенной видюхой, года так 2011 выпуска.
Я хочу использовать как можно более дешевый хардвар, но иметь доступ к GPU. Мне не нужны йоба вычисления как в крузисе, нужен параллелизм хоть какой-то.
И как мы тебе подскажем нужный софт не зная железа? Совсем аутист или тут битва экстрасенсов? И вообще, 2015 год, купи б/у видяху за 50 баксов, даже в круизис на средних поиграешь.
Поясните за поиск работы ньюфагу, стоит вообще вскрывать эту тему? Или лучше сразу выбрать какое-нибудь джава-говно без такого охуевшего порога вхождения?
>>530334 Меня не конкретно этот хлам интересует, а в целом подобный хлам как класс. Чтобы грубо говоря запустилось на любом говне, где есть хоть какое-то gpu - процессорное, чипсет в материнке, неважно.
Там чего с этим opencl делать? Фреймворк нужно ставить для конкретного типа gpu?
>>530338 Вот кстати двачую вопрос. Будет ли OpenCL полностью кроссплатформенным решением? Условно говоря, везде, где есть C++ компилятор, компилируешь его исходники и используешь пусть даже и с различным быстродействием на разных архитектурах. Если нет, то есть ли в природе что-то подобное?
>>530338 >Меня не конкретно этот хлам интересует, а в целом подобный хлам как класс. Чтобы грубо говоря запустилось на любом говне, где есть хоть какое-то gpu - процессорное, чипсет в материнке, неважно. Главное, чтобы железка была с GPGPU, причем с достаточной для твоего кода Compute Capability. Можно, конечно, и шейдерами на OpenGL вычислять, но это уже прошлый век, и вряд ли ты найдешь сейчас для этого нормальную библиотеку.
>>530349 >Вот это не особо радует, тупой пользователь может не сообразить. У nVidia и Intel они ставятся с обычными графическими дровами, судя по всему.
Реквестирую мануал по инклудам, чтоб прям расписано все было и побольше примеров, а то устал перед каждой компиляцией скрещивать пальцы, в надежде, что не вылезут сообщения, типа "already declared in:"
>>530364 Я так понимаю, что у тебя проблема с инклюдингом собственного кода. Просто разделяй все на хедеры и cpp файлы (если не шаблоны). инклюдить надо только хэдеры. Инклюдить можно и из хедеров, и из цпп. Во всех хедерах используй header guard, загугли что это.
А вообще можешь опубликовать свой проект, и я тебе поясню, что ты с инклюдами делаешь не так.
>>530366 >>530369 Я использую гарды, просто иногда получаются дабл и циркулярные включения. Например есть a.h с классом clА, у которого методы и члены статичные - 3 члена-класса clB, clC, clD и одна int переменная varE. То есть уже идут включения b.h, c.h, d.h. У clD есть метод, который должен менять статическую переменную-член clA. Вот и получается, что a.h включает b.h, c.h, d.h, а d.h включает a.h, который включает в себя b.h, c.h, d.h, а d.h...
>>530392 Потому что в таком порядке писал код. Сначала этот инклюд мне понадобился в ClassB.cpp, а потом - в ClassB.hpp. От того, что он и там и там, ничего плохого не будет.
Он не понимает отличие объявления от определения. Сколько же я с этим ебался в свое время. Объявление "чего-то" можно хоть куда напихать, главное чтоб определение этого "чего-то" было одно на весь проект. Поэтому его обычно и засовывают в .сpp
Считается ли нормальной практикой раскидать определения классов из одного хидера в несколько .cpp файлов? Я хотел сделать разные хидеры, но оба класса используют один и тот же struct в типах аргументов методов.
>>530454 Хотя не, откомпилилось http://pastebin.com/9wtmdfCg Но вот тут непонятно: если убрать из a.h, в самом конце, #include "b.h", компилятор ругается про форвард деклар и "error: invalid use of incomplete type class B"
>>528441 >пишет на vector без std:: что он не идентифицирован Он же не знает, что ты хочешь вектор именно из стандартной библиотеки языка. Ему нужно сообщить об этом, а то вдруг у тебя самопальный вектор из говна и палок.
Алсо, не слушай его. Локаль надо выставлять (как ты и делаешь), а вместо гетча пиши православный кроссплатформенный std::cin.get(ch):
include <iostream> //std::cin / std::cout char ch; std::cin.get(ch);
>>530477 Ну так ты пытаешься у B использовать метод. Чтобы его использовать, нужно знать, какие методы у него есть. А чтобы это знать, нужно заинклюдить хедер b.h
>>530487 Да, все, спасибо. Это просто предупреждение от компилятора. Но теперь другой вопрос: как сделать пиздато? Чтоб как в думе - один файл заинклудил и все.
>>530488 Не предупреждение, а ошибка. Предупрежедения это рекомендательные штуки, которые компилятор обычно выдает, когда подозревает, что где-то может получиться undefined behaviour.
>Но теперь другой вопрос: как сделать пиздато? Чтоб как в думе - один файл заинклудил и все.
>>530313 Я тоже сначала хотел сделать свич, но там показало что он не поддерживает этот тип переменной.
>>530269 Что-то я не совсем понял, у меня же сделано так (брал сантиметры за образец вычислений): >if (value == "cm") >array.push_back(number); Если см - просто заполняем массив. >else if (value == "m") >array.push_back(number / 100); Если м - делим число на 100, т.е. получим сантиметры?
>2. number :: м => array.push_back :: (м / (см / м)) -> () Вот тут не понял - откуда ты взял: (м / (см / м)), если у меня там м / 100 = см.
>>530663 >откуда ты взял: (м / (см / м)), если у меня там м / 100 = см. В метре 100 сантиметров. 100 сантиметров приходятся на каждый метр. 100 см/м. Подставляем: м / 100 = м / (см/м).
>>530379 Циклические включения -- верный признак хуевой архитектуры. Приведи какой-нибудь пример из жизни, где такое возникает, и я попробую подсказать, как надо переделать архитектуру.
>>530775 Классика. При сравнении знакового и беззнакого целочисленного типа более высокий приоритет имеет беззнаковый, поэтому знаковый кастуется в него. Далее минус единица превращается в UINT_MAX и победа при строгом сравнении обеспечена всегда, кроме когда беззнаковое тоже равно UINT_MAX.
Чтобы сравнивать значения, они должны быть одинакового типа. Если они разного типа, компилятор (наверно при помощи статик_каста) приводит их к одному типу. Если бы всё приводилось к знаковым, тогда значения беззнакового, превышающие INT_MAX, кастовались бы в отрицательные, и тоже были бы "меньше" любых маленьких положительных.
>>530775 В дополнение в вышесказанному, скажу, что беззнаковый от знакового отличаются интерпретацией первого бита. В знаковом первый бит числа отдаётся под знак, в беззнаковом - ещё один двоичный разряд числа. Так и получается, что -1 побитого равен uint_max в беззнаковом.
>>530967 В константных строках не хранят \n на конце. Хранят саму строку, которую можно вывести, добавив << std::endl. Это позволяет конкатенировать строки без ебли, потому что не все строки предназначены для вывода отдельно от других и дальнейшего возврата каретки. Когда ты выводишь литерал что само по себе уже пахнет магическими константами, но в хэллоуворлдах или для отладки можно, конечно, тем более удобнее пользоваться std::endl, это лучше читается.
>>530968 Знаковое к беззнаковому не приводится без сужения, поэтому компилятор кукарекнет, как сказал вот этот >>530780 благородный дон. Причем это критичное предупреждение, должно вылезти даже на W2 стандартном уровне.
Пацаны, а можно ли как-то хранить в enum char-ы? Я хочу, чтобы можно было писать вот так: [code]enum{ A1 = 'q', A2 = 'w', A3 = 'e' }; std::cout << A1;[/code] Можно и дефайнами это сделать, но мне интересно именно через enum. Кто что думает?
>>531083 Не, кастовать неинтересно. >>531084 Но тогда нужно перегружать оператор<<, чтобы вывести A1? >>531086 Какая альтернатива тогда? Чем вообще лучше пользоваться для констант? #define, enum, const, constexpr? Что для чего?
>>531093 Это как если бы ты написал [code lang="cpp"] class TvoyaMamka { using width_type = int; }; std::cout << TvoyaMamka::width_type; [/code] И тут и там пытаешься вывести тип вместо переменной, так не пойдет. Пиши нормально, типа imya foo {imya::A1}; std::cout << foo;
>>531096 Ну так я и спросил, нужно ли будет перегружать оператор<< или нет. Может быть, тогда лучше будет использовать #define A1 'q' и т. д.? Дефайны слишком плохо использовать?
>>531099 Если честно, не совсем понял, что именно ты предлагаешь писать.
>>531107 Да не, я обосрался на самом деле. Без создания объекта тоже должно бы было работать. Посмотрел сейчас встроенные перегрузки для operator<<, там enum'ов нет, разумеется. И неявно к своему базовому типу они не приводятся, так что придется тебе либо делать static_cast в char, а еще лучше засунуть это приведение в самописный operator<<.
Есть класс, метод которого получает значение констант в качестве аргумента. Эти значения нужно присвоить при инициализации константы, но константа так же, как и метод должна быть членом класса. Как это реализовать? Можно как-нибудь переменную преобразовать в константу?
/error: the value of ‘WIDTH’ is not usable in a constant expression note: ‘WIDTH’ was not initialized with a constant expression const int WIDTH = D_WIDTH / 9; / [/code]
>>531345 Уровня школы. И да, алгоритмы != математика. Откуда вообще эта хуйня пошла? Большинство алгоритмов в говноразработке выстраиваются обычной логикой, а всякое серьезное дерьмо с математикой делается бородатыми дедами при университетах, называется "научной деятельностью". Когда программистишка с 4 курсами говноматана с говнопараши типа МГУ начинает считать себя математиком, где умирает один Мишаня. http://imperium.lenin.ru/~verbit/MATH/programma.html
Ubuntu 12.04 g++ 4.6.3 и выше. выполняя код на стареньком eeepc 701 я обнаружил что время выполнения задачи всё время одинаковое-47сек(выводится самой программой), хотя секундомером мерил оно доходит до 1минуты 5 сек. И доходило до 1минуты 50 сек при двойном запуске той же самой проги, программа всё равно выводит 47секунд.Пробовал запускать на настольном пк там составило 7 сек, но не стал морочиться с загрузкой ядер-там их несколько. Может ошибка какая-то в коде? float seconds; clock_t sstart = clock(); unsigned long wait=0; while(wait<4000000000) wait++; cout<<wait<<endl; seconds=(clock()-sstart)/CLOCKS_PER_SEC; cout<<"Время затраченное на складывание "<<wait<<"раз="; cout<< seconds<<endl;
Посаны, что можно прочитать/посмотреть, для того чтоб научиться программировать под шиндус? Чтоб например можно было получать данные из другого приложения, или использовать хардверу компутера, например получить данные с компорта.
Я просто разобрался в базисе (указатели-стринги наследование, классы и прочее, дефолтные принципы и основы). И теперь уже 2 года никак не продвигаюсь. Кучи литературы для вступления, а что дальше - совершенно не ясно, не ясно с какой стороны подойти. Я вот понемногу осваиваю программирование под мкк, очень много литературы, во всем можно разобраться. И никто не может ответить. А как подойти к программированию под ось, так и не пойму.
Ребят, такое вот дело. VS 2015 не компилирует парочку кодов, но ошибок не выдает. Вместо этого компилирует прошлый успешный код. Проверил каждую строку, запускал другие коды, всё ок. Снес его, переустановил, проблема осталась. Попробовал на другом компиляторе, а там коды успешно компилируются. Что за говно?
Аноны, что почитать по поводу работы с железом (а именно с usb устройствами)? Интересует всё по данной тематике: написание драйверов, разработка программ для обработки/отправки/получения информации с устройства и т.п.
В stderr погрязших мыслям вопреки:
Была свирепа их толпа дурная.
Визжа, на стол роняли кулаки,
То лоб клавиатурой разбивая,
То мыши норовя изгрызть в клочки.
Учитель молвил: "Сын мой, здесь страдают
Те жалкие, кто выбрал путь крестов.
На гуще из compile-errors гадают
Несчастные. О них довольно слов."
Литература:
Для нюфань:
Три классических учебника для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Герберт Шилдт - C++. Базовый курс (2010) - http://goo.gl/qMLAFl
Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - http://goo.gl/QvjR6x
Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u
Для желающих сразу начинать с Откровений Создателя - классика (может показаться суховатым):
Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2009) - https://goo.gl/87qXtW
Учимся не писать говнокод:
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все.
Скотт Мейерс - Эффективное использование 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++ (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) - http://goo.gl/0M4NpG
Ссылки:
Годный блог, в котором все просто и понятно тян не нужны кококок борщ - 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.
Памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Предыдущий: