Это копия, сохраненная 19 ноября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Пусть на тебе и драйвер не напишут!
Ты свой же корень в скверне превзошла!" -
Стенал Никлаус, в горести не слыша,
Как те, кто Страуструпа прославлял,
Зловеще за его спиною дышат.
Что Скоттом звался, с холодом сказал:
"Неужто ты, глупец, не слышишь лая?
От Персефоны не спасет тебя Pascal -
Она такая лютая и злая,
Что хейтерами вечно голодна,
За каждым вслед еще сильней алкая.
Коль не умолкнешь - явится она."
FAQ:
Q: Почему стоит использовать именно C++?
A: Ни один язык не идеален, но по совокупности киллер-фич C++ оставляет любой другой язык позади. Вот основные три:
- C++ действительно быстрый - по скорости он вместе с C с большим отрывом уделывают любой другой язык. Замедление относительно C находится в районе 0-20%, причем проявляется только при использовании высокоуровневых конструкций (в крестах ты никогда не платишь за то, что не используешь).
- C++ один из наиболее выразительных и мощных языков, позволяющий использовать большинство существующих парадигм. Его философия построена на минимальном ограничении программиста в выборе методов и инструментов простреливания ноги решения задач.
- C++ по-настоящему популярен. На нем написаны десятки тысяч приложений и миллиарды строк кода, о нем написаны сотни книг, он до мельчайших подробностей документирован и стандартизован. Используя C++, ты никогда не останешься без работы или поддержки комьюнити.
Q: Но он же давно устарел!
A: Современный C++ весьма далек от языка, которым он был в 1998 году. В настоящее время кресты живее всех живых, их развитие движется семимильными шагами, а новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими. К сожалению, из-за обилия некачественной литературы по крестам, в которой игнорируются новые средства языка, бытует мнение о его "несовременности".
Q: Сейчас все пишут на %languagename, а кресты сосут у него!
A: Нужно понимать, что используемый язык должен соответствовать поставленной задаче. Никому не придет в голову писать на C++ скрипты или веб-фронтенд, но лишь немногие языки могут соперничать с ним по разнообразию решаемых задач.
Q: Хуле тут так сложно? Я открыл учебник, там какой-то ад!
A: Попробуй учебники, изданные после 2011 года. Фичи последних стандартов не только добавили выразительности, но и серьезно упростили жизнь разработчиков. Теперь программировать на C++ стало проще, чем когда-либо! Это не отменяет необходимости прочитать несколько серьезных книжек, чтобы написать на нем что-то годное. Тем не менее, да, C++ это по-настоящему сложный язык. Его никак не получится выучить за 21 день, ну вот совсем никак. Более того, крайне нежелательно пытаться изучить его первым, если ты раньше вообще не программировал. С большой вероятностью это приведет к разочарованию и потере времени. Гораздо лучше будет начать с другого языка и базовых вещей алгоритмы, архитектура пека, операционные системы, а уже потом вернуться к крестам.
Литература:
Для нюфань:
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Стэнли Липпман, Жози Лажойе и Барбара Му - Язык программирования 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/
Видео с CppCon (на ангельском) - http://www.youtube.com/user/CppCon/videos
Куда писать код:
Под шиндошс удобно использовать 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
Библиотека для удобной высокоуровневой работы с сетью (ахтунг! утягивает за собой boost, openssl и даже Аллаха) - https://casablanca.codeplex.com
Простая в обращении библиотека для работы с графикой и аудио - http://www.sfml-dev.org
И многое другое - http://en.cppreference.com/w/cpp/links/libs
Памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Старший брат: >>518562 (OP)
Предыдущий: >>554944 (OP)
Предыдущие треды на архиваче:
https://arhivach.org/thread/94971/
https://arhivach.org/thread/94972/
https://arhivach.org/thread/99414/
https://arhivach.org/thread/100995/
https://arhivach.org/thread/105148/
https://arhivach.org/thread/109335/
https://arhivach.org/thread/112797/
https://arhivach.org/thread/114519/
>https://www.visualstudio.com/ru-ru/products/free-developer-offers-vs.aspx
>ru-ru
ОП-хуй, зачем ссылку на русскую версию даёшь? IDE должна быть на английском языке. Правильно
https://www.visualstudio.com/en-us/products/free-developer-offers-vs.aspx
Спорное утверждение, должен быть тот язык, на котором удобнее работать, имхо. В любом случае, ты можешь при установке выбрать язык.
Шекспир сука, МОАР
Не можешь. В том-то и дело, что я установил Community 2015, а язык только <язык ШindoШs>, английский не ставится. Языковой патч накатывать в духе Микрософт в нескольких гигов желания не было, я снёс и поставил заново, предварительно убедившись в правильности ссылки.
Ну ладно. Пусть аноны в этом треде пока отписываются за и против, а ближе к концу решим, как лучше.
Вы только посмотрите на этого гондона. В четвертый, сука, в четвертый раз откладывает релиз книги на месяц. В июне это был август, в августе - сентябрь... Отвратительный усатый дегенерат, дерьмо, пидор.
300 страничек, уже бы выучил ангельский и прочитал
Ты должен читать не все строки во внутреннюю структуру, а обрабатывать файлы построчно, либо посимвольно(буферизация в помощь) - это поможет избежать лишнего копирования символов туда-сюда.
У тебя задача не требует рандомного доступа к данным, можно обработать потоки последовательно. Твоя ошибка - парсить все строки во внутреннюю структуру.
Чтобы выполнить твоё задание это сделать оч. легко на циклах и на >>(для char), .peek(), .ignore() - конечный автомат там у тебя типичный будет, мысли в терминах автомата. Иногда приходится просматривать на символ вперед, не доставая его - для этого нужны .peek(), .ignore(). ignore еще полезен чтобы пропускать все символы, пока не встретишь определенный.
В твоём случае алгоритм такой:
Цикл по символам файла
Читаешь параллельно 2 файла, сравниваешь символы, пока не встретишь ','
Если символы не равны на каком-то этапе - пропускаешь строчку в обоих файлах с помощью s.ignore( numeric_limits<streamsize>::max(), '\n');s.ignore() либо самописным циклом, переходишь к началу цикла.
Если символы оказались равны - пишешь в выходной файл сначала из первого входного(читаешь до '\n', пропускаешь '\n'), потом из второго аналогично - всё посимвольно.
Проблемы могут быть с виндовским "\r\n" - чтобы не копировать '\r' в выходной файл сделай дополнительную проверку.
Да ты ебнутый, я ее за первую неделю прочитал, неужели у тебя настолько плохо с ангельским? Алсо книга так себе, многие моменты не раскрывает или раскрывает плохо.
Без знания ангельского на уровне свободного чтения со словарём и способности его подтянуть - вон из профессии!
>Проблемы могут быть с виндовским "\r\n" - чтобы не копировать '\r' в выходной файл сделай дополнительную проверку.
Лучше один раз включить std::ios_base::binary при открытии файла filename:
>fs.open(filename, std::ios_base::binary);
>//...
>fs.close();
Для выходного файла, разумеется. Для входного бинарный режим не открывать.
>std::ifstream ifs;
>ifs.open(file_in);
>//...
>ifs.close();
>std::ofstream ofs;
>ofs.open(file_out, std::ios_base::binary);
>//...
>ofs.close();
зачем посимвольно, когда можно читать всю строку а потом вырезать подстроки с помощью find и substr?
string a = "1,A";
string _1 = a.substr(0, a.find(",")); // вырежет единицу. Причем substr это слайс, то есть копирования внутреннего массива не будет.
В какую хотя бы сторону копать?
Или, может быть, можно придумать какую-нибудь невсплывающую замену?
implying посимвольно будет быстрее, т.к. не копируем символы из строк в поток, из потока в строки(т.е. используем строку в качестве дополнительного буфера), а напрямую работая с потоками.
Не, я не об этом. find внутри себя имеет цикл прохода по строке. Если тебе нужен максимум скорости, проще написать такой внешний цикл и читать из потока и писать сразу в поток посимвольно. Собственно, на С без встроенных строк это даже короче всего будет.
у ifstream есть .ignore(size_t, char) - который пропускает все символы до заданного(например нам нужно '\n'). Свой цикл элементарен.
Сравнивать символы пока не встретишь ',' - тоже проще пареной репы.
Обычный же виджет, QFrame например. Перехватываешь маусовер сигнал, отрисовываешь. Там с настройками виджета играешься чтобы получить нужное поведение, например флаги окна выставляешь (Qt::WindowFlags).
Сразу видно пердолика. Очнись, сейчас 2015 год. Компилятор сам сгенерит оптимизированный цикл.
А ты проверь.
>Сразу видно пердолика.
>C++ тред
Oh, you
Алсо, тут задачка - перловый однострочник, а они уже второй тред ебутся.
Ебется только вопрошающий, я ему даже алгоритм дал. Запиливать нахаляву даже такой простой код никто не хочет.
Кстати, мне кажется, что если решить задачу на regexах по строкам, полностью считанным из файла - будет нихуевое замедление по сравнению с посимвольным решением.
regexp компилируется в конечный автомат, примерно так же выглядит и посимвольное решение. Может и будет немного медленнее, но задача IO-bound, как выше заметили.
поправка - implying мы читаем из файлов в строки целиком. В случае построчной обработки тормоза нивелируются чуть ли не до нуля - если строки не длинные.
Пока ты запихнешь байт в жесткий диск, процессор успеет попить кофе, проиграть тебе порно, поспать, и обработать, наконец, новую строку.
Дедушка Кнут тебе бы уже переебал в обучающих целях своим premature optimization.
Ты идиот. Из файловой системы всегда читай по 4096 байт.
Потому что тогда будет меньше перепозиционирований считывающей головки и как следствие - выше скорость.
Для SSD - тоже в опеределенной степени относится.
Он имеет в виду считывать порциями, максимально приближенными к кратности 4096. Идеально считывать 4096, 8192, ну ты понел, если ты считываешь 100к сразу, то тоже годно. А хуево, если ты считал 1 байт, потом еще 1 байт, и так далее, тогда скорость каждого считывания будет почти такая же, как у считывания сразу 4096 байтов, ибо данные с диска выгружаются блоками.
считал буфер в 4096, в буфере уже в памяти нашел окончание строки - скопировал строку.
перекачивание байтиков по шине SATA гораздо более затратная вещь, чем перекачивание байтиков по шине между процом и оперативной памятью
> скорость каждого считывания будет почти такая же, как у считывания сразу 4096 байтов
Зависит от реализации окружения языка. Если считывать при помощи winapi ReadFile - то скорость будет значительно меньше при побайтном считывании, чем при считывании блоком. Проверено на практике
В защиту моей точки зрения выступают memory-mapped file - там как раз идея избавления от user-space буферов и операций копирования. Выигрыш нехилый получается(см. stackoverflow)
Сделой джве ссылки, ептубля.
Я уже не в том возрасте, чтобы с горящими глазами онанировать на бессмысленные оптимизации.
А где ты увидел горящие глаза?
Зато ты в том возрасте, чтобы сидеть на АИБ и троллить ньюфагов, наживая прирост ЧСВ.
Не долбись в глаза же. Считываешь 1 байт = считываешь 1 блок, большую часть времени занимает физический доступ. Т.е. замедление будет почти в 4096 раз.
>избавления от user-space буферов и операций копирования
О да! mmap файлов придумывался именно для того, чтобы байтики лишний раз по оперативе не двигать, лол.
Это из-за оверхеда на сискол. Ядро один хуй меньше блока за раз не читает с диска.
Вопрос в том, определит ли ОС\окружение языка, что считывание происходит последовательно и можно скармливать сисколу данные из буфера и не обращаться к железу каждый раз
Вы все ебланы. fstream по умолчанию имеет буфер, если его не отключить. Так что именно как раз счёт буфера он посимвольно может отработать свою задачу не так уж и медленно. Но не под вендой. А если создаст массив чаров и задаст буфер 4096, это будет самое быстрое решение.
мимо-даун из прошлого треда, вопрошавший про умные указатели
>А если создаст массив чаров и задаст буфер 4096, это будет самое быстрое решение.
У него алгоритм посимвольной обработки, лолка. В чём отличие - проходить по встроенному буферу или по твоему собственному? Читать/писать примитивные типы с >> удобнее через fstream, чем через свой велосипед, т.к. не надо заморачиваться насчёт пересечения каким-либо полем/строкой границ буфера - хотя в данном примере это несущественно. А с regex проблемка в том, что строки могут проходить через границу твоих буферов, а на ходу не подкачаешь её. Regex выполняется по заданной строке, встречая обрыв строки(\n еще небыло, а строка оборвалась краем буфера) - конечный автомат завершает работу.
>>559874
Мимо проходи, если даже не понимаешь о чём речь.
>В чём отличие - проходить по встроенному буферу или по твоему собственному?
Для чара, сайзоф которого == 1, в задании размера собственного буфера. Попробуй и увидишь, что скорость реально поднимется, когда увеличишь размер буфера. Дефолтный буфер маленький.
Для более сложных типов варианты: или размер буфера подгадывать равным порции данных типа, или накрайняк кратным. Это если возможно (очевидно, со строками не взлетит).
Для массивов бинарных данных вообще отрубить буферизацию и писать напрямую .write(reinterpre_cast<const char*>(arr), sizeof_arr) , если они порядка килобайта.
Каждый третий тред, каждый, стабильно. Одно и то же пишу.
Один чары в вектор сует, другой посимвольно читает, третий сисколы высчитывает. Вы бы хоть почитали как всё работает, прежде чем кукарекать.
Дал всем за щеку.
double sqrt ( double x ); //Функция корня для чисел с плавающей точкой
int sqrt ( int x ); //Функция корня для целых чисел
...
sqrt(1.5);//В этом случае вызовется функция чисел с плавающей точкой
sqrt(7);//А в этом уже для целых чисел
А вот поясните, кстати. Если идет речь о непрерывности массива в памяти, то, например, в случае чаров гарантируется, что они займут именно соседние байты? Или только, что arr [i+1] будет указывать на следующий элемент, но при этом сами элементы могут быть, например, выровнены по одному в слове? Другими словами, есть ли гарантия, что между &ch и &ch+1 нет пустого пространства?
Что ты подразумеваешь под листингом? За ассемблерный листинг спрашивай свой компилятор, телепаты у нас в отпуске, а без них я не знаю, как у тебя корни реализованы. Или ты хочешь как раз реализацию корней увидеть? Тогда тебе сюда: http://en.cppreference.com/w/cpp/numeric/math/sqrt и сюда http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
Ну вот, ты опять погуглил за дауна с laba2.cpp
Общая инфа по high perfomance I/O
http://stackoverflow.com/questions/1201261/what-is-the-fastest-method-for-high-performance-sequential-file-i-o-in-c
Бенчмарк с ручной/автоматической буферизацией fstream
http://stackoverflow.com/questions/12997131/stdfstream-buffering-vs-manual-buffering-why-10x-gain-with-manual-buffering
Роль копирования буферов в скорости выполнения программы(просаживаем время на байтики и memcpy)
http://stackoverflow.com/questions/10324582/c-ifstreamread-slow-due-to-memcpy
C-style I/O vs C++ streams
http://stackoverflow.com/questions/17468088/performance-difference-between-c-and-c-style-file-io
Ну раз никто не ответил, я отвечу. Далее везде @ означает * (заменил звёздочки в целях, чтобы макаба не сожрала их попарно на курсив).
Как для массивов вида T arr[10] и T@ arr = new T[arr_size] , так и для std::vector<T> , std::string последовательное расположение элементов от нулевого до последнего (размер - 1) является обязательным требованием стандарта языка C++11 . Иными словами,
arr[3] == @(arr + 3) //values
&arr[3] == arr + 3 //addresses
всегда для любого T: как signed, так и unsigned, как char, так и int.
http://ideone.com/9XVSnO -- простейшая иллюстрация
Отмечу, кстати, что люблю мешать указатели с индексами только в одном случае: когда мне необходима прямоугольная матрица значений. Чтобы не создавать массив указателей на массивы типа T, я создаю просто массив типа T размера size = m X n, потом создаю указатель на его начало, во внешнем цикле постусловие для указателя += m, во внутреннем цикле бегаю по индексам указателя 0 ... n-1. В результате код получается ничуть не менее читаемый, чем с двумерным массивом, но нет мучений с указателями на указатели (раньше я так делал) и нет оверхэда по памяти.
Что касательно векторов и строк, если прямо нетерпится поработать с указателями:
std::vector<T> v(10);
v.data() == указатель на начало данных
std::string s;
s.data() == указатель на начало данных == s.c_str() //null-terminated
Он немного не о том спрашивает. Возможны ли дырки между данными, т. е. padding.
Я прямо ответил, что по стандарту C++11 нет, невозможно. Возможно только последовательное расположение.
Если я не прав, то поправьте меня.
Это и без SO понятно. Если абстрагироваться от архитектуры пека и оставить только стандарт, что такое байт? Это наименьшая адресуемая в крестах ячейка памяти. Из этого сразу вытекает, что адреса, различающиеся на единицу (&ch и &ch+1), отличаются на один байт просто по определению, и никакого паддинга там быть не может.
Но в то же время стандарт не гарантирует, что в байте 8 бит. Там могут быть служебные биты, которые не используются для данных, но они не будут иметь своего адреса, так что это не считается.
Дристанул с этого дауна. Ты бы хоть книжку по модели памяти почитал, по типам адресации, как всё устроено в операционной системе.
Одни дебилы в треде.
>стандарт не гарантирует, что в байте 8 бит.
>могут быть служебные биты,
>они не будут иметь своего адреса
Дристанул тебе в ротешник :DDDD
А теперь открываешь 1.7/1 и понимаешь, что даун здесь ты.
The fundamental storage unit in the C++ memory model is the byte. A byte is at least large enough to contain any member of the basic execution character set (2.3) and the eight-bit code units of the Unicode UTF-8 encoding form and is composed of a contiguous sequence of bits, the number of which is implementation defined.
The memory available to a C++ program consists of one or more sequences of contiguous bytes. Every
byte has a unique address.
Носовал тебе хуев в рот, дебила кусок.
Ну и что тебе не нравится? Например, такие байты стандарт разрешает: [oooooooocc], где o это информационные биты, а c - служебные контрольная сумма в них, rw-метка или еще какая хуйня. У служебных бит не будет отдельного адреса, к ним нельзя обратиться напрямую, но в то же время они будут образовывать "дырки" между соседними восьмибитовыми кусками. Я сказал, что только такие дырки возможны, но считать их не следует, потому что все равно они невидимые для пользователя и не адресуются.
Программирование - это не твоё, закрой этот раздел и не приходи сюда больше.
Мамке своей ты калач под нос сунул. Что в твоей выдержке написано? Что адресуется каждый байт. Где там хоть слово про адресацию отдельных битов, дауненок? Покажи мне, как ты собираешься обратиться к отдельному биту по адресу, без разницы - к служебному или к информационному. Обращаешься к байту по адресу - тебе выдают информационные биты, служебные срезаются, и хуй ты вообще узнаешь их содержимое. Адресует биты он, вообще пушка.
Это информатика, 10 класс. Но ты, видимо, ушел после 9-ого класса в ПТУ на слесаря, поэтому пропустил раздел систем счисления, а в ПТУ не изучают архитектуру процессоров x86 amd64, что такое адресация и что представляет собой память в операционной системе, как с ней работает процессор.
Ты просто дебил из ПТУ без образования. Такие дебилы лезут в профессию, думая, что тут можно получить легкие деньги. Да, их можно получить, но нужны мозги, которых у тебя нет, дебил. Поэтому ты будешь по-прежнему сосать хуи и раздавать листовки, так как на первом же собеседовании после твоего шизофренического бреда тебе перезвонят и будут рассказывать за обедом какой кадр к ним нарисовался, взрываясь хохотом на весь кабинет.
>информатика, 10 класс
>как с ней работает процессор
Не переживай, через пару лет тебе расскажут если ты поступишь на CS.
>память
>в операционной системе
>систем счисления
>процессоров x86 amd64
Можешь не продолжать, я и так уже чуть не пролил кофе.
setWindowFlags(Qt::Popup);
Тот кун всего-лишь пытается сказать, что биты не адресуются и у них нет адреса. Адрес есть у байтов в памяти. У бита нет. К биту ты можешь обратиться по его номеру внутри памяти. Внутри память сначала нужно выбрать байт, а потом можешь работать с битами с помощью битовых операций. Т. е. любой бит не адресуется, а не только служебный.
Ну, там кроме стандартной логики и парсеров всё так пишется. Я вот ебусь в попу с бустовским асио пару дней, хочется чо нибудь написать, а не знаю чо.
Напиши многопользовательскую карточную игру типа в хартстоуна, в которую будут играть боты.
>Если идет речь о непрерывности массива в памяти, то, например, в случае чаров гарантируется, что они займут именно соседние байты? Или только, что arr [i+1] будет указывать на следующий элемент, но при этом сами элементы могут быть, например, выровнены по одному в слове?
Биты тут вообще причём? Хотя бы в исходном вопросе.
Нет такого понятия как служебный бит памяти в архитектуре процессора. Есть только регистры, но не биты. есть 8 бит, и они формируют 1 байт, это не понимает только дебил-залетчик.
Можно сразу бота для Хартстоуна написать. Или целую фабрику ботов, работающих параллельно, собирающую статистику о противниках, перебирающих и проверяющих стратегии.
Таненбаум, Архитектура компьютера, 6 издание, 97 страница. Уймись уже и пиздуй читать книжки, которые умные дяди для тебя написали.
И что там написано, макакич? Только то, что для помехоустойчивого кодирования нужны дополнительные разряды, в которых хранятся вычисленные определенным образом значения (исходное слово проходит через матрицу, строки которой порождают векторное подпространство кодовых слов). Если слово 11010, то к нему можно приписать дополнительные биты 101, к примеру. И все это хранится в одном регистре.
В дополнение, тут нужно сказать, что служебные биты от помехоусточивого кодирования - не доступны на программном уровне.
То, что происходит там внутри в железе - полезно знать электронщикам и низкоуровневым программистам, ебошущим на Verilog\VHDL
А рядовой С++ макаке такие знание наоборот только навредят, что мы собственно и видим тут
мимпроходил
>4 ГБ памяти
>контрольные разряды хранятся в одном регистре
Постой, я тебя знаю. Ты тот чувак, который не имеющий аналогов алгоритм сжатия изобрел, да?
>#include <memory>
>bool* bool_array = new bool[n]();
>std::unique_ptr<bool[]> smart(bool_array);
Допустимо так писать? Утечки памяти точно исключены?
>Ты тот чувак, который не имеющий аналогов алгоритм сжатия изобрел, да?
Съеби, я не страдаю манией изобретательства.
А зачем указатель на указатель? Типа уникальный удалит обычный самостоятельно?
Ньюфаг, простите.
Это не указатель на указатель. Когда конструируешь unique_ptr, он сам не выделяет никакой динамической памяти. Здесь просто указатель скопируется внутрь unique_ptr, и тот станет владельцем данных, которые выделили в предыдущей строке. В случае одиночных объектов для этого используют make_unique.
>>560289
Неа. Если это стековые переменные, то у других потоков не будет к ним доступа, стеки у всех свои. Статическими локальными они быть не могут, т.к. нет квалификатора static. А глобальные инициализируются до начала работы программы, когда есть только один поток.
Вообще-то возможны варианты, если перегружен operator new, но там надо очень постараться. И вообще за потокобезопасность в этом случае программист отвечает.
<устарело> Герберт Шилдт - C++. Базовый курс (2010)
2010. Устарело.
5 лет прошло. Устарело. Вся суть ебаного программизма.
Там устарела небольшая часть, но не расписывать же это в шапке при наличии новейших аналогов. Но вообще да, ты прав, книги весьма быстро устаревают хотя если ты знал кресты в 2010, то тебе не будет трудно изучить новые фичи.
Куча у всех потоков одна. Юник будет на стеке, да. Но если после new поток переключится и умрёт, то память утечки.
А, ну да, я неправильно понял, что ты там хочешь сделать.
Какой поток умрет? Если умрет тот, на который переключились, то поток с unique это никак не заденет. А сам поток с unique умереть никак не может, ибо после аллокации в нем нет опасных операций в этих двух строчках. Бывает еще аварийное завершение всей программы из-за abort в другом потоке, сигнала или пропавшего тока в розетке, но такие ситуации к безопасности исключений не относятся, ибо погроммист это не контролирует и было бы вообще бессмысленно говорить о безопасности, если такое считать.
>Конструктор unique_ptr noexcept.
Не понял. Мне что-то изменить во второй из этих подряд идущих строчек?
Ты хочешь вывести один поток в другой, такой перегрузки << нет. Вытащи из c строку и выводи ее.
noexcept это значит, что конструктор не выбросит исключение, что бы ты в него ни пихал.
Я догадываюсь, что значит noexcept, nothrow и т.д. Я спрашиваю, в этих двух строчках надо что-то поменять ещё?
bool* bool_array = new bool[n]();
std::unique_ptr<bool[]> smart(bool_array);
Плохо продумано у тебя. Всю инфу об ошибке следует пихать в исключение и логгировать уже в обработчике исключений. У тебя операции с c могут вызвать новое исключение, и ты потом хер проссышь, что на самом деле произошло. Твоя задача - сделать безопасно и беспалевно наибольший возможный дамп, а уже потом ломиться в небезопасное логгирование.
Спасибо, няша!
не, я хочу в функции сырой указатель bool_array пихать напрямую, а не smart.get()
class Weapon
{
protected:
\tint atk;
public:
\tvoid set_atk(int atk1);
\tint get_atk();
\tWeapon();
\tWeapon(int atk1);
\tvirtual ~Weapon();
};
Есть функция get_atk()
int Weapon::get_atk()
{
return Weapon::atk;
}
И вот тут самая беда. Эта пидрила почему-то вечно норовит вылететь. Что обращение через "имя_объекта.get_atk()", что через "имя_объекта->get_atk()" вылетает прога нахуй. Пытался есессно разными способами, для "имя_объекта.get_atk()" конструктор по умолчанию, а для -> через Weapon *Spear = new Weapon(21);
ЧЯДНТ?
Хотя какая нахуй разница, он же копируется. Блядь, почему меня клинит именно на этом моменте. Пиздец.
Ты упорот штоле, лол? Определись уже с задачей. Ты либо хочешь владеть данными, на которые указывает указатель, и тогда тебе придется использовать smart.get (), либо имеешь сырой указатель, не владея данными, но тогда ими должен владеть кто-то еще от кого ты получил указатель. Выделяешь память сам - обязан обеспечить владельца. Не знаю, если тебя так клинит на get (), то один раз вызови его, запомни в другом raw-pointer, и передавай в функции уже его, но, блядь, владеющий указатель все равно должен оставаться в скоупе. И да, я не понимаю, почему ты не хочешь передавать const unique_ptr &, с которым можно делать то же, что и с raw-pointer (*, ->, == nullptr, ну ты понел), только delete делать нельзя.
1) Именно, что упорот. Тупняк третий день не проходит. Так всё нормально?
void tvoya_mama(bool@ weight) {}
std::unique_ptr<bool[]> smart(new bool[n]());
bool@ raw = smart.get();
tvoya_mama(raw);
2)
>И да, я не понимаю, почему ты не хочешь передавать const unique_ptr &, с которым можно делать то же, что и с raw-pointer (*, ->, == nullptr, ну ты понел), только delete делать нельзя.
Работать по ссылке это ж медленно. Вот обращаюсь я к каждому элементу, и что, по ссылке обращаться? smart.get()[0] , где аргумент функции const std::unique_ptr& smart
?
Я впишусь, если еще пара человек наберется. А то будет как с РАСПРЕДЕЛЕННОЙ БОРДОЙ. cling = clang + clion, агагагагаг.
Нормально, но выглядит уебищно. Нормальные посоны не думают о такой хуйне, как экономия 1-2 разыменований на всю программу. То, что ты делаешь - преждевременная оптимизация в чистом виде, ты бы на каком-нибудь cache-friendly алгоритме выиграл на пять порядков больше производительности.
Ну у борды нет задач. А здесь месяц работы и все тянки течь будут, а еще можно будет показать на собеседовании ГИТХАБ, бгг
Распиши штоле в треде кратенько - что это за ебала, задачу в целом, делал ли кто-то нечто подобное чтобы велосипедов по минимуму плодить.
Если там надо пилить интерпретатор крестов, то однозначно и десять человек заебутся реализовывать поддержку стандарта, даже частичную. Помните ту кулстори из 90-х, как чуваков из ИСП бельгийцы наняли компилятор писать? Это не шутки, хуле, сейчас 2.5 полноценных компилятора на весь мир, и девелоперы там не питурды далеко.
А что у них реализовано уже? Там вроде увесистый код такой, на гитхабе-то.
Есть cling, это вполне бодрый C++ REPL на основе clang и LLVM JIT. Его не надо пилить, он есть (http://llvm.org/devmtg/2010-11/Naumann-Cling.pdf). Его сделали в ЦЕРНе для работы с системой ROOT - обрабатывать данные с коллайдера. Но пользоваться им неудобно, потому что это не python с import pyopencv, там нужно уныло прописывать include, затем подключать .so библиотеку, и делать это все в сосноли.
Хочется сделать что-то удобное, чтобы, например не брать pyopencv, а сразу делать прототип на С++. Т.е.
1. Среду для работы типа ipython notebook. Можно на базе ipython notebook и сделать. Полноценную IDE типа матлаба мы не потянем, конечно.
2. Легкое использование библиотек. Типа, сделал %import opencv и все, он автоматом сделал нужные #include и подключил нужные .so файлы. Думаю, такой патч можно отдать в апстрим.
3. Различные синтаксические плюшки для удобной работы с REPL.
4. И так далее.
А в чем профиты от REPL с прикруткой к ванильному компилятору-то, оно же тормозить будет адски небось? Алсо, если концепция разрешает только программы из одного выражения, то реализовать это можно за один вечер, без сложных операторов синтаксис крестовых выражений ммаксимум стандартный.
Учитывая, что там llvm jit, оно бодро бегает на уровне -O0 оптимизации. Не -O2, конечно, но оно и не надо для прототипирования.
Надо тогда рекрутировать моар анонов и начать думать подробнее. А потом и спецификации запилим, если попрет движуха.
>Среду для работы типа ipython notebook. Можно на базе ipython notebook и сделать. Полноценную IDE типа матлаба мы не потянем, конечно.
Есть наработки:
https://github.com/jupyter/notebook
https://github.com/minrk/clingkernel
>>560640
>>560639
>>560638
>>560637
Суть в двух словах: C++ web-based REPL на основе ipython notebook, такое, каким удобно пользоваться. Целевая аудитория - различные люди, которые пишут и отлаживают алгоритмы для С++, требующие анализа картинок, графиков и т. п., чтобы избавить их от необходимости промежуточного прототипирования на скриптовом языке, ну а также постоянного цикла рекомпиляции-отладки.
Основа - интерпретатор C++ cling (основан на базе clang и LLVM JIT, умеет С++11), jupyter (бывший ipython notebook), cling-плагин для jupyter.
Cling:
https://ecsft.cern.ch/dist/cling/current/ - бинарники
https://root.cern.ch/cling-build-instructions - сорсы
Jupyter:
Например, sudo pip install jupyter
Cling Kernel:
https://github.com/minrk/clingkernel
Какие-то из фич могут решаться настройками cling, какие-то можно сделать на уровне python-прослойки. А что-то, может, потребует лезть в сам интерпретатор.
Вышеобозначенные вещи я прикрутил (пикрелейтед), но там все очень далеко от чего-то юзабельного. Что сходу подумалось:
1. rawInput
Сейчас есть toggle: .rawInput 0/1. При rawInput 0 введенная строка интерпретируется как что-то типа print(строка). При rawInput 1 - как С++ код. Предлагаю избавиться от этого режима, сделав .rawInput по дефолту и $yoba считать как печать выражения yoba.
Как сделать: пропатчить clingkernel.
2. Простой #include<..>
#include <..> должен автоматически подключать библиотеку. Сделать это можно на уровне конфига:
<opencv/core.hpp>:/usr/lib/libopencv.so
Это - не очень хорошо, потому что зардкод. Можно заставить искать нужную .so на компьютере. CMake тут нельзя подключить? Оно же умеет искать нужный хедер и .so с помощью подключаемых модулей.
Как сделать: тоже можно на уровне clingkernel, но автопоиск библиотек в системе - это вопрос.
3. При двойном объявлении функции:
int yoba() {
return 5;
}
input_line_17:1:5: error: redefinition of 'yoba'
Что есть бред, конечно, функции должны уметь переопределяться
Как сделать: не знаю. Видимо, придется лезть в интерпретатор.
4. Вывод красивых графиков, видео и звуков и прочего говна, как в браузере, так и в отдельном окне. Как цель #1 предлагаю запилить поддержку основых структур данных STL и OpenCV.
Далее более маняфичи:
5. Синтаксические плюшки, типа быстрых лямбд (x => y разворачивается в struct yoba { template<class T> operator()(T x)... )).
6. Подсказки, ускоряющие ввод, типа при объявлении новой переменной y=5 автоматом приписывалось бы auto, и double enter решал бы вопрос.
yoba(x,y,z) может разворачиваться в template<X,Y,Z>yoba(X x, Y y, Z z) и тому подобное. Синтаксис языка Clay может помочь.
7. Добавляйте идеи.
https://gist.github.com/anonymous/17c49b1eea3a87269460
>>560640
>>560639
>>560638
>>560637
Суть в двух словах: C++ web-based REPL на основе ipython notebook, такое, каким удобно пользоваться. Целевая аудитория - различные люди, которые пишут и отлаживают алгоритмы для С++, требующие анализа картинок, графиков и т. п., чтобы избавить их от необходимости промежуточного прототипирования на скриптовом языке, ну а также постоянного цикла рекомпиляции-отладки.
Основа - интерпретатор C++ cling (основан на базе clang и LLVM JIT, умеет С++11), jupyter (бывший ipython notebook), cling-плагин для jupyter.
Cling:
https://ecsft.cern.ch/dist/cling/current/ - бинарники
https://root.cern.ch/cling-build-instructions - сорсы
Jupyter:
Например, sudo pip install jupyter
Cling Kernel:
https://github.com/minrk/clingkernel
Какие-то из фич могут решаться настройками cling, какие-то можно сделать на уровне python-прослойки. А что-то, может, потребует лезть в сам интерпретатор.
Вышеобозначенные вещи я прикрутил (пикрелейтед), но там все очень далеко от чего-то юзабельного. Что сходу подумалось:
1. rawInput
Сейчас есть toggle: .rawInput 0/1. При rawInput 0 введенная строка интерпретируется как что-то типа print(строка). При rawInput 1 - как С++ код. Предлагаю избавиться от этого режима, сделав .rawInput по дефолту и $yoba считать как печать выражения yoba.
Как сделать: пропатчить clingkernel.
2. Простой #include<..>
#include <..> должен автоматически подключать библиотеку. Сделать это можно на уровне конфига:
<opencv/core.hpp>:/usr/lib/libopencv.so
Это - не очень хорошо, потому что зардкод. Можно заставить искать нужную .so на компьютере. CMake тут нельзя подключить? Оно же умеет искать нужный хедер и .so с помощью подключаемых модулей.
Как сделать: тоже можно на уровне clingkernel, но автопоиск библиотек в системе - это вопрос.
3. При двойном объявлении функции:
int yoba() {
return 5;
}
input_line_17:1:5: error: redefinition of 'yoba'
Что есть бред, конечно, функции должны уметь переопределяться
Как сделать: не знаю. Видимо, придется лезть в интерпретатор.
4. Вывод красивых графиков, видео и звуков и прочего говна, как в браузере, так и в отдельном окне. Как цель #1 предлагаю запилить поддержку основых структур данных STL и OpenCV.
Далее более маняфичи:
5. Синтаксические плюшки, типа быстрых лямбд (x => y разворачивается в struct yoba { template<class T> operator()(T x)... )).
6. Подсказки, ускоряющие ввод, типа при объявлении новой переменной y=5 автоматом приписывалось бы auto, и double enter решал бы вопрос.
yoba(x,y,z) может разворачиваться в template<X,Y,Z>yoba(X x, Y y, Z z) и тому подобное. Синтаксис языка Clay может помочь.
7. Добавляйте идеи.
https://gist.github.com/anonymous/17c49b1eea3a87269460
1. Нахуя $yoba-то? Лучше в нормальном крестовом синтаксисе сделать, типа << yoba, чтобы согласованность была.
2. Мне кажется, достаточно будет прикрутить ввод путей к additional dependences, тебе же не каждые пять минут их вводить. Поиск хуй сделаешь нормально, ибо часто библиотеки не устанавливают в систему, а кладут в репозиторий во избежание проблем переноса. А искать по всей системе ты заебешься, тем более, имена не унифицированы. Можно по умолчанию подключать все либы из своей папки, алсо.
3. Это побеждается дополнительным декорированием имен функций, шоб при переопределении была формально уже другая функция, а ссылки на старую перенаправились на нее.
4. SFML прикрутить, например, и сделать пару встроенных функций для отрисовки. Ну и предоставить пользователю доступ без дополнительных прикручиваний. OpenCV имхо слишком тяжелая, чтобы ее всю тянуть за собой по умолчанию, тем более, там 95% фич не нужны слишком уж часто.
5. Лол.
6. Нормально это реализовано (т.е. так, что не хочется отключить подсказки нахуй) только в студии, но попробовать можно, да.
QML
потому что нужно cerr << c.str() << endl делать
у ostream нет перегрузки для operator<< для типа stringstream
алсо, гроб-гроб-кладбище-макрос, сделай свой собственный класс эксепшонов и логируйся в нем
Перевод текста на картинках. Скармливаешь софтинке изображение, она находит текст, гуглом переводит и втыкает обратно. Как приложение на ведроиде.
По стандарту языка C++.
http://stackoverflow.com/questions/5474349/initialization-of-objects-with-static-storage-duration-in-c-vs-c
Но это не отвечает на вопрос, почему так.
>1. Нахуя $yoba-то? Лучше в нормальном крестовом синтаксисе сделать, типа << yoba, чтобы согласованность была.
Нет, согласованность как раз не нужна. Символ $ выбивается из синтаксиса, поэтому никогда частью скрипта быть не может. От << будут одни проблемы при копипасте если этот оператор окажется на новой строке.
>Мне кажется, достаточно будет прикрутить ввод путей к additional dependences, тебе же не каждые пять минут их вводить.
Это больше похоже на msvs подход, но для первой версии хорошая мысль. Подобные пути cling уже имеет, нужно только составить маппинг типа хедер:имя_библиотеки.
>Это побеждается дополнительным декорированием имен функций, шоб при переопределении была формально уже другая функция, а ссылки на старую перенаправились на нее.
В любом случае надо лезть в интерпретатор и спрашивать у cling-чуваков, как это лучше сделать. По остальному - ты пиши лучше хотелки. Детали реализации на следующем этапе обсудим.
static-член класса инициализируется при первом обращении, static-локальная переменная - при первом вызове объемлющей функции. Так что ты хуйню написал.
Так и не понял, когда union использовать вместо struct, и какие преимущества будут у variant в c++1z?
Если кому не лень, конечно.
Ты имеешь ввиду почему нулем инициализируется? Чтобы избежать трудновоспроизводимых багов, если ты забудешь ее проинициализировать правильно - если не записать нулем там будет случайное содержимое что будет труднее заметить чем если там будет 0. Рекомендуется все переменные всегда инициализировать при обновлении 0. Ну или там 0xDEADBEEF для мамкиных хакиров.
Возможно, сегодня именно вы сможете помочь мировому искусству!
Дело в том, что есть один Adobe Illustrator. В этом Иллюстраторе есть возможность биндить клавиши. И, в отличие от некоторых других программ, работающих с компьютерной графикой, в иллюстраторе эта возможность ограничена. Некоторые элементы интерфейса можно биндить только на кнопки, другие только на сочетание клавиш - ctrl + кнопка и т.д.
У меня с их этого не в меру охуенного решения немного бомбонуло, и вот я здесь.
Можно ли сделать, чтобы ограничение на бинды клавиш исчезли?
Я в коде не шарю, но на пеке есть работающая студия.
Карочи, надеюсь на вас.
> Это побеждается дополнительным декорированием имен функций, шоб при переопределении была формально уже другая функция, а ссылки на старую перенаправились на нее.
Вообще, спасибо за идею. У такого языка, как С++, большие проблемы со стейтом интерпретатора, потому что после jit-компиляции биндится все гвоздями. Т.е.
int yoba(){
$int yoba() {}
$int yoba2() {yoba();} <= здесь вызов yoba превратит по сути в переход по указателю
$int yoba() {/redifinition/} //и yoba2 не изменится
А декорирование top-level функций и переменных (?) помогло бы от этого.
съеби
Пошел нахуй.
Если честно, я даже не могу вспомнить ни разу, когда я бы пользовался union. Я не уверен, что это легаси из C, но необходимость в них точно не ощутмшь часто.
>>560906
Я не про примитивные типы говорил же, а про момент, когда вызывается конструктор - он не всегда до запуска программы. На этом, например, синглтоны основаны. А про инициализацию примитивных типов поддвачну, это хороший тон.
>>560938
Конечно, это костыль еще тот. Надо будет его по уму сделать, чтобы память не засорялась старыми версиями функций.
>>560943
Функции жи и так вызываются по указателям всегда, там и делать ничего не придется. А для переменных, наверное, такое не нужно, если мы статическую типизацию сохраняем. Просто очередное присваивание будет.
А, вообще я не сразу понял тебя. Да, это проблема. На первый взгляд вижу только радикальное решение - запретить обычные функции, оставить глобальный каталог std::function. Тогда лишняя косвенность будет, но пользователь будет юзать указатели на них, и достаточно будет перенаправить сам объект в каталоге на переопределенную функцию.
Вешаешь хук на обработчик нажатий и пишешь свою функцию.
Union изначально задумывался для экономии памяти/динамических аллокаций. Применяются они на самом деле нечасто, всегда можно обойтись без них - так что можно сказать что union нужны для оптимизации некоторых конструкций. На stackoverflow есть толковые вопросы с кучей хороших объяснений и примеров.
http://stackoverflow.com/questions/2310483/purpose-of-unions-in-c-and-c
http://stackoverflow.com/questions/2310483/purpose-of-unions-in-c-and-c
>динамических аллокаций
Я имел в виду количества динамических аллокаций памяти(т.к. "разнотиповую" переменную можно реализовать через наследование, с дополнительным уровнем косвенности - и придётся перевыделять память при смене "типа" переменной).
Да, я примерно об этом. Надо будет лезть в исходники cling и препроцессить AST, чтобы заменить вызовы top level (не #include) функций на косвенные через каталог. Сам top level должен быть во многом динамическим языком.
Ну так локальные переменные вполне себе живут с мусорным значением. Почему глобальные пре-инициализируются нулём, а локальные нет?
Есть такой код
http://pastebin.com/wRDtedrw
Как мне сделать его рабочим? Нужно чтобы в этом классе было поле с колбеком, который может быть и обычной функцией, и методом какого-то класса
вы ток намекните, а дальше я сам
Для локальных это, например, отдельная операция, а для глобальных - нет, их загрузчик инициализирует.
В нем хранятся такие объекты:
https://gist.github.com/anonymous/d360ba72bc092124dbb9
Компилятор ругается вот так:
https://gist.github.com/anonymous/f2196d542431d08b22de
И правильно ли я выделяю strlen() + 1 байт под строки?
Очевидно, твой переопределенный тобой HIDDeviceInfo::operator== принимает аргументом HIDDeviceInfo&, а должен const HIDDeviceInfo&, показав тем, что он этот аргумент не изменит.
Привлекаю внимание.
[code]
friend bool operator ==(const HIDDeviceInfo &dev1, const HIDDeviceInfo &dev2);
[/code]
Не помогло
'bool HIDDeviceInfo::operator==(const HIDDeviceInfo&, const HIDDeviceInfo&)' must take exactly one argument
bool HIDDeviceInfo::operator ==(const HIDDeviceInfo &dev1, const HIDDeviceInfo &dev2){
^
Я ответил тебе HIDDeviceInfo, когда еще только ошибку прочитал, а в код не смотрел. У тебя это функция-друг, а не член класса, поэтому убери HIDDeviceInfo::
Этот префикс означает, что идет определение метода класса HIDDeviceInfo
Вот код :
http://ideone.com/E6ZSwV
это класс U. Он по сути нихрена не делает.
Далее я создаю вектор Этого типа.
>vector<U> vector1;
>vector<U> vector2(3);
Во втором случае, я не могу разобраться ,
как вызывать конструктор МОЕГО класса, а не конструктор
Думаю, что ответ простой, но я не хочу отвлекаться и опять нырять в классы...
В общем подскажите, плз
http://ideone.com/Tem3Bm
Но он должен выдать (см. картинку):
vector2[0].genetation : 1
vector2[1].genetation : 1
vector2[2].genetation : 1
Общее количество копирований : 3
Но не выдает.
Автор далее поясняет по тексту, но я не догоню.
Мда, проведу аналогию: у тебя есть гараж (vector) под машину (U). Ты спрашиваешь как завести машину в гараже, но машины в граже и нет.
>но я не хочу отвлекаться и опять нырять в классы...
Еще один залетыш короче, забей, программирование не твоё.
Вектор хранит элементы, ему до пизды на твои конструкторы U. Ты должен создать объект класса U и только потом положить его в вектор. А то что там указана тройка:
>vector<U> vector2(3);
Это число передается в конструктор вектора, указывая ему размерность для трех элементов.
В-общем, забей. Ты слишком глуп.
Я не понял из того, что ты теперь написал, так что соси.
А еще вектор можно инициализировать вот так
std::vector<U> vector1{ U(1), U(1488), U() };
auto xyu = U(1488); // generation 0
auto pizda = U(xyu);
std::vector<U> vector1{ U(xyu), U(xyu) }; // generation 1
Почему же не выдает? По твоей ссылке на ideone очень даже выдает.
Да я не понял, что у тебя за байда. Не может такого быть, что с -std=c++11 ничего не выдает, а без него - печатает что надо.
Эмм, последний цикл - это строчки 44-46, которые печатают?
void f_1(int i, size_t n, int@ data) { ... }
void f_2(int i, size_t n, int@ data) { ...; f_1(i, n, data); }
void f_3() { int i = ...; size_t n = ...; int@ data = ...; f_2(i, n, data); }
f_3() вызывает f_2(i, n, data), в которой сначала идут какие-то вычисления с использованием int@ data, а потом вызывается f_1(i, n, data).
Теперь, собственно, вопрос: имеет ли смысл в void f_2(int i, size_t n, int@ data) вместо тупого копирования первых двух аргументов поставить ссылки? Чтобы стало вот так:
void f_1(int i, size_t n, int@ data) { ... }
void f_2(int& i, size_t& n, int@ data) { ...; f_1(i, n, data); }
Т.е. с сделать это с целью, чтобы первая функция брала аргументы напрямую из третьей, без копирования во вторую функцию? Или накладные расходы неизбежны и дешевле копировать во вторую?
>Эмм, последний цикл - это строчки 44-46, которые печатают?
: Да, именно они.
> Не может такого быть, что с -std=c++11 ничего не выдает
: Я тоже так подумал, но
Ты можешь в том же Ideone попробовать. там правда не нашёл C++11, но есть С++14. он даст пустой вывод
Пустой вывод в смысле все по нулям? Да, так и выдает, и это нормально. Потому что в C++11 добавили move-semantics и всякие оптимизации, и теперь там при создании векторов не нужно ничего копировать - так быстрее и лучше. Потому ничего не копируется, и нули везде.
А за сам цикл можешь пояснить.
Просто не пойму, в каком месте там происходит вызов конструктора, который увеличивает статическую переменую
А в цикле он не происходит, наверное.
Я там писал код, чтобы показать что к чему, но ideone глюканул, и мне лень его снова писать. Короче засунуть отладочный вывод чего-нибудь в конструктор копирования и добавь еще выводов чего-нибудь в консоль после создания векторов, после ассертов и в тело цикла, и тогда увидишь, во время каких шагов у тебя вызывается конструктор копирования.
Да. Точно.
vector<U> vector2(3);
Всё делается в самом начале/
Всё-равно пока не сообразил, почему так.
но хрен с ним. позже вернусь к этому впоросу.
спасибо , бро.
Потому что посмотри сюда http://en.cppreference.com/w/cpp/container/vector/vector
Там используется конструктор номер 2 - с параметром по-умолчанию. То есть там как будто происходит
vector vector1(3, U()), и этот U() в C++ до 11 версии передается как const U&, но программа ведь не может взять и объект по константной ссылке засунуть в вектор 3 раза - получается, ей надо его скопировать. Вот она и копирует.
В случае инлайна нет разницы, в случае отсутствия инлайна - не надо ставить, лишняя косвенность хуже копирования одного инта.
Дырявая абстракция плоской модели памяти: есть регистры, кэш и прочая хуетень. Современный компилятор твои инты скорее всего передаст через регистры, поэтому ему твои костыли в виде ссылок особо не нужны. Если бы было const int&, это еще имело какой-то смысл, но не так.
Именно, что const. Я просто забыл дописать:
void f_1(const int i, const size_t n, int@ data) { ... }
void f_2(const int i, const size_t n, int@ data) { ...; f_1(i, n, data); }
void f_3() { int i = ...; size_t n = ...; int@ data = ...; f_2(i, n, data); }
Застрял на другом, суть проблемы:
https://gist.github.com/anonymous/836ec84e046a5866874c
Код HIDDeviceInfo:
https://gist.github.com/anonymous/18b03f082d45e602ce6d
Ну наконец-то, блядь, хороший вопрос кто-то задает.
Смотри, все оче просто. Ты сделал cool_object, чтобы аргументы шаблона cool_object_t выводились из типов аргументов функции при его создании, и можно было писать auto. Но тут есть проблема. Когда ты пихаешь в cool_object не std::function, а нечто, что кастуется в нее указатель, лямбду, метод класса, автоматический вывод шаблонных аргументов не сработает. Почему? Потому что он происходит до разрешения перегрузки и тупо подставляет неизменный тип аргумента функции который не std::function, пытаясь найти подходящие шаблонные аргументы для вывода. У него это, естественно, не получается, и он выдает ошибку.
Чтобы это исправить, ты можешь, во-первых, всегда кастовать аргумент из указателя или что там у тебя в std::function перед передачей в cool_object, но это будет не оче красиво. Еще ты можешь явно указывать аргументы шаблона но это еще менее красиво, и вообще отпадает надобность в cool_object.
Но ты, разумеется, хочешь сделать красиво, чтобы вся эта ебала корректно распознавала, что ты там в нее пихнул. Для этого ты можешь сделать по одной перегрузке cool_object для std::function, указателей, указателей на члены, ну в общем для всего, что ты туда собираешься пихать:
[code lang="cpp"]
template <typename R, typename ... Args>
auto cool_object (R (t) (Args ...))
{
\treturn cool_object_t <R, Args ...> {t};
}
template <typename T, typename R, typename ... Args>
auto cool_object (R (T::t) (Args ...))
{
\treturn cool_object_t <R, T&, Args ...> {t};
}
[/code]
У такого подхода есть минус - если ты хочешь пихать туда самописные функторы, то придется либо предоставлять в них using-поля, через которые общая версия cool_object сможет вытянуть информацию о том, что ей пихать в шаблонные аргументы создаваемой std::function, либо предоставлять по отдельной перегрузке для каждой новой комбинации параметров. Лямбды тогда тоже можно будет пихать, но со SFINAE-изъебствами.
А общего способа, чтобы из единственного шаблонного параметра как-то достать R (Args...), нет, к сожалению. И это понятно, ведь в общем случае у класса может быть несколько перегруженных operator (), и тогда, например, возвращаемый тип у него не определен строго.
Еще, по поводу "коллбэков". На всякий случай напомню, что в сторонний C-код нельзя передавать коллбэками ничего, кроме глобальных функций. Даже static методы нельзя, а уж обычные методы и подавно. Там какая-то ебала с соглашениями о вызовах, но в итоге выходит так, что это явно запрещено и вызывает UB хотя на практике часто работает.
Ну наконец-то, блядь, хороший вопрос кто-то задает.
Смотри, все оче просто. Ты сделал cool_object, чтобы аргументы шаблона cool_object_t выводились из типов аргументов функции при его создании, и можно было писать auto. Но тут есть проблема. Когда ты пихаешь в cool_object не std::function, а нечто, что кастуется в нее указатель, лямбду, метод класса, автоматический вывод шаблонных аргументов не сработает. Почему? Потому что он происходит до разрешения перегрузки и тупо подставляет неизменный тип аргумента функции который не std::function, пытаясь найти подходящие шаблонные аргументы для вывода. У него это, естественно, не получается, и он выдает ошибку.
Чтобы это исправить, ты можешь, во-первых, всегда кастовать аргумент из указателя или что там у тебя в std::function перед передачей в cool_object, но это будет не оче красиво. Еще ты можешь явно указывать аргументы шаблона но это еще менее красиво, и вообще отпадает надобность в cool_object.
Но ты, разумеется, хочешь сделать красиво, чтобы вся эта ебала корректно распознавала, что ты там в нее пихнул. Для этого ты можешь сделать по одной перегрузке cool_object для std::function, указателей, указателей на члены, ну в общем для всего, что ты туда собираешься пихать:
[code lang="cpp"]
template <typename R, typename ... Args>
auto cool_object (R (t) (Args ...))
{
\treturn cool_object_t <R, Args ...> {t};
}
template <typename T, typename R, typename ... Args>
auto cool_object (R (T::t) (Args ...))
{
\treturn cool_object_t <R, T&, Args ...> {t};
}
[/code]
У такого подхода есть минус - если ты хочешь пихать туда самописные функторы, то придется либо предоставлять в них using-поля, через которые общая версия cool_object сможет вытянуть информацию о том, что ей пихать в шаблонные аргументы создаваемой std::function, либо предоставлять по отдельной перегрузке для каждой новой комбинации параметров. Лямбды тогда тоже можно будет пихать, но со SFINAE-изъебствами.
А общего способа, чтобы из единственного шаблонного параметра как-то достать R (Args...), нет, к сожалению. И это понятно, ведь в общем случае у класса может быть несколько перегруженных operator (), и тогда, например, возвращаемый тип у него не определен строго.
Еще, по поводу "коллбэков". На всякий случай напомню, что в сторонний C-код нельзя передавать коллбэками ничего, кроме глобальных функций. Даже static методы нельзя, а уж обычные методы и подавно. Там какая-то ебала с соглашениями о вызовах, но в итоге выходит так, что это явно запрещено и вызывает UB хотя на практике часто работает.
Даже если это int , к которому часто обращаются внутри этой функции (проверить, больше он семи или ещё что)
Скорее всего нет, int и size_t обычно по размеру точь в точь как указатели, а ссылки реализованы через указатели.
Я бы не стал ставить const & для примитивных типов на самом деле. Если ты передашь их по значению, то изменение внутри функции все равно не испортит ничего в вызывающем коде, ты максимум что сможешь - насрать под себя, изменив аргумент внутри функции, а потом его снова считав, думая, что он остался старым. А косвенности не будет зато.
Да компилятор разберется, тут вопрос в том, что иммутабельность по умолчанию - добро.
Он не требует, если ты не вызываешь методы, которые его используют. Юзай emplace вместо insert, или вставляй готовые объекты.
Ок, спасибо
Смотри, я пилю небольшой проектик. Так, чисто для себя. В этом проектике есть возможность управления с клавиатуры.
Конечно, есть самый очевидный вариант - написать листенер, унаследовать от него все необходимые классы. И дальше просто отлавливать сообщение WM_KEYDOWN и передавать сигнал во все листенеры.
Да, так можно сделать, но... Это как-то слишком по-джавовски. Я ненавижу стиль Java, со всей её энтерпрайзнутыми стандартами, фабриками абстрактных фабрик, ужаснейшим принципом построения программ и кошмарнейшими соглашениями о стиле кода. Это пиздец. И я хочу, чтобы в моём проектике не было ничего от джавы, совсем ничего.
Что можно сделать?
Например, void Yoba::registerListener(std::function<void(int)> callback) { this->listeners.add(callback); }
Ну, в смысле, не add, а push_back, ну ты понел. Ну или можно рассмотреть систему сигналов-слотов на boost::signal, но это без меня.
Не так спросил, вот я мудак. Как переместить курсор на экране в положение, которое приходит из /dev/usbhid? Вот так правильно.
ШТО? Я не хочу ебаться с асмом. Ксорг как-то получает координаты, правильно? Как его наебать и запроцессить отображение курсора самому?
Это надо printf-у скормить.
Я думаю, тебе надо свой драйвер написать evdev
У меня есть некий класс, в котором есть поле std::auto_ptr<int> smart_ptr и в дефолтном конструкторе я пишу
smart_ptr = std::auto_ptr<int>(new int(5));
Допустим, у меня выбрасывает bad_alloc. Что происходит после этого? Могу ли я достучаться smart_ptr.get() и получить какой-нибудь 0, символизирующий неудачную аллокацию или я получу исключение, связанное с нарушением прав доступа при чтении по адресу?
Да, мне нужно сделать это именно через вектор.
В ДНК
Так ты же дебаг не сделал. Честно, ты просто хуесос ленивый, у тебя вопросов по существу нет.
Удваиваю.
Слева от зеленой полосочки жмякни лкм , появится красненький кружочек и жмакай ф5. Ну ёб твою мать.
Слева есть серая полоска, при клике на нее ставится брейкпоинт. Ставишь брейкпоинты, запускаешь дебаг (из меню run вроде), далее смотришь значения твоих переменных в каждой строчке и смотришь, нет ли ничего странного.
Вообщем нужна софтина, в которую код вставляешь, а она блок-схему рисует
Подскажите быдлу пожалуйста
опыт разработки сетевых приложений (сокеты)
Разработка под линукс
Ну кроме очевидных низкоуровневых соккетов, неужели в прикладных приложениях все с ними ебутся?
boost::asio, libevent
Адекваты в большинстве сетевых приложений RPC используют, а не сокеты.
Проблема в том, что помимо написания кода, нужно научиться его отлаживать. Хотя бы отладочной печатью. Ты это делать не хочешь, а хочешь быстренько сделать лабу и пойти двачевать.
Если ты делаешь это в теле, а не через список инициализации, то к моменту начала выполнения конструктора smart_ptr уже будет создан дефолтным конструктором auto_ptr, который пихает в него nullptr. Так что да, если ты поймаешь свое исключение в конструкторе, то по get сможешь получить нулевой указатель, а вот если исключение пройдет наверх, то конструктор твоего класса недовыполнится, и объект не будет считаться созданным (для smart_ptr при выходе исключения за пределы конструктора вызовется деструктор, и больше он не будет доступен).
Алсо, auto_ptr уже давно deprecated, используй unique_ptr или shared_ptr.
Да бля, вчера препод на паре этот код показывал, у него он работал, хочу разобраться просто, почему у меня нет. Воспроизвел вроде в точности как было. А отладке нас даже не учили пока.
Правильно ли я понял, что лучше тогда не использовать инициализацию полей через список в принципе?
Знаю, но фирма, в которую я мылюсь устроиться, всё еще юзает auto_ptr.
Или препод хуесос(что в универах не редкость), или ты невнимательный. В любом случае, дебаг надо освоить. Я более чем уверен, что за него вам никто и слова не скажет. Мне не говорили в моём говновузе так точно.
Блядь, нашёл таки и убрал лишнюю точку с запятой без дебага. Неужели нельзя было сразу на неё указать?
Наоборот жи. Ну не выделилась у тебя память, и хуле ты будешь делать? Зачем тебе объект, который конструируется по дефолту по с выделенной памятью, то с nullptr? Это же сразу дополнительные проекты надо хуярить, а так будет гарантия - если исключение не выбросилось, то все выделилось, и объект годный.
Ты получил рыбу, дурачок, а удочку не хочешь юзать. В следующий раз голодным останешься.
Однажды наступив на эти грабли и вдоволь поебавшись, ты запомнишь эту ошибку. Жаль, ты так и не освоил дебаг и не увидел, что в первом for у тебя нихуя не происходит. Так бы ты не ныл и не шел из-за хуйни сюда.
А смысл осваивать ради такой мелкой хуйни? Может потом ещё в ВУЗе будем изучать?
Я за геттер беспокоюсь для этого поля. Если я не ошибаюсь, то проверка if(!smart_ptr.get()) нихуя не даст, ибо он ссылается на мусор, а не на nullptr. Или я говна поел? Я бы просто всё сам проверил, но ручной throw bad_alloc'a не моделирует реальную ситуацию или я сделал что-то не так
Если у тебя не связана с этим специальность(спрашивается, нахуя тогда давать с++, а не паскаль), то смысла немного. А так это тебе поможет сэкономить время и в конце концов ты начнешь думать сам
Где у тебя проверка-то, сразу после выделения пкмяти? Тогда она на хуй не нужна, если new выбросит исключение, то до нее управление не дойдет просто, оно сразу перейдет в catch-блок. У меня смутное подозрение, что ты не оче хорошо представляешь, как исключения работают.
Я пытаюсь добиться того, что если в случае не выделения памяти для моего auto_ptr, я с помощью геттера не кинул ссылку на мусор, а вернул какой-нибудь 0.
Если память не выделилась, то конструктор не выполнится и объект не создастся. И ты не сможешь вызвать его геттер, ну очевидно же. Забей, короче говоря, все нормально.
Ребят, нужно вывести функцию Эйлера от входного значения. Моя задача не укладывается в 2 секунды, может быть кто-то может помочь ускорить ее? http://pastebin.ru/3KManAiT
Ну можешь заменить i*i <= n на i < sqrt(n) но это не даст заметного ускорения.
Эта мелкая хуйня встречается в любом языке, где есть фигурные скобочки. Т.е. в подавляющем большинстве языков.
Во долбоёб, а. Ну откуда вы лезете, блядь.
Не знаю, где бутылочное горлышко твоей задачи в целом, но вижу как минимум два проблемных места. Первое — и это обсуждалось уже раз десять — замени все i++ на ++i и k++ на ++k (на миллиарде операций выиграется порядка секунды). Потому что тебе нужен преинкремент (мгновенный инкремент), а не постинкремент (инкремент после обращения к переменной — это нужно например когда обращаешься в массив по индексу, а потом хочешь хочешь увеличить индекс на единицу).
Второе проблемное место уже позволит выиграть существенно больше.
>for (int i = 2; i * i < n + 1; i++)
Попробуй заменить на:
>for (int i = 2, square = 4; square <= n; square += i, square += ++i)
Т.е. я:
а) убрал лишнюю операцию прибавления единицы в каждой итерации за счёт нестрогого неравенства (небольшой выигрыш, сравнимый с ++i vs i++)
б) использовал формулу (i + 1)^2 = i^2 + 2i + 1 , представив 2i + 1 = i + (i + 1) .
Добавлена ещё одна переменная и два её инкремента, но я полагаю, для больших чисел выигрыш будет неслабый. В связи с чем у меня к тебе встречная просьба: проведи измерения и сообщи, насколько вообще это улучшило тебе производительность (было / стало). Самому интересно, т.к. у меня абсолютно ТАКОЙ ЖЕ цикл for в одной задаче, но измерять мне лень, а тебе по-любому надо.
Нет никакой разницы, вообще никакой между пост-инкрементом и пре-инкрементом, когда результат операции не используется.
И есть задача
http://www.cyberforum.ru/cpp-beginners/thread1557305.html
Помогите сделать так, чтобы если 2 одинаковые строчки, то выводило только одну, помогите добавить эту проверку
Кто поможет в ближайший час - 100р на мобилку
Как в проект добавить несколько форм и заставить их работать?
Нужно 3 формы - 1 отправляет на 2, 2 на 3 и 3 на 1.
1 - Ввод ника
2 - Игра
3 - Вывод победителя и предложение продолжить игру
Или может быть есть возможность реализовать это в одной форме?
подскажите плиз, как восстановить исходное положение элементов в стеке? то есть чтобы они выводились таким же образом, как и вводились(то есть если я ввожу 12345, то и выводилось у меня 12345)?
Ты можешь это обосновать?
Взять второй стэк.
Использовать очередь.
>И пиарь их на SO потом.
Это как? Типа создаешь вопрос, но на самом деле это ссылка ведущая на гитхаб?
аноны, помогите
в чём там дело? если я пишу &stack::push, выдаёт ещё больше ошибок
http://pastebin.com/AhUUrMmu
Не, ну, например, ты написал либу для автоматической дрочки. Ищешь ньюфага, который спрашивает, как ему запилить автоматическую дрочку, и расписываешь за преимущества твоей либы. Потом этот вопрос начнет гуглиться, если тебе повезет, и дохуя народу ее скачают.
push () пиши, это тебе не хаскелл.
Хитро придумал, антоша. Как теперь побороть страх выкладывать код?
помогите пожалуйста, пишу класс, в нём есть динамический массив, вызываю функцию void без аргументов, в которой ввожу символ, и хочу этот символ вставить в динамический массив, и у меня выбивает ошибку. Что не так с моим кодом?
Мне вот интересно, как вы доходите до стеков, не умея вызывать функции?
требуется мне HANDLE консоли взять, но к моему сосажелению, при подключении библиотеки ШИНДОВС.h вижстуд начинает ругаться на typedef при объявлении класса >переопределение; typedef нельзя перегрузить другим символом
нужно как-то енто обходить или решать?
памаги pr
лол решил, удивительно, что мой объект с ебанутым названием оказался в шиносовско библиотеке
В строке 12 ты создаешь массив 0 размера. Используй new char[size], где size - максимальное количество элементов.
смотри, как легко решаются проблемы на дваче
Ты пытаешься выделить 0 элементов и в итоге у тебя нулевой указатель, от того и рантайм ошибка
new char[10] к примеру юзай, или сколько там тебе нужно элементов
а вообще иди книги читай, а не гайды на ютубе смотри
std::string + std::regex.
Ну или QString.
Ну или CString, если извращенец.
А вообще, на твоей стадии обучения стоит написать свой класс строки.
>А вообще, на твоей стадии обучения стоит написать свой класс строки.
Всегда проигрывал с индивидов с таковыми суждениями. Вас или из 19-го века завезли, или ты уже успел забыть, как сам учился.
Ну ладно, скажи хоть, какими средствами ему реаллокацию массива делать.
Для зайца считаешь растояние Чебышева до клада, для волка - манхетенское. Если у волка меньше он победил. Если волк не победил то победил заяц.
Что?
А как эти расстояния вычислить?
Это вроде особенность автодополнения кода в студии, она имя функции после точки предлагает, а скобки нет.
Нет, это всего лишь означает, что вызовется конструктор перемещения вместо конструктора копирования. Если ты в своем классе хранишь указатели и написал конструктор перемещения, чтобы он просто их перенес без глубокого копирования, то да. А если, например, у тебя в классе 100 интов без указателей, то в любом случае придется их копировать, перемещение не даст никакого выигрыша.
fork/exec, например.
Я у мамі слегка жопорук, опять сажа...
Ананасы, помогите разобраться с dllками. Допустим я в dllке создал ресурс с диалогом, и процедуру для него. Как мне запустить все это дело в программе? Шляпа которую я написал не работает.
Можно еще предотвратить утечку памяти. Например shared_ptr освобождает память если на нее не указывает ни один указатель.
Для массивов в куче есть vector
В самом общем случае - для гибкого управления временем жизни объекта. Чтобы он не удалялся при выходе за пределы скоупа, как на стеке, а можно было передавать владение объектом между разными функциями и другими объектами. Куча не обязательно используется, кастомные делетеры позволяют хранить в них файловые дескрипторы, сетевые соединения, да что угодно вообще.
Чтобы гарантировать фиксированный размер числа. Для обычных типов гарантии стандарта очень скудные, строгое требование только char = байт.
Это понятно. Он (или уже даже скорее я) спрашивает, нахера нужны чары char16_t и char32_t, когда есть int16_t/uint16_t и int32_t/uint32_t .
А new кинет bad_alloc?
Ответил какой-то мудак.
move позволяет "сменить имя" объекта, без реального копирования.
b = move(a) означает, что теперь b указывает на память, которую раньше адресовал a. а теперь "смотрит" в никуда, но можно что-нибудь присвоить.
У ссылки нельзя менять владельца.
Не дефолтный конструктор перемещения или присваивания может хоть мамку ебать, но нарушать семантику не надо
А вот это хуй знает, если честно. До кучи, наверное, я ими не пользовался ни разу.
Это бред. Ты явно с жабой попутал, лол. Открой стандарт уже, там черным по белому написано. Или вот, например: http://en.cppreference.com/w/cpp/language/move_constructor
>Move constructors typically "steal" the resources held by the argument (e.g. pointers to dynamically-allocated objects, file descriptors, TCP sockets, I/O streams, running threads, etc)
Речь идет о членах и родителях объекта, а не самом объекте.
Жопочтец в треде.
А, ну логично. И тогда \n вне линуксов снова будет превращаться в \r или \r\n при закатывании чаров в файл или ещё куда.
не заходить в функции из стандартных библиотек? (step over F10)
Что делать, если я первокур-препод информатики, который задался идеей стать хорошим программистом? По нашей программе полтора года идет С++. Я до него абсолютно нихуя не кодил, проходим просты команды, такие же как в С. Мне стоит продолжать учить кресты?
Университетская программа идет по Шмидту (2010). Тут написано, что он устарел, а наш препод менять ничего не собирается. Плюс я не силен в математике и программировании, а С++ судя по написанному первым языком хуево идет.
Мне продолжать или нет? Может начать другой язык?
Кресты очень коварны и тебе предстоит наступить на множество граблей. Но не думай, что универ тебе как-то поможет. Я учусь на компьютерных науках на 4-м курсе, у нас С++ был два семестра, после которых я как был говнокедером, не понимающий что я делаю, так и остался не говорю, что я стал охуительным спецом сейчас, но оглядываясь могу заявить, что прогресс большой по сравнению с тем, что было.
Будет сложно, но вообще учить самому кресты возможно. Просто надо читать книги, пилить что-то своё и спрашивать совета у знающих людей желательно не здесь. Нужен взгляд старшего, который тебе укажет на ошибки и расскажет о тонкостях, которые упускаются в книгах. По поводу литературы не берусь что-то рассказывать, ибо базовый уровень я получил на курсах у алкаша-инженера, который писал на крестах лет 15. Но знающие люди вот тут что-то говорят: https://toster.ru/q/37321 . Погугли на ресурсах типа тостера или stackoverflow, там обычно адекватные люди отвечают.
Идеально будет, если в твоём городе есть какие-то курсы по С++ при компаниях в моём зажопенске есть такие. Обычно они бесплатны, ведь компании заинтересованы в дешевой и более-менее знающей предмет раб. силе. Но там надо иметь какие-то базовые знания, всех подряд не берут.
Не берусь тебе ответить на этот вопрос, так как я студентота, знающая 2 языка(1+0.5+0.5) + я начал с крестов сам(говнопаскаль на полсеместра не в счет). Все советуют python как первый язык для обучения, мол, он дружелюбен и при этом используется для реальных задач. На Западе в универах вроде так и делают. Погугли на этот счет, чтоб я тебе не спиздел. Я с ним лично не знаком.
У нас полтора года кресты, потом паскаль и питон. Тут вообще ruby+python советуют.
Вообще мне нужны в основном фундаментальные знания, реальные вещи за деньги я нескоро планирую писать, поэтому хочу что-то, что мне зачтется через 3+ года.
Я на ruby писал месяц, так как думал на нём сделать кое-что для университета. Крайне не советую, так как после него перейти на другие языки программирования будет намного сложнее. Он слишком упрощен и даёт плохие знания как первый язык программирования.
Хочешь универсальности и потом в случае чего перейти без относительно серьёзных проблем на любой язык — бери С++. Но будет сложно, повторюсь. Вот сейчас погуглил и нашел очередную туеву кучу вбросов типа "язык Python занимает лидирующие позиции в качестве первого языка программирования во многих американских колледжах." Смотри сам, брат. Советую зайти в Python-тред или просто погуглить стори людей, которые учили Python как первый язык. Потому что мне про него нечего сказать.
TL;DR: выбирай между Python или С++, для это хорошенько погугли и поспрашивай РАЗНЫХ людей(100 мнений одних крестофагов не дадут тебе полной картины).
Алсо бесполезный паскаль, основная цель которого была обучать и давать азы, идущий после крестов — это пушка.
Про это даже в шапке написано, ну.
Возможно, такая логика: дать нормально покодить лаба1 на крестах, с конпелятором освоиться, а потом уже переходить к CS, в которой псевдокод поскакалеобразный.
нужно сообщение коммита написать в стиле: исправили ошибку трушно по энхаэловски - бросок - добиние - гол,
т.е. fixed bug in a true NHL way - shot, tipping in - SCORE!!!
НО, tipping in - это подправление, насколько понял, а нужно именно добивание.
В словарях не могу найти правильный перевод.
!с меня кусок труъшного коммерческого кода!
Но ведь он упрощает разработку в десятки раз. Откуда тогда неосиляторам взяться?
Так можно про любой фреймворк сказать. На деле он просто позволяет воспользоваться существующей кодобазой, вместо пейсания своих лисапедов. Ньюфаги всё равно не осилят всех этих mvc и наследований-хуеследований и асинхронных по умолчанию хуиток.
Ой бляядь. Ну ты сука нарвался. Иди сюда, я тебя выебу.
По кошерности устареть может разве что твоя мамаша.
//мимокутеюзер
Диалект крестов. Просто куча готовых решений, которыми ты можешь воспользоваться, если тебе таковые нужны. Начинать учить с него кресты не оч, но вообще why not.
Но ведь он прав. Всякие смарт поинтеры, хуёинтеры. Qt лучше только окошкоделаньем и всё.
С таким же успехом можно заявить что и буст уже устарел и нахуй не нужен после c++14, потому что в стандартную библиотеку из него добавили async и future.
У Qt внезапно очень обширная область применения, и всякие смартпоинтеры просто сахарок.
Но ведь буст и правда устарел...
Статически
http://stackoverflow.com/questions/441831/calling-delete-on-variable-allocated-on-the-stack
http://stackoverflow.com/questions/4355468/is-it-possible-to-delete-a-non-new-object
Первые комментарии. Прости, но у тебя хуёво написанная методичка.
[code]#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
for (int i = 0; i < 200; i++)
cout << setw(42) << i << endl;
cout << "*";
return 0;
}[/code]
Код абсолютно правильный. Проблема заключается в странном поведении gnome-terminal. Он просто обрывает вывод и при этом пишет, что процесс завершён с кодом 0. Для эксперимента я сделал две конфигурации запуска. В одну прописал «gnome-terminal -e %exe», а во вторую «xterm -hold -e %exe». Если запуск идёт через гном-терминал, то вывод просто обрывается (пик. 1), если через xterm, то вывод происходит до конца (пик. 2). Хотя если запускаю гном-терминал, а уже из него вызываю приложение, то всё нормально. Что за странное поведение? Это баг?
Забыл добавить, что вывод происходит нормально, если убрать setw(42). Каким образом он влияет на gnome-terminal, что он не выводит до конца?
Причём чем больше я ставлю setw, тем меньше цифр выводится. Хотя иногда почему-то всё выводится до конца, но это редко.
У тебя другой код на пике. Раз не показываешь нормальный код, то либо иди нахуй, либо открывай gdb и иди нахуй.
Да мне это неважно, ибо я могу работать и без setw(), но такое странное поведение меня сбило столку. Хочется разобраться.
>>564631
>У тебя другой код на пике.
Абсолютно тот же самый. Просто я cout разбил на три строки, чтобы удобно было комментировать setw(). Ну и скрипт немного неправильно отобразил последний cout. В общем, специально для тебя:
[code]#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
for (int i = 0; i < 200; i++)
cout
<< setw(42)
<< i << endl;
cout << "!!!";
return 0;
}[/code]
Конфигурация запуска:
[code]«gnome-terminal -e %exe»[/code]
Если у тебя стоит kdevelop, попробуй воспроизвести.
Как ты собрался писать консольку если основ условного перехода не знаешь,лол?
Конструкция if else if else
Либо switch-ем
cin >>choice;
switch (choice)
{
case 1:
Всякие операторы;
break;
case 2:
Всякие операторы;
break;
и т.д
Я на самоподдуве этим решил заниматься. За помощь спасибо. А можно, к примеру, в case 1 засунуть ещё один свитч, чтоб после событий в нём предлагался ещё один выбор?
Ну не знаю, возможно, что это одна из граней неосиляторства, но мне QT не понравился совершенно. Какой-то он, эээ, не тяжелый даже - громоздкий. И если еблю с его прикручиванием еще можно простить, то от разницы с крестовой идеологией никуда не деться. Впечатление такое, как будто какой-то ебучий чужой надел на себя крестовый синтаксис, а внутри какие-то совершенно монструозные вещи творятся, избыточные и нихуя не оптимальные.
У меня уже получилось напихать в первый чойс ещё один свитч, но спасибо за инфу, возьму на заметку.
>устарел
Ну вот представь, что ты живешь на одном берегу реки, а твоя тянка на другом. И тебе нужно каждый день перебираться к ней, чтобы няшиться вместе под пледиком.
Через реку есть мост, но он хуевый, некоторые пролеты ненадежны, другие вообще обвалились, и ты в этих местах должен переправляться на веревке. Мост постоянно обещают достроить, и даже понемногу что-то делают, но тебя это нихуя не устраивает, ты хочешь няшиться здесь и сейчас!
Чтобы решить проблему, ты покупаешь лодку и начинаешь плавать к тянке на ней. У лодки есть свои проблемы, но в целом ты решаешь задачу проще, чем используя мост, и доволен.
Тут в городе появляется предприимчивый чувак, который, пораскинув мозгами, объявляет, что навесные мосты не нужны, пригоняет десяток грузовиков с понтонами и строит понтонный мост. По нему перебираться через реку быстрее, чем на лодке, и тем более быстрее, чем по старому мосту. Чувак берет за проезд деньги, все счастливы.
Теперь платиновые вопросы:
1. Всрется ли кому-нибудь платный проезд по понтонам, когда нормальный мост таки героически будет достроен?
2. Что будет, если 50-тонный танк решит заюзать понтонный мост, который рассчитан только на 30 тонн?
3. Что будет, если через реку, перегороженную понтонным мостом, внезапно понадобится пройти кораблю?
Старый мост - стандартные средства крестов, лодки - отдельные либы, не нарущающие крестовую идеологию. Понтонный мост - QT, который может дать преимущества, но чрезмерно отдаляется от концепции обычного моста, и в результате возникают проблемы (допустимый вес, проход кораблей), которые с обычным мостом отсутствуют в принципе. При использовании понтонного моста ты платишь за проезд - накладные расходы на использование QT. По мере допиливания старого моста-стандартной библиотеки, куски QT становятся не нужны (указатели и треды уже, ну ты понел).
Ну так что, удалось кому-нибудь хотя бы повторить этот баг?
Блядь, да напиши уже один, ровно один код на ideone.com , который ты запускаешь и там, и там. И дай сюда ссылку. Только убедись перед этим, что в обоих случаях действительно один и тот же код запускаешь.
#include fstream
...
std::streamsize ss = 7;
fs.write(char_array, ss);
Стоит дополнительно подключить <ios> для std::streamsize или он включён в <fstream>? Не могу нагуглить.
https://ideone.com/IhmbU9
Вот код, но проблема явно не в нём.
Запускаю через KDevelop. Конфигурации запуска:
1. Для гном-терминала:
[code]gnome-terminal -e %exe[/code]
2. Для xterm:
[code]xterm -hold -e %exe[/code]
Gnome-terminal обрывает вывод на 184, но если убрать setw(42), то всё нормально. Если просто запустить терминал, а уже из него вызвать программу, то опять-таки всё нормально выводится. Почему такое странное поведение у гном-терминала? Попробуйте хотя бы повторить такое поведение.
У меня в <fstream> подключаются <istream> и <ostream>, а в каждом из них уже есть #include <ios>. Можешь не подключать.
Это ты еще меня не видел, лол.
Эти два файла как одна прога.
ай шайтан, но я даун, не нашел тхреда по С чистенький, который и написал сюда((( Как-бы его перевести на С
Указатель на указатель. Неправильно задан сам вопрос. Можно передать массив указателей на функции. Массивы ссылок невозможно создать в принципе, потому что ссылка не выделяет ни какой памяти.
по-сути я его обьявляю так
[code]int(mas1[2])(StructName, unsigned) = { fun1,fun2};
\tint(mas2[3])(StructName, unsigned) = {fun3,fun4,fun5};[/code]
Есть другая структура, Tank, описана в Tank.h
В Tank.h так:
#include Unit.h
struct Unit; // error 2
...
struct Tank
{
...
int hp;
...
HpBonus(const Unit &unt)
{
...
hp += unt.hp; // error 1
...
}
}
error 1: invalid use of incomplete type ‘const Unit {aka const struct Unit}’
error 2: forward declaration of ‘const Unit {aka const struct Unit }’
Как нормально подключить свою структуру? (в других местах все нормально подключается по показанному принципу)
Есть другая структура, Tank, описана в Tank.h
В Tank.h так:
#include Unit.h
struct Unit; // error 2
...
struct Tank
{
...
int hp;
...
HpBonus(const Unit &unt)
{
...
hp += unt.hp; // error 1
...
}
}
error 1: invalid use of incomplete type ‘const Unit {aka const struct Unit}’
error 2: forward declaration of ‘const Unit {aka const struct Unit }’
Как нормально подключить свою структуру? (в других местах все нормально подключается по показанному принципу)
Вот так. Сделай typedef своего прототипа и передавай как обычную переменную.
>Не выделяет никакой памяти
void foo() {
char * ptr = "cool story, bro!"
}
Напомни мне, когда это стек перестал быть памятью?
Stoya.
Знаешь, как ленивые хуи в СССР сдавали методы погромирования про численное решение диффуров? Решали диффур руками, а потом выводили ответ println.
writeln)))
Я бы мог пошевелить мозгой, если бы я знал вообще в какой области шевелить.
В области своего ануса.
Посоны, а писать на ++ под среду, которая на C, и ее C API - не зашквар? Примеры: Nginx, MySQL, PostgreSQL, да и вообще ВСЁ. Просто на ++ объективно проще пишется, ОО-декомпозиция и все такое. Написал интерпретатор для Nginx на плюсах, теперь все время думаю, может на С перевести?
У нас с тобой очень разные возможности в плюсах. Я начал учить их только.
Вручную я его изи решу, но мне нужно написать цикл для его решения(да-да-да, это именно лабораторная)
Ну дык иди книги читай. Такие примеры в первых главах рассматривают, неуч )
Бамп!
#include <math.h>
double InFunction(double x) //Подынтегральная функция
{
return sin(x); //Например, sin(x)
}
double CalcIntegral(double a, double b, int n)
{
int i;
double result, h;
result = 0;
h = (b - a) / n; //Шаг сетки
for(i = 0; i < n; i++)
{
result += InFunction(a + h (i + 0.5)); //Вычисляем в средней точке и добавляем в сумму
}
result = h;
return result;
}
int main(void)
{
double integral;
integral = CalcIntegral(0, 2, 500);
printf("The value of the integral is: %lf \n", integral);
return 0;
}
Ну вот, допустим, код на си с вики. Нихуя не могу понять как это все написано, ибо задание своих функций у меня еще в вузе не проходили, значит есть способ легче.
#include <math.h>
double InFunction(double x) //Подынтегральная функция
{
return sin(x); //Например, sin(x)
}
double CalcIntegral(double a, double b, int n)
{
int i;
double result, h;
result = 0;
h = (b - a) / n; //Шаг сетки
for(i = 0; i < n; i++)
{
result += InFunction(a + h (i + 0.5)); //Вычисляем в средней точке и добавляем в сумму
}
result = h;
return result;
}
int main(void)
{
double integral;
integral = CalcIntegral(0, 2, 500);
printf("The value of the integral is: %lf \n", integral);
return 0;
}
Ну вот, допустим, код на си с вики. Нихуя не могу понять как это все написано, ибо задание своих функций у меня еще в вузе не проходили, значит есть способ легче.
Хм, ладно, сейчас попробую
http://ideone.com/tkZ4B3
Ну йобана!
В одном файле - видит. В нескольких файлах без include и extern - не видит. С ними - оба же работают. В чем разница?
а, так, глобальную можно в другом файле через external, а static - нет ибо фиг ли... static - он всегда расценивается как класс хранения, а не как область видимости? Запутался
причем так как include *.cpp нельзя, static переменный я не могу юзать вне? А если это переменная в .h файле вроде currentID в прототипе класса, то могу юзать во всех файлах, где делается include этого заголовочного файла? Так?
А, еще про начальные значения. auto переменные не получают начальных значений, их надо инициализировать явно. Но переменные в Global scope получают нулевые значения. Они не auto считаются или исключение такое?
Ананас, почему исключения в io сделаны через жопу я тебя спрашивать не буду.
Спрошу только, как заставить std::copy человечней работать со стрим-итератором, чтобы оно не кидало исключений?
код: https://gist.github.com/x4t3a/350c42677e98684e12b2
Нужно, чтобы оно кидало исключение, если файл не возможно открыть, но оно его кидает из std::copy (сука1)
и что-то нетак.
>>565313
сделал как советовал этот господин и получилось что если cout-у передать имя строки,то он показывает пустоту. А если передать конкретно какой-то порядочный номер символа в строке то он показывает его...
типа символ конца строки ставит в первый элемент массива. Я это и проще мог сделать...
тут если поиграться с индексом можно понять. http://ideone.com/SEAMMi
Ну загляни в реализацию метода clear. Скорее всего, в целях оптимизации, никакого free и memset(0) там не делается. Я не понимаю, в чем у тебя проблема.
Посоны, ну помогите, а.
Почему при подключении хедера с описанием структуры я не могу пользоваться данными из нее?
Попробуй shrink_to_fit() вызывать после clear() но там нихуя не гарантируется (зависит от реализации).
Для резюме?
Смотрите, сложность добавления и сложность обращения к элементам - O(1). Как у обычного массива. И кажется, что юзать его так-же эффективно, как и массив. Но он умеет динамически удлинняться.
Насколько я знаю, в тот момент, когда ты добавляешь элемент, а выделенной памяти не хватает - выделяется память в два раза больеш, чем была. А что становится с элементами?
Они копируются в новое место? Или это только новая память выделяется в новом месте?
Если первое, то значит сложность этой хуйни иногда O(n) получается. И не понятно, как её вообще считать в случае рассчета сложности какого-то алгоритма.
А если второе, то почему тогда обычные массивы вообще кто-то юзает?
В винде - хз, а в линухе меняются ссылки в таблицах файловой системы, так что все норм, не ссы.
Вот есть допустим алгоритм. У него сложность оценивается из двух одинаковых слагаемых n. Коэффициент убирается.
Остается O(n) вместо O(2n). Нахуя опускать коэффициент, если разница по времени будет В ПОЛОВИНУ. Пиздос просто.
Если растет линейно - похуй же, понимаешь? Даже у степеней опускают коэффициенты. Лишь бы не экспоненциально.
Ну, я про то и говорю. Всё это кукаретические штуки и совершенно не оценивают время.
А потом ещё спрашивают, зачем программисту математика. Вот смотри, есть у тебя алгоритм, который для 1 000 элементов массива отрабатывает за 1 миллисекунду. Тебе (пока ты не начал упираться в бутылочное горлышко) на самом деле всё равно, отрабатывает он за 1 или за 2 миллисекунды.
А теперь ставится вопрос, за сколько он отработает для 100 000 элементов. Если сложность линейная, то соответственно за 100 или 200 миллисекунд (забьём на маленькие оверхэды). А если сложность экспоненциальная, в самом простом случае удвоенная, то за 2^(100 000 / 1 000) * 1 мс == 1 267 650 600 228 229 401 496 703 205 376 мс, т.е. примерно за 10^30 с, что многократно превышает время жизни вселенной.
Так что в экспоненте этот коэффициент играет роль. Если ты собьёшь его с 2 до 1,2, например, можешь можешь сам увидеть, что это будет примерно за 10^8 с, т.е. 3 года. 3 года или практически в бесконечно большее число раз, чем существует вселенная? Ты вообще понимаешь логарифмический масштаб?
Коэффициентом перед линейным алгоритмом пускай Александреску занимается для конкретных алгоритмов. Но гораздо важнее понизить сложность того или иного алгоритма: а вот этим уже занимаются математики. И имеет значение коэффициент только в экспоненте, а в полиномах (линейное, квадратное и прочее) имеет значение лишь степень полинома, потому что гораздо быстрее ты упрёшься во время жизни вселенной, чем какой-то коэффициентик (пускай даже равный 100) заставит тебя лишнюю кружку кофе выпить.
если ты обьявил сруктуру в хэдере, зачем ты ее обьявляешь и в файле подключения
Добавление в вектор имеет амортизированную сложность О(1).
Если надо увеличить память, то сначала может быть выполнен realloc, а в случае неудачи calloc с копированием элементов. Такая операция амортизирована, памяти увеличивается в ~2.5 раза (коэффициент зависит от реализации).
К тому же, есть reserve(), который позволяет запросить некоторый размер заранее.
Удобство работы с вектором и амортизация работы с памятью намного лучше ручной работы с C-array.
>Я знаю как это работает, не нужно мне объяснять.
Ну а какого чёрта тогда спрашиваешь про коэффициент? Ты издеваешься или что?
Например ты парсишь поток ввода. Тебе нужно выбрать из потока какой-то терм и отдать его дальше. В зависимости от грамматики, термы могут не разделяться пробельными символами которые можно выбрасывать. Тоесть ты читаешь посимвольно из потока в буфер, тащишь новый символ - смотришь что он уже от другого терма и возвращаешь этот символ назад в поток, чтобы начать дальнейший разбор с него. Отправляешь то что в буфере куда нужно, и начинаешь читать с потока новый терм и все заебись. Можно обойтись без возвращения символов - или читать символ не вытаскивая его, а потом вытаскивать если нужно - но так больше действий, или сохранять вытащеный символ в отдельной переменной и разбор нового терма начинать с этой переменной - но так сложнее код.
Читаешь Страуструпа для ньюфагов? Тогда сам чуть позже поймёшь. Если не его, то, например, ты решил считать некую последовательность символов, которая обязательно начинается с определённого символа. Считываешь первый, он неверный, тогда кладёшь его на место и кидаешь исключение, причём получается, что ты как бы и не начинал считывать последовательность символов, т.е. её можно с нуля считать для обработки ошибки, например.
Бамп ебанутому вопросу. Может быть, у кого-нибудь всё-таки получится воспроизвести такое поведение.
https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx
Пусть ставит две ссылки.
гугли imap йопта
Насчет чистых крестов не знаю, но в Qt это относительно просто делается. Там куча стандартных классов для работы с JSON и http-запросами. Сам брал письма при помощи Gmail API.
Делитель тут не при чем вообще. У тебя сумма от 1 до N. Что там внутри ничего не значит.
Каким образом вы вообще читаете материал/книгу, в котором(-ой) предусматриваются задания или упражнения. Я в принципе не отрицаю их пользы, но вот чего заметил, что они пиздецки тормозят скорость получения новой информации.
Сам я читаю сейчас Страуструпа для ньюфагов. Гуглил я ещё какую-то книжку на 1к страниц, не важно какую и пришел к выводу, что вся эта тягомотина растянется до НГ(т.е. упорный дроч заданий всех и теории).
Особенно когда в задании просят пойти в другой раздел, найти ф-цию, которую разбирали и прикрутить к ней то, что ты прочел минут 10 назад.
В итоге короче, что я думаю: читаешь задание -> минуту-две прокручиваешь в голове как её решаешь и приступаешь к новому. Если что-то становится непонятно - пишешь код.
В плане того, что там все разжевано как для дибилов?
Может быть, но я уже на половине, поэтому дропать и брать новую книгу не вариант.
С чем не прав, поехавший? Прочитай для начала определение О-нотации.
http://aliev.me/runestone/AlgorithmAnalysis/BigONotation.html
Задания нужны для того, чтобы закрепить в памяти тобою прочитанное. Толку от того, что будешь читать как художку - на след. главе забудешь, что было в предыдущей.
Да нет, обычно как раз сетуют на то, что оче сложно, сухо и вообще тяжело читается. Например, https://toster.ru/q/110909
>читаешь задание -> минуту-две прокручиваешь в голове как её решаешь и приступаешь к новому. Если что-то становится непонятно - пишешь код
Сомневаюсь, что для новичка это будет хороший вариант. Иногда подводные камни всплывают только во время написания кода (особенно по началу, ибо опыта нет), но это касается в основном уже более-менее выходящих за рамки хеловорлда программ. Мне кажется, гораздо лучше прокрутить эти задания в голове и написать небольшую программу, которая бы использовала все новые возможности.
Или ты хочешь оценить сумму ряда сверху? Бесконечность - ряд расходящийся, но вряд ли ты пришел спрашивать задачу по матану в зк, так что иди нахуй, говно блять собачье.
Это невозможно. Когда тебе теорию преподносят вместе с постепенной модификацией кода, то она у тебя в голове просто впечатывается. Если ты, конечно, жопой текст не читаешь.
>>565907
Все задания вместе реализовывать == прорешать от первого до последнего. Разве что по приоритетам их разбрасывать, хотя заведомо нельзя понять, где ты можешь обосраться, а где без ошибок написать. Не знаю в общем, не думаю, что Страуструп пихает в каждое упражнение какой-нибудь подводный камень. В принципе, это можно из контекста понять, когда: "вот там мы делали так, а сейчас ты сделай так и посмотри что будет".
Ты необучаемый, пиздец. Это и есть сумма КОНСТАНТ
1/log(1) + 1.4/log(1,4) + ...
Сумма зависить только от N и ни от чего больше.
Можешь привести пример, в котором с суммой получалась бы не линейная сложность?
Сумма от суммы, например.
Пик - пример. Если m=n, то сложность квадратичная. Ну и так далее.
Можно вообще полином замутить, если взять произведение сумм.
А если вместо n будет i?
То-есть, первая сумма: 1 <= i <= N
Вторая сумма: 1 <= j <= sqrt(i)/log(sqrt(i))
Просто добавится коэффициент 1/2?
Сложность не изменится от того, что переменную я назвал n или i.
Коэффициент не нужен, выше уже объясняли, почему.
log(sqrt(i)) = 1/2*log(i), это вроде из 5 класса.
А ведь таких пол /pr/
Причем тут файловая система? Немного не понял.
Это копия, сохраненная 19 ноября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.