Это копия, сохраненная 30 октября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
И молвить трудно. Ты на костыле
Вновь самокат приладил, нечестивый!"
Мы оказались в метафункций мгле.
Стонало эхо крестоблядков голосами,
Увязших в коде, как комар в смоле.
Взглянув окрест, я вмиг поник глазами:
Шаблоны, источая тяжкий смрад,
Лежали над несчастными пластами.
Внизу ж, суливших, что определят
В compile-time размер факториала,
Толпа, снося ошибок жутких град,
Сквозь стон Александреску проклинала.
Литература:
Для нюфань:
Учебники для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Стэнли Липпман, Жози Лажойе и Барбара Му - Язык программирования C++ (2014) - https://goo.gl/kVaela
Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u
Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2011) - https://goo.gl/nAFUXa
<устарело> Герберт Шилдт - C++. Базовый курс (2010) - https://goo.gl/qMLAFl
<устарело> Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - https://goo.gl/QvjR6x
Учимся не писать говнокод:
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все.
Скотт Мейерс - Эффективное использование C++ (2005) - https://goo.gl/wsDXGz
Скотт Мейерс - Наиболее эффективное использование C++ (1996) - https://goo.gl/tHa0tO
Скотт Мейерс - Effective Modern C++ (на ангельском) (2015) - https://goo.gl/uImH0J
Скотт Мейерс - Эффективное использование STL (2002) - https://goo.gl/QtS8Dc
Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ (2005) - https://goo.gl/Cpk4YR
Наиболее детальные описания языка:
Бьерн Страуструп - Язык программирования C++ (на ангельском) (2013) - https://goo.gl/XkAiOX
<устарело> Бьерн Страуструп - Язык программирования C++ (2010) - https://goo.gl/iZBDiV
Стандарт C++14 (на ангельском) - https://github.com/cplusplus/draft/raw/master/papers/n4140.pdf
Последняя на данный момент версия черновика стандарта C++17 (на ангельском) - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4527.pdf
Тонкости языка (для гурманов):
Андрей Александреску - Современное проектирование на C++ (2002) - https://goo.gl/e1V5BC
Герб Саттер - Решение сложных задач на C++ (2002) - https://goo.gl/iWaa6S
Герб Саттер - Новые сложные задачи на C++ (2004) - https://goo.gl/4nn512
Также для легкого чтения подойдет книжка c историей создания C++:
Бьерн Страуструп - Дизайн и эволюция C++ (1994) - https://goo.gl/FqbPwo
Отдельные аспекты:
Читать по необходимости.
Энтони Уильямс - Параллельное программирование на C++ в действии (2012) - https://goo.gl/qJfBkD
Николаи Джоссатис - C++. Стандартная библиотека (2012) - https://goo.gl/PEyiMH
Дэвид Вандевурд, Николаи Джоссатис - Шаблоны C++. Справочник разработчика (2003) - https://goo.gl/0M4NpG
Роберт Седжвик - Фундаментальные алгоритмы на C++ (2001) - https://goo.gl/4jwxSl (части 1-4), https://goo.gl/yDuQgG (часть 5)
Ариндам Мукерджи - Learning Boost C++ Libraries (на ангельском) (2015) - https://goo.gl/b0gPN1
Блоги:
Годный блог, в котором все просто и понятно тян не нужны кококок борщ - http://alenacpp.blogspot.ru/
Краткие описания библиотечных функций и контейнеров - http://ru.cppreference.com/w/
Блог Герба Саттера (на ангельском) - http://herbsutter.com/
Блог Скотта Мейерса (на ангельском) - http://scottmeyers.blogspot.ru/
Куда писать код:
Под шиндошс удобно использовать IDE Microsoft™ Visual Studio®. Базовую версию (2015 Community) можно бесплатно скачать, следуя инструкциям с этой страницы: https://www.visualstudio.com/ru-ru/products/free-developer-offers-vs.aspx. Чтобы начать писать код, нужно запустить Visual Studio, кликнуть "Файл - Создать - Проект - Пустой проект", после создания кликнуть слева правой кнопкой мыши по пункту "Файлы исходного кода", выбрать "Добавить - Создать элемент - Файл C++". Свои хэллоуворлды писать в этот файл, в дальнейшем можно добавить другие файлы и хедеры. Чтобы скомпилировать и запустить проект, нужно нажать "Сборка - Собрать решение", а затем "Отладка - Запуск без отладки".
Под *nix, как правило, уже предустановлен компилятор gcc (если нет, используй sudo aptitude install gcc), так что достаточно сохранить хэллоуворлд, набранный в текстовом редакторе, и выполнить g++ helloworld.cpp и ./a.out. Но удобнее установить какую-нибудь IDE, например, Code::Blocks (sudo aptitude install codeblocks) и работать в ней.
Можно также не устанавливать ничего, а запускать свои хэллоуворлды на http://ideone.com, выбрав в левом нижнем углу язык C++14.
Софт и библиотеки:
IDE, призванная похоронить Visual Studio пока не особо получается. Удобные свистелки и перделки присутствуют. Тормоза и баги пристуствуют. Кросплатформенность присутствует - https://www.jetbrains.com/clion/
Статический анализатор, который умеет находить в коде ошибки и неоптимальные места. Швабодный. Есть плагин для Visual Studio - http://cppcheck.sourceforge.net/
Детектор утечек для Visual Studio. Предельно прост в прикручивании - https://vld.codeplex.com/
Гугловские утилиты для контроля корректности кода - https://github.com/google/sanitizers
Гугловский фреймворк для автоматизации тестирования - https://code.google.com/p/googlemock/
Йоба-набор библиотек, способный удовлетворить даже самые скотские фантазии - http://www.boost.org
Библиотека для удобной высокоуровневой работы с сетью - https://casablanca.codeplex.com
Простая в обращении библиотека для работы с графикой и аудио - http://www.sfml-dev.org
И многое другое - http://en.cppreference.com/w/cpp/links/libs
Памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Старший брат: >>518562 (OP)
Предыдущий: >>537129 (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/
Страуструп для ньюфагов заменен на djvu с навигацией.
Добавлено последнее издание хардкорного Страуструпа на ангельском, Липпман для ньюфагов, книга про boost.
Структура шапки переработана.
Добавлен раздел про софт и библиотеки.
В их g или b? Спрашивал подобное послали на стэковерлоу.
Скачал эту книгу в открытом доступе, правда, не помню откуда
Но весит она 52 МБ против трёх по ссылке анона.
http://gen.lib.rus.ec/search.php?mode=last
Про генлибрусек еще не забывай, один из моих любимейших ресурсов.
Ну я не говорил, что конкретно эта там есть, но я там находил достаточно много вещей, которые сложно или невозможно было достать в других местах. Извиняюсь, если зря в разговор влез.
Да нет, что ты, речь как раз шла не про эту книжку, а про МОАР. Вообще, чем больше анон запилит ссылок на книги, тем лучше, потому что я пролистываю каждую новую встреченную библиотеку в поисках книг, которые могли бы хорошо для шапки подойти, и вообще.
С точки зрения стандарта, это UB, и ничего определенного утверждать нельзя. По стандарту компилятор вообще может не использовать стек, например ну вдруг какой-то извращенец напишет что-то подобное только чтобы поднасрать тем, кто не читает стандарт. На практике переменные кладутся в стек в порядке определения, так что если у тебя твой массив определен самым первым в функции, то сразу за ним будет адрес возврата, плюс-минус выравнивание. Но опять же, надо учитывать, что функция может инлайниться, что используемое соглашение о вызовах может предполагать передачу адреса возврата через регистры, ну ты понел. Так что нужно смотреть конкретную платформу, компилятор и его параметры, чтобы сказать абсолютно точно.
Это же всё делается на этапе компиляции. Может есть программки которые показывают как выглядит память?
Это сильно зависит от того, какой отладчик. Например, в gdb я до сих пор не могу и буду рад, если анон распишет за него или даст рилейтед ссылок. В Visual Studio просто включаешь режим отладки, и тебе показывается графически вся память ячейками, например.
>gdb
У меня линукс, gcc, кодблокс и консоль на эту команду отзывается. Скорее всего он у меня и стоит. Что же тогда делать?
man gdb, как вариант ну а хуле делать, раз такая безысходность? Еще вот такое есть, но я ниасилил: http://rus-linux.net/nlib.php?name=/MyLDP/algol/gdb/otladka-s-gdb.html
Никто, очевидно же!
Бля. Язык учить проще чем этот отладчик. Там же не набор статей, а целая книга.
http://stackoverflow.com/q/2770889
Обрати внимание не только на подтверждённый ответ, но и на следующий.
Отлично спасибо. Теперь бы ещё короткий гайд где написано куда эти команды писать.
сюда https://www.coursera.org/course/softwaresec подпишись, там первый проект — лаба по атакам на переполнение буфера: нужно правильно испортить стек, чтобы "взломать" программу.
В лабе использование gdb по шагам описывается.
WHOAMI
1-
Я не могу читать книги по 500 странпиц. Я "тур по с++" в 190 страниц 2 месяца читал. Как с этим бороться?
2-
В какую интересную сферу я могу вкатиться зная с++ ?
>500
Где ты такие короткие книги видел-то? Во всех нормальных от тысячи страниц, и это еще либо не все аспекты языка, либо сжато.
Представь, что Гарри Поттера читаешь.
Быстро читаешь - формируешь в голове карту знаний с белыми пятнами, которые потом заполняешь. Причем, в разных книжках одни и те же факты (самые важные и распространенные) повторяются. Читая одну книгу медленно, у тебя нет карты, поэтому мозгу тяжело строить ассоциации, ты не можешь отличить важные факты от второстепенных, и в итоге имеешь проблемы.
Чтение - это процесс загрузки данных в мозг, который потом эти данные переваривает, обычно нужно поспать, а ты ждешь мгновенного ПОНИМАНИЯ здесь и сейчас.
>Я "тур по с++" в 190 страниц 2 месяца читал.
Ну и ладно. Теперь можно взять Мейерса, например Defective modern C++.
А эти книги по 1000 страниц они же для вообще дебильчиков, которым объясняют, зачем циклы нужны и прочее такое.
Там больше тысячи страниц, но это не очередной обзор языка для чайников. STL глубоко весьма расписывается, и аналогов у книжки вообще нет.
Я уже спрашивал тут, но спрошу снова. Через пол года олимпиада и нужно задротить алгоритмы. Прочитал хуй знает зачем. ни с кем не советовался две книги страуструпа почти нихуя не понял но это отдельная тема там ещё задания ебанутые и заканчиваю лафоре. Нужно хорошо знать STL и алгоритмы. Теперь даже сортировку с помощью функции из стандартной библиотеки сделать не могу не залезая в гугл. И алгоритмы плохо знаю. Для STL и заодно 11ого стандарта советовали Джоссатиса второе издание. А алгоритмы Седжвик. Не могу решить с чего начать когда закончу лафоре.
О, анон, я тоже планирую учавствовать в олимпиадах. Кинь фейкомыльце, может чем поможем друг-другу. Алсо как на счет заданий прошлых лет?
Язык и алгоритмы ещё не знаю поэтому вряд ли помогу и почта это неудобно. Но если хочешь лови. alkkoloto(собака)yandex.ru
Согласен, не люблю очевидные вещи по несколько раз читать.
подскажите как реализовать на С++ класс "Множество размерности n" с разными функциями, присущими множествам(пересечение, умножение, проверка, входит ли элемент в множество)?
Для малых n - на отсортированном vector, для больших - на хэше (в стандартной библиотеке set::unordered_set) или красно-черном дереве (std::set). Правда, подозреваю, что ты хочешь, чтобы мы за тебя лабу сделали.
ЧТОБЫ ОЖИВИТЬ ТРЕД!
Я бы предпочёл борду в виде графа постов. Чтобы можно было отметить интересные ветки обсуждения и непринуждённо форкать треды, дабы не читать школовопросы и обкидывания говнами.
Блять.
Это же
ГЕНИАЛЬНО
Я бы этим занялся, но в конечном итоге будет интересно лишь нам с тобой. Без веб интерфейса же, а сейчас все в себе, все в вебе...
И по какой размерности тогда его сортировать/хэшировать? Не, тут надо как-то хитрее придумать разумеется, если множества маленькие, то похуй вообще.
Где можно скооперироваться, набросать диздок/видение цели/тз?
https://2ch.hk/pr/res/538172.html Они разогреваются пока что, а потом, наверное, будет конфа или что-то вроде того.
Я только оттуда, больше не вернусь, обычный скайп без конструктивизма.
Моё мнение - асинхронность и P2P - от лукавого, графы и система отбора -то, во что нужно бить.
И вообще, это должно быть /pr/ ориентированным.
Срач*
План действий такой:
1. Техлиды с сеньорами расписывают гуглодок с техзаданием. МАКСИМУМ разделяем всю работу на компоненты, выясняем способы взаимодействия этих компонент (CFFI, pipes, middleware, etc).
2. Каждому вручаем по компоненту с ясно озвученными минимальными требованиями, лишь бы хоть как-нибудь работало. Он выполняет этот компонент на своём любимом ЯП (желательно конечно ограничиться 2-3 на весь проект).
3. Организуем автоматическую сборку проекта. В итоге получаем суперсырой первый билд.
4. Заводим багтрекер и расписываем путь развития проекта. Каждый берёт себе какие хочет задачки и делает.
5. Каждый месяц релизим очередную версию.
Очень желательно запилить всё в переиспользуемой манере, так как срач p2p vs server неминуем.
Бабки на хостинг будем собирать когда запилится самая первая версия.
Все ссылки пока что в соседнем листе с результатами переписи, пописать в гуглодок можно уже сейчас. Туда же попадут гитхабы-битбакеты и прочие данные. Если наберётся достаточно народа, или у меня лично будет дохуя терпения, запилим отдельный координационно-агитирующий тред.
>ссылки в соседнем листе с результатами переписи, пописать в гуглодок можно уже сейчас
>>547184
Закатывайся, будем пилить универсальный код и отделять компоненты. Там процентов 70 будет одинаковое.
>>547169
>Без веб интерфейса
Можно без, а можно и с. Как вариант запускать локальный сервер и открывать браузером. Ну и декстопы-мобилки в опроснике стоят отдельно, опять же, интерфейс можно запилить один раз, а потом подключить его к п2п модулю или апи сервера.
Срач уже здесь. Ты ведь не будешь спорить, что для взлета у борды должна быть киллер-фича? Так вот, способ представления в виде графов и форканье на таковую явно не тянут, это как если бы ресторан позиционировал себя не имеющим аналогов потому что у них у ложек ручки длиннее. Надо, чтобы от сотен остальных борд отличалось резко, смекаешь? К тому же, есть дохуя анонов, которые хотят постить цп и всякие непотребства и вынуждены жрать говно на медленном хидденчане. С этих джвух позиций выбор p2p очевиден, оно станет той самой недостающей изюминкой. А графы будут приятным бонусом.
Ну а я и не против этого срача. Только я предлагаю уже начать напиливать хотя бы общее. Договориться с компонентами и апи. А потом как из конструктора каждый сам себе соберёт.
Возможность лучше отсутствия возможности. Аудиторию это привлечет, а законопослушные аноны всегда могут скрыть неугодный контент. Можно алсо сделать теги специально для этого, или типа того.
Есть. Форму заполняешь, выдаёт ссылку со списком гуглодоков. Только что настроил.
std::string line;
std::getline(is, line);
if (is.eof() && !is.fail())
{
is.clear();
line += '\n';
//here I want put line back in istream -- may be using a buffer
std::getline(is, line);
}
Объясняю, почему нельзя просто просто в обратном порядке побросать все символы строки, начиная с '\n' и заканчивая line[0]: потому что is передаётся в функцию по ссылке и открыт только на чтение (чтобы если это файл, то не менять его, иначе в конец файла '\n' добавится, а файл нужно не менять). Просто сдвинуть seekg() на line.size() назад тоже не вариант, т.к. нужно прочесть line += '\n'.
Зачем это нужно? Объяснять очень долго, MAGIC
Ну хорошо, давайте вместе попробуем разобраться. Здесь http://www.cplusplus.com/reference/streambuf/streambuf/streambuf/ вообще примера нет. Вот нашёл http://www.cplusplus.com/reference/ios/ios/rdbuf/
И там какого-то чёрта происходит следующее:
1) делается backup буфера std::cout;
2) затем в std::cout подменяется буфер с его на буфер файла psbuf;
3) в std::cout что-то пишется, и, видимо, это следует в файл;
4) в std::cout возвращается его прежний буфер.
Попробовал скомпилировать эту херню. std::cout ничего не выводит, а файл test.txt полностью переписывается на This is written to the file
То есть SFINAE - это анальные трюки на шаблонах, чтобы получить типа hasattrib в бидоне?
Действительно пиздец! Нет чтобы завести нормальную рефлексию.
Я тут подумал. При этом cout может иметь размера буфера меньший, чем line.size() + 1. Тогда лучше просто новый отдельный буфер запилить и всё.
Он должен быть null-terminated?
Они замечательные, это же прям магия. Тот, кто понимает
[code lang="cpp"]
static void test ();
template <typename T>
static decltype (declval <T> ().tvoyaMamka (1488)) test ();
[/code]
, тот будет гуру, и все девки будут давать. А в пистон и дурак сможет.
#include <iostream>
int main()
{
int a = 0;
int b = 10;
while (a == b)
{
std::cout << a;
a++;
}
}
Почему противоречие?
Смотри, пишу while (true) {}
a == b, не выводит ничего
a <= b (или a < b) выводит
Почему?
Ведь по логике и a == b должно делать вывод пока а не станет равно б? Или я что-то не до понял?
Если ты тролль - съеби. Если ты реально не понимаешь, - тоже съеби, ибо такой зашкварный мозг иметь для программирования нельзя, тебе нужен новый.
%%while(a==b) выполняется, пока переменная a равна переменной b. Поскольку ноль не равен десяти, цикл не выполняется не разу.
>while(a==b) выполняется, пока переменная a равна переменной b. Поскольку ноль не равен десяти, цикл не выполняется не разу.
Я думал не так, но спасибо за разъяснения.
> завести нормальную рефлексию
с++ вообще то в машкод компилится, рефлексии в таком языке не сделать ни как
Про полноту по тьюрингу слышал что-то?
Команда break выполняет мгновенный выход из текущего цикла. Программа продолжает своё выполнение с команд находящихся сразу за циклом, из которого ты вышел с помощью break.
Да, всё верно. И именно поэтому её возможно завезут в C++17.
Смотрите, посоны, что нам Бьерн покушать принес.
А, всё решил, я понял ошибку - там где был брейк, если на 2 сразу не делилось, то пропускало любые числа.
Вот верное решение - заместо брейка сделал чек и вынес добавление за цикл.
>a == b
значение false. цикл не выполняется.
>a <= b
Значение true. цикл выполняется пока а не станет больше бэ.
Если уж так, то выучи для чего в языке есть continue и break. А ещё тебе numbers не нужен, а если и будет нужен, то ты любой элемент и так за константное время можешь вычислить.
двач, помоги пожалуйста
почему-то код при освобождении памяти выдаёт ошибку, не могу понять в чём дело, начинает не работать с 61 строки
http://pastebin.com/eZkYLEZe
>strcpy_s
говно для педиков. Используй strcpy();
p.s нахуя ты пишешь глупые комментарии?
>delete[] str4;//освободим память
блядь, и так ясно что delete освобождает память
>StringsWork story;//создаем объект
same shit
Другими словами:
Class man; //Объявили класс
string name;
string lastname;
...
string peremennaya;
cin >> peremennaya;
man peremennaya; // тут должно быть значение, записанное в переменной peremennaya. Я пробовал всякие кавычки-скобки - компилятор ругается. А если написать без всего - то созщадлется объект peremennaya.Ваш КЭП.
Чо делать то?
Всё что после многоточия - очевидно, что входит в main () {
>Class man; //Объявили класс
>string name;
>string lastname;
class man { //Объявили класс
string name;
string lastname;};
Class man; не скомпилируется, class man; - тоже не о том, это обещание, что класс ты определишь когда-нибудь позже.
Хорошо. Я понял.
Класс - это как средство нового типа данных + функции. Так?
Тогда как мне реализовать создание "чего либо" с типом "моего класса"?
Вопрос исчерпан, я это и так знаю, хуйню спорол.
Хорошо, а как тогда мне хранить некие данные? В переменных моего "нового типа". Но тогда классы != переменные. Хранить данные в них не получится. Я прав?
И как мне выкручиваться? Где хранить мои "смешанные" (int + string) типы данных"? В массивах? В отдельном файле?
С типом ты в С++ ничего не можешь сделать, можешь создать экземпляр (instance) своего типа и там уже хранить что тебе нужно. Ты уже это делал в "man peremennaya;", просто оно у тебя не компилировалось, потому что вместо class имя{поле1;поле2;}; ты сделал class имя;поле1;поле2;
Class yoba
{
public
string text;
int number;
};
Есть объект этого класса kolobok:
yoba kolobok;
Хочу записать в мой тип данных набор с клавиатуры:
cin >> text;
cin >> number;
Данные собраны (то есть это дело не одноразовое, можно пустиьт по циклу и собирать еще). Желаю хранить это дело в массиве (или векторе).
Создаю массив array с созданным мною типом данных "yoba" в количестве 10 элементов:
yoba array[10];
Допустим, что класс я инициализировал и хочу записать собранные данные моего типа yoba в первую(нулевую) ячейку массива:
array[0]=... Что? Чему равняется?
Я кажется начинаю туго понимать про классы. Моё мышление о классах как о неком выделенном "местечке" для хранения информации было ошибочным. Сейчас то я в том направлении? Не кидайтесь говном, пожалуйста, подскажите, как записать в нулевой элемент массива array данные типа yoba с уже некоторыми набранными величинами переменных text и number.
Или тупо: как сохранить в массив мой тип говна.
Но мой препод сказал мне реализовать мою задачу при помощи классов. Зачем мне тогда классы, если я могу напрямую всё записать в массив?
Поясни, пожалуйста:
array[0].text = text; //Что означает эта запись? Каждая "ячейка" массива имеет свои поля (которые я указал в классе yoba?), потому что я создал массив с таким типом?
Алсо, я дурак и забыл вписать public для name-а
А как вывыести обратно на дисплей?
array[0].name=name; //Запись в массив
cout << array[0].name; //Вывод на экран
Чому не пашет? Нужно "вывод" писать в методах класса?
array вместо super
Где все тыжпрограммисты?
А в джаббере сложно что ли?
@
ПИВО ПЬЮ
@
МЯСОМ ЗАЕДАЮТ
Няша, ты пишешь полную неведомую хуйню.
Объясняю как надо:
Добавляешь к своему коду комменты с ошибками компилятора у соответствующих строк. Заливаешь на пастбин или аналогичные сервисы. В посте лепишь ссылку на это дело и описываешь чего пытаешься добиться и что вместо этого получается.
На вопросы вида "вот строчка кода, почему не фурычит" ответ один - хуй его знает.
>Part I: The Basics 41-342
>Part II: Input and Output 343-580
>Part III: Data and Algorithms 581-802
>Part IV: Broadening the View 803-1070
Прошёл (i.e. сделал все упражнения) введение, Part I и первые 2 параграфа (10, 11 -- iostreams) Part II. После этого последующие 5 параграфов (12-16) второй главы посвящены графике, и текста там просто дочерта, 170 страниц и куча задач. Оно вообще нужно? Part III мне вообще кажется куда полезной, или книга построена так, что без второй главы третью не поймёшь?
Что делать?
1) прочесть графику и сделать упражнения;
2) прочесть графику;
3) сразу приступать к Part III.
Я до сих пор не прочел IO, например за дохуя лет. Там вроде даже в начале написано, чтобы читали первую часть и дальше выборочно, что интересно и соответствует задачам. Так что пролистай ее быстренько и лезь в третью.
посоветуйте что-нибудь, плз.
Читаю Липпмана - было норм, пока не пришли к классам и к вводу выводу. Не знаю, может быть рассчитано на тех., кто уже в теме, но мне сложно идёт. в других книгах для ньюфагов тема разбита на разные части и туда-сюда мотаться сложно.
особенно учитывая, что в каких то книгах ++11, а в каких то нет. т.е на что смотреть
и в догонку.
Как организовываете новый материал вокруг себя.
например не статья, а фрагмент книги пдф дежавю.
Ну вот я >>548249 прочёл первые 2 параграфа (10, 11 -- iostreams) Part II Страуструпа для ньюфагов. Но без
http://en.cppreference.com/w/cpp/io/ios_base/iostate
не разберёшься, потому что Страуструп (зло?)-намеренно мешает в кучу std::basic_ios::good и std::basic_ios::operator bool , которые отличаются на значение std::basic_ios::eof
ты вроде дал какую-то информацию, бро.
но она такая, что при любом к ней отношении особого выбора нет?
Я всего лишь предложил один из возможных вариантов, поскольку все другие молчат. Других вариантов не знаю.
>>548402
Мне кажется, вы страдаете хуйней, если честно. Серьезно, стандартную библиотеку изучают после ядра языка, а в ней потоки ввода-вывода по важности и интересности где-то на дне. Сосредоточьтесь на действительно полезных вещах лучше: STL, concurrency, аллокация. Вся ебля с io сложнее простых << и >> нужна крайне редко, для всех нетривиальных вещей энивей прикручивают библиотеки.
http://ideone.com/PP0U9l
>А вообще как успехи?
Какие успехи? Я теперь чуть-чуть знаю I/O в крестах. В целом мои нужды перекрывает с запасом.
>>548430
>Мне кажется, вы страдаете хуйней, если честно. Серьезно, стандартную библиотеку изучают после ядра языка
Мне собственно от языка кроме I/O ничего и не нужно-то по моим маленьким потребностям. Но вот данные/алгоритмы по-любому изучить бы.
Iostream самая неудачная часть языка и много где в каеих проектах запрещен. Пользуйся printf
https://events.yandex.ru/lib/talks/2588/ - перемотать на 9:22:
>Сборка браузера занимает порядка полутора-двух часов на очень хорошем Макбуке. Вы, как разработчик, не можете позволить себе делать фичу, а потом ждать полтора часа. Мы это решили: мы берём несколько клонов одного и того же репозитория, и пока в одной директории собирается ваш браузер, в соседней вы работаете над другой фичей.
Вместо того, чтобы сделать нормальные модули, которые бы упростили сборку и позволили бы наконец не пересобирать весь проект, когда вы нажимаете энтер в файле zaloopa.h, используемого везде, продвинутые крестобляди предпочитают во время сборки, чтобы не скучать, делать ЧТО?.. Правильно - работать над другим таском! И похуй, что внимание, которого при пердолении C++ нужно дохуя, идёт по пизде - зато пацанам из Комитета Стандартизации Крестоговна будет бесплатный цирк из кресточушек (пацаны сами к крестоговну не прикасаются, конечно же).
Бамп вопросу.
Что это за хуйня?
>Вы, как разработчик, не можете позволить себе делать фичу, а потом ждать полтора часа.
Чушь. Я ухожу гулять, гоняю чаи с коллегами, играю в плойку, скролю зк.
зк?
Потому что долбоебы, которые проектировали браузер, не могут в pimpl, очевидно же.
>template самая неудачная часть языка и много где в каких проектах запрещен. Пользуйся #define
>Наследование самая неудачная часть языка и много где в каких проектах запрещен. Пользуйся void *.
>printf самая неудачная часть языка и много где в каких проектах запрещен. Пользуйся MOV AH, 9; INT 21h.
Чувак, я двачую этого :
>>548489
не хуйню сказал.
И ссылку добавлю :
http://www.programmersforum.ru/showthread.php?t=192502
Как ответиишь?
А не подскажешь, как сделать, чтобы приложение запускалось в консольку в KDevelop? Ибо неудобно, когда оно в какое-то своё окошко выводит всё.
>по производительности - сравним
Не уступает, вообще-то, если соответствующим образом настроить.
https://arhivach.org/thread/94972/#511941
https://arhivach.org/thread/94972/#513467
iostream нормально со всем справляются.
g++
Как организовываете новый материал вокруг себя.
например не статья, а фрагмент книги пдф дежавю? и т.д
Evernote, OneNote, Nim...
Мне тоже чет так кажется. Ок, запилю векторы.
Очевидное правило гласит: не помещайте тела функций-членов в объявление
класса, если вам не нужна повышенная эффективность программы за счет ис-
пользования небольших подставляемых функций. Большие функции, скажем, со-
стоящие из пяти и более строк, ничего не выиграют от подстановки. Не следует де-
лать подставляемыми функции, содержащие более одного-двух выражений.
>>549595
А тут [1] вот питухи с SO поясняют, что неявный inline зделан для того, чтобы можно было переопределять функцию несколько раз. И inline не обязательно означает реальную подстановку тела функции в место вызова.
[1] http://stackoverflow.com/a/9734378
Короче, из вышенаписанного вывод один. Страус — труп (пикрилейтед) обосрался. inline никогда не был ПРИКАЗОМ компилятору встраивать тело в место вызова; тем более неявный inline.
Не особо понимаю >>549600 пост, выше две ссылки говорят об обратном же вроде. (ну помимо ещё того, что он используется для того, чтобы ошибок не было, если определение функции расположено в другом файле)
Что за книга?
Страус-труп говорит что функции, определённые в объявлении класса, неявно помечаются как inline, а, значит, встраиваются в место вызова.
SO говорит что неявный inline это правда, но нужен в первую очередь для разрешения переопределения функции. И что компилятор волен встраивать и волен не встраивать тело функции в место вызова. Пост >>549600 это и говорит.
По стандарту неидентичные определения inline-функций это сразу UB.
Пиши тела сразу после класса, а в самом классе оставь только объявления со спецификатором inline. Очевидно же.
Господа, катиться мимо вас толстая веб-пхп-макака, это я.
В веб пошёл от нужды быстро работу найти, но подобное программирование никогда не привлекало, сейчас хочу уйти от туда.
Думаю либо про андроид с жабой, либо про кресты.
За спиной паскаль, руби, два курса вуза, Кормен и т.п., и чувство что это моё.
Но вот в чем вопрос, чем сейчас занимаются программисты на C/C++ ? Меня интересуют конкретные задачи.
И какой уровень нужен для поиска работы?
Что в портфолио положить?
Вот с вебом всё ясно, с мобильными тоже.
А вот чем вы на работе заняты я не очень понимаю.
Помогите разобраться.
ирл знаю людей, пилящих:
- CAD'ы (нужно знать матан и линалг),
- софт для voip эндпоинтов (железяки и windows клиенты). если железяка на ведроиде, то там борщ из сей, плюсов и джабы, иначе си и плюсы.
- софт для кол-центров (дикая смесь из шарпов и крестов).
сам больше не видел продакшен применений крестовщины. может ананон ещё накидает примеров
И снова тупой вопрос. Что нужно доставить, чтобы открылись настройки проекта? Не могу туда зайти, ибо кнопка просто неактивна (cmake поставил). Алсо, у меня почему-то автоматом не поддерживается C++11: не распознал nullptr. В общем, анон, если не сложно, расскажи, что да как, а то я уже устал маяться с этим, а венду нет пока ни желания, ни возможности поставить.
google-точка-ру "работа погромист си-плюс-плюс"
Если без кучи побочного груза, чистый c++ программист используется в проектах, требующих высокой производительности; в основном игры, различные 3d проекты и 3d игры.
Фюрер, бросьте. Мир несовершенен, и тут бывают ошибки у всех. Вам не в этот тред.
не "толстая веб-пхп-макака"
Прощение
Почему бы тебе первое время не посидеть в консоле и не поюзать makefile-ы? Для твоих hello world-ов хватит выше крыши.
Или вообще build.sh с g++ -std=c++14 -o hello_world hello_wrold.cpp
Я, разумеется, нуфаг, но такое положение дел мне не нравится, ибо я уже осваиваю классы, потихоньку подбираясь к шаблонам, поэтому в проекте получается много файлов и т. д. Хотелось бы больше внимания уделить написанию кода, нежели пердолингу с консолью, IDE и прочими радостями жизни. Мне сейчас просто нужна рабочая IDE, поддерживающая 11-й (желательно 14-й) стандарт, с подсветкой ошибок. Всё, больше я ничего не хочу. Постоянно возникают какие-то траблы с IDE под Linux. Вот сейчас не открываются настройки проекта, вернее сам пункт неактивен. Это значит, что я что-то не установил? или, может быть, проблема в чём-то другом? В общем, я не против поебаться с Linux'ом, но сейчас мне просто нужно писать свои Laba1.
Тогда поставь сперму со студией и не еби нам мозги. Ну серьезно, разработка под никсами без охуительной настройки всего под себя всегда была болью.
(просто мимопроходил)
Поставил этот Qt Creator недавно. Так и не смог создать C++ console application (без CMake и QBS).
Ебать ты лох. А я могу.
Подскажите хороших проектов, в которых можно увидеть грамотный код.
В проекте будет обработка данных в потоке и различные виды отображения обработанных данных, если в общих чертах. Пишем под Шинду.
>более-менее нормальная архитектура с возможностями добавления разных фич
llvm, clang. Рассмотри вариант скриптового языка с ядром на С++. LuaJIT быстрая и удобная штука.
Не понимаю я. После него весь код комментируется. И не понятно си это или кресты и какой стандарт. Дай пожалуйста простой хулоуворд в 3 строчки. Неужели сложно?
А файл можно прочесть на этапе компиляции? Кроссплатформенно. Именно с помощью <iostream> , а не #include
Я что, ебу? Ищи сам.
Объявления для функций из pizda.cpp находятся в huj.h, в описании класса.
При попытке вызова функций jigoorda() из pizda.cpp в huj.cpp получаем
undefined reference to Huj::jigoorda()
Как корректно расставить инклуды, чтобы подключайть только *.h файлы?
Объявления всех функций про которые нужно знать снаружи выносишь в хедер. Хедер подключаешь где нужно. Может ты с неймспейсами запутался?
http://pastebin.com/yyWK796T
P.S. Вообще, код на pure C, но от того, компилирую я его как C или C++ код результат не меняется
constexpr int f () {return 0;}
constexpr int g () {int a = 1; return a;}
Если работают обе, то C++14. Если только первая, то C++11. Если ни одной, то C++98.
Зачем тебе на стеке столько? На стеке выделяй маленькие вещи, особеонно если их дохуища по одночке нужно создавать. Выделять мегабайтный массив на стеке один раз за программу практически бессмысленно, разве чтобы потом free() не проебать, но в main похуй, вся память все равно освободится после кила программы.
Да нет, неймспейсами я не пользуюсь.
Суть в том, что я хочу разбить реализацию методов класса на разные *.cpp файлы.
Ну просто все в олимп. прогр. выделяют статически, т.к. на куче выделить - потерять времени, поэтому я и попробовал тоже выделить на стеке. В реальных программах я так не делаю. Вопрос не в правильности, вопрос в том, почему 10001 * 12 байт кладут программу, ведь если верить FAQ проверяющей системы, размер стека на всех компиляторах, кроме VS, 64 мегабайта. Runtime Error появляется на любом компиляторе (там доступны VS, GCC, clang).
Оно крашится вообще во время printf, стек здесь не при чем. Небось в куче-то защита не срабатывает, когда ты считать не свое пытаешься, а на стеке срабатывает.
Хочу хоть немного надрочить алгоритмы, на собеседованиях просто доебали уже ими.
Слышал, что Кормэн лучше, но там очень много не шибко нужной информации.
Какой выбор сделал бы ты, анон?
https://www.coursera.org/course/algs4partI вот тебе Седжвик. Правда он тут вроде на яве примеры показывает, ну да не суть.
Никогда курсеру не юзал.
там платная подписка, или в чем прикол? Чем это лучше наворачивания печатного издания?
Алсо, джаву не перевариваю, лучше уж на питоне.
Анон, ты охуенен.
Дебил, блядь, мать ебал твою. Сам ищи, чмо тупорылое, мы за тебя лабы делать не будем. Даун.
Course Format
There will be two lectures (60-75 minutes each) each week. The lectures are divided into about 4-6 segments, separated by interactive quiz questions for you to to help you process and understand the material. In addition, there will be a problem set and a programming assignment each week and there will be a final exam.
Ну и что молчим-то? Вопрос правда интересный. Каков минимальный размер стека среди всех компиляторов? Я тут тоже (почти-)спортивным программированием увлёкся, хочу небольшой массив в стэк передвинуть, а то на этапе компиляции всё известно для конкретной задачи, а считать долго и муторно, используя этот массив.
32768 байт имеются в моём распоряжении или нет? Если 16384, то мне уже не хватит.
Никто не знает. Стандарт размер стека не регламентирует. Он зависит от системы, от компилятора и от настроек компилятора. Также никто не гарантирует что твой массив действительно окажется на стеке. Гарантируется только автоматическое управление памятью - он удалится по выходе из скоупа. А компилятор спокойно может большие массивы кидать в кучу. Никто минимальным размером стека особо не заебывается - его размера достаточно для того для чего он предназначен (хранения адресов возврата). Хранение пользовательских данных на нем - грязный хак, если у тебя из-за него что-то падает то это твои проблемы. Стек для хранения маленьких переменных/структур. Если нужна скорость пишется аллокатор под нюансы конретной задачи. Все остальное суют прямо в кучу.
Старчѣ, прошлi тѣ врѣмѣна, когда размѣръ стѣка странiцѣй памѣти ограничѣнъ былъ, мы послѣднiю ѢСЪ ѢВМЪ на свалку списалѣ в 1999-м годѣ.
Ну, с разморозкѣй мѣня!
Прошли тѣ времена, когда размѣръ стека страницы памяти ограниченъ былъ, мы послѣднюю EC ЭВМ на свалку списали въ 1999-мъ году. Ну, съ разморозкой меня!
Возможно, проверяющая программа запускается ебанутым компилятором, который не делает alloca_probe? Попробуй сделай примерно так:
void my_alloca_probe(void object, size_t size) {
for (size_t i = 0; i < size; i += 4096) {
((uint8_t*)object+i)=0;
}
}
и вызови до первого доступа к твоему большому объекту.
>>550846
Ну да похуй, я все равно наебался. В общем, суть в том, чтобы обращаться к каждой страницы стека в обратном порядке (а не как у меня), чтобы ОС поняла, что тебе нужно моар и выделила страницы памяти.
>Поясните за статическое выделение
Ты путаешь. Стек - это автоматическая память, а не статическая. Статическое выделение - это вот так:
static Node nodes[10001];
И это самый грамотный вариант, если нет рекурсии.
Размер стека определяется не компилятором, а линкером, который из объектных файлов собирает executable. Причем все сильно платформо-зависимо, в windows мире размер стэка задается в заголовке PE-файла (и есть соответствующие #pragma), в линуксе - свои заморочки, о которых я понятия не имею.
Я не он, я сочувствующий. И у меня объекты гораздо меньше (провёл оптимизацию по уменьшению объектов), краша в 15 студии не происходит. Интересно, как в других компиляторах дела обстоят и вообще, почему до сих пор знатоки стандарта не высказались?
>static Node nodes[10001];
>И это самый грамотный вариант, если нет рекурсии.
А вот здесь можно подробнее? Да, я обращаюсь к функции, где например char dohuja[10001]; несколько раз.
Почему статик лучше?
>почему до сих пор знатоки стандарта не высказались?
С точки зрения стандарта тебе уже пояснили все. В стандарте нет понятия "стек". И даже если забыть про это, ежу понятно, что размер стека не может не быть платформозависимым. У меня валяется ардуина, там памяти 16 килобайт, из которых дохуя уходит просто на хранение инструкций. И внезапно под него тоже пишут на крестах с небольшими оговорками. Как ты думаешь, там может на стек выделиться "1 МБ, на которые всегда можно рассчитывать", как тут выше кто-то спизданул?
Ну и чем это принципиально отличается от ситуации, когда в твоей ардуине new не сможет выделить столько же? Ах, ты это обработаешь? Лол, но как, если тебе НУЖНО 1 мб для работы?
>Ну просто все в олимп. прогр. выделяют статически, т.к. на куче выделить - потерять времени
Просто иди нахуй, олимп. долбоёб.
Мне всего-то 64 килобайта надо на всё про всё, включая рекурсии и даже Аллаха. Кроме твоей ардуины есть ещё где стэк меньше 64 килобайт?
1) удобство и интуитивность
2) производительность
3) количество сторонних либ (гуя, например)
4) функциональность изкоробки
CUDA сойдёт? Не то, чтобы там был настоящий стек, конечно.
>Интересно, как в других компиляторах дела обстоят и вообще, почему до сих пор знатоки стандарта не высказались?
Стандартный С++ - Тьюринг-полный язык, а любое ограничение по памяти делает его не Тьюринг-полным. Было бы странно, если бы в стандарте что-то об этом говорилось.
>А вот здесь можно подробнее?
Если ты пишешь под пека, то в static-переменную или глобальную влезет намного больше, чем в стек.
На что? Если ты можешь реализовать на языке брейнфак, это будет Тьюринг-полный язык. Но только если под рукой у тебя бесконечная память. Иначе уже нет (и в таком случае - конечной памяти - проблема остановки принципиально разрешима).
Пруф, что по стандарту C++ - Тьюринг-полон, а в его реализациях - нет?
Насколько я знаю, по стандарту всякие там глубины стека и максимальная глубина рекурсии может быть ограничена как угодно.
>а в его реализациях - нет?
Машина Тьюринга в природе существовать не может, потому что ей требуется бесконечная память. Поэтому и реализаций нет. Не может быть.
>Пруф, что по стандарту C++ - Тьюринг-полон
Теоретически ты можешь себе представить size_t (и void*), реализованный через длинную арифметику. В стандарте на это нет запрета (The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object.). Значит и ограничений на размер памяти нет. Другой вопрос, что 64-битных указателей хватит всем.
>Машина Тьюринга в природе существовать не может, потому что ей требуется бесконечная память. Поэтому и реализаций нет. Не может быть.
Я это прекрасно знаю
>Теоретически ты можешь себе представить size_t (и void*), реализованный через длинную арифметику. В стандарте на это нет запрета (The type size_t is an implementation-defined unsigned integer type that is large enough to contain the size in bytes of any object.).
Подозреваю, что "unsigned integer type" это как раз и есть запрет на это.
>Значит и ограничений на размер памяти нет.
Ну так это как раз значит, что реальный компилятор C++ на реальном компьютере может соответствовать стандарту.
>Если ты пишешь под пека, то в static-переменную или глобальную влезет намного больше, чем в стек.
LOLWTO? static-переменная разве не на стэке лежит?
><устарело> Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004)
А что там конкретно устарело?
ООП kek
А кроме этого?
Там же, где и глобальные переменные. По сути это глобальная переменная с ограниченной областью видимости. Вообще смотри https://ru.wikipedia.org/wiki/Модель_памяти_в_языке_Си
3.7 Storage duration [basic.stc]
1 Storage duration is the property of an object that defines the minimum potential lifetime of the storage
containing the object. The storage duration is determined by the construct used to create the object and is
one of the following:
(1.1) — static storage duration
(1.2) — thread storage duration
(1.3) — automatic storage duration
(1.4) — dynamic storage duration
2 Static, thread, and automatic storage durations are associated with objects introduced by declarations (3.1)
and implicitly created by the implementation (12.2). The dynamic storage duration is associated with objects
created with operator new (5.3.4).
3 The storage duration categories apply to references as well. The lifetime of a reference is its storage duration
3.7.1 Static storage duration [basic.stc.static]
1 All variables which do not have dynamic storage duration, do not have thread storage duration, and are
not local have static storage duration. The storage for these entities shall last for the duration of the
program (3.6.2, 3.6.3).
2 If a variable with static storage duration has initialization or a destructor with side effects, it shall not be
eliminated even if it appears to be unused, except that a class object or its copy/move may be eliminated
as specified in 12.8.
3 The keyword static can be used to declare a local variable with static storage duration. [ Note: 6.7 describes
the initialization of local static variables; 3.6.3 describes the destruction of local static variables. — end
note ]
Ничем, я про то и толкую. Глупо надеяться, что стандарт даст какие-то гарантии по поводу производительности железа, объемов памяти и вот этого всего. Берешь конкретно свою платформу и смотришь уже в ее спецификациях, какие гарантии предоставляются а они даже на десктопе достаточно скудные.
Двачую этого. Стандарт не запрещает быть Тьюринг-полным, но и не требует этого, иначе бы никто не мог ему соответствовать.
Она 2004 года, описывается старый стандарт. Соответственно, в каждом втором примере оттуда будет говно наподобие NULL вместо nullptr, именованных функторов вместо лямбд, const вместо constexpr, ну ты понел.
Там книжка же для тех кто вчера решил научиться программировать и до сих пор пугается строчки x=x+1 то бишь самые базовые основы.
хватит выебываться, тебе уже пояснили почему книга устарела.
помогите пожалуйста с программой
у меня не работает функция пересечения двух множеств, причём если размер первого множества меньше размера второго, то у меня не полностью выводится второе множество,
и если в двух мноествах встречается больше чем один одинаковый элемент, то выводится только первый элемент
http://pastebin.com/jFNdkDcg
Они в плане неизменных вещей все примерно одинаковые. Но учиться лучше сразу хорошим практикам, чтобы потом не узнавать с удивлением, что так, как ты, никто уже давно не пишет.
tl;dr. Юзать std::set вместе с std::set_intersection не пробовал?
Когда как, но чаще всего в питонотреде
Если правильно помню, создает так, как инстанцирован. Т.е. можно создать std::array динамически и не будет такого ограничения по размеру.
Короч допустим у нас есть массив символов.
char ARR = new char[SIZE];
Компилятор мне ругается на вот такую строчку
ARR[1] = "a";
Мол
invalid conversion from 'const char*' to 'char'
При этом, если я делаю ввод с клавиатуры, всё прекрасно работает и он записывает в элемент под номером 1 то, что я напишу.
cin>>ARR[1];
Не понимаю, как так получается, помогите плз.
Бля, звёздочку съело где указатель на массив создаём.
Можно пропустить, но его или какой-нибудь гуй освоить по-минимуму придется, хотя бы чтоб окно создать и получить хэндл куда рисовать.
http://stackoverflow.com/questions/1633890/gui-api-for-directx
Ну и вообще, чтобы накодить простенькую игру в свободное время, directx - очень оверкилл. Намного больше времени потратишь на его освоение и написание рендера, чем на саму игру.
Бери готовый движок лучше или либу вроде sfml.
Спасибо!
Отлично, попробую тогда освоить QT.
Практикую классы в С++.
Есть класс BankAccount, имеет три свойства. Этот класс имеет простой метод, это снятие денег со счета. Просто снять деньги получается, но я решил добавить проверку, что бы снимаемая сумма была не больше той, что есть на счету. И в случае, если сумма снимаемая больше имеющейся суммы, повторять ввод, пока не выполнится данное условие.
И вот не получается нормально, первый раз когда я ввожу снимаемую сумму, происходит проверка, сумма снимаемая оказывается больше той, что имеем, и меня просят ввести снимаемую сумму еще раз. Я целенаправленно ввожу снимаемую сумму больше той, что имеем, и мне выводится инфа, что у меня от имеющейся суммы отняли сумму, которая больше чем кол-во денег, что мы имеем.
Вот метод класса.
http://pastebin.com/f0cDH9pf
А вот весь проект, т.к. делал многофайловый проект.
https://madokami.com/96iemv.rar
IDE msvs2010
Че такое свойства?
Точно также как на джаве, только синтакс объявления классов немного другой. Читай про классы, new и delete, и для лаб хватит.
А зачем ты в while сравниваеме числа местами поменял, в условии выше же правильно.
Есть ли какие-то серьёзные отличия в работе? Например, если надо будет создать парочку свойств в виде public, будет ли разница в работе программы между классом и структурой?
>пока число которое ввели не будет меньше баланса
Это repeat-until(condition) (которого в c++ нет, есть просто do-while(!condition)).
do-while(condition) же повторяет цикл, пока условие верно (а не пока оно не станет верно).
Спасибо тебе милый человек.
Чому так грубо? Я задал вполне адекватный вопрос.
Окей, спасибо за разъяснение. Если я пишу static, то где выделится память для массива/переменной? Алсо, попробовал сдать задачу, приписав static к объявлению массива - все тот же runtime error. Может я там в коде что-то делаю не так? Глянь, если не лень будет, пожалуйста.
http://acm.timus.ru/help.aspx?topic=cpp
P.S. Тут параметры компиляции, стек реально большой, в чем может быть проблема?
В общем есть две функции
/
?Fire@CEGun@@UAE?AW4FireResult@@ABVVector@@@Z
public: virtual enum FireResult __thiscall CEGun::Fire(class Vector const &)
/
/ public: bool __thiscall CEGun::ComputeTgtLeadPosition(class Vector &)const /
В общем суть: хук повесить на первую функцию, в хуке вызвать вторую функцию и её результат задать первой функции
Я уже совсем заебался, познаний совсем нету, кто поможет? Нужно написать все одну dll. Она не больше вроде 50 строк.
Не будь как маленький, поставь брейкпоинт сразу после аллокации массива. Если не доходит до него - проблема в массиве. Если доходит - где-то еще.
При добавлении файла можешь указать галочку, он сам добавит сорцы.
Но норм люди пишут симэйк обычно руками.
Структура проекта:
/
/Logger/сорцы
/Custom/Core
/Custom/Plugins
/writter/win/сорцы
/writter/mac/сорцы
Cmake:
...
aux_source_directory(./Logger LOGGER_SRC)
aux_source_directory(./Custom/Core CORE_SRC)
if (WIN32)
aux_source_directory(./writter/win WRITTER_SRC)
elif(APPLE)
aux_source_directory(./writter/mac WRITTER_SRC)
endif()
if (${PROJECT_PLUGINS_ENABLED})
aux_source_directory(./writter/Plugins PLUGINS_SRC)
endif()
add_executable(${PROJECT_NAME}
${CORE_SRC}
${LOGGER_SRC}
${WRITTER_SRC}
${PLUGINS_SRC}
)
И при запуске cmake, что на маке, что на винде можно юзать
cmake .
Тогда забилдится исполняемый файл/либа без плагинов для текущей оси.
Если нужны плагины, то
cmake . -DPROJECT_PLUGINS_ENABLED
При добавлении файла можешь указать галочку, он сам добавит сорцы.
Но норм люди пишут симэйк обычно руками.
Структура проекта:
/
/Logger/сорцы
/Custom/Core
/Custom/Plugins
/writter/win/сорцы
/writter/mac/сорцы
Cmake:
...
aux_source_directory(./Logger LOGGER_SRC)
aux_source_directory(./Custom/Core CORE_SRC)
if (WIN32)
aux_source_directory(./writter/win WRITTER_SRC)
elif(APPLE)
aux_source_directory(./writter/mac WRITTER_SRC)
endif()
if (${PROJECT_PLUGINS_ENABLED})
aux_source_directory(./writter/Plugins PLUGINS_SRC)
endif()
add_executable(${PROJECT_NAME}
${CORE_SRC}
${LOGGER_SRC}
${WRITTER_SRC}
${PLUGINS_SRC}
)
И при запуске cmake, что на маке, что на винде можно юзать
cmake .
Тогда забилдится исполняемый файл/либа без плагинов для текущей оси.
Если нужны плагины, то
cmake . -DPROJECT_PLUGINS_ENABLED
Ладно, давайте тогда так.
public: bool __thiscal
Как это расшифровать? Гугл выдает ссылки на стаковерфлоу, а мне бы кратенько, смысл написанного.
Публичный член CEGun, возвращает bool, подчиняется соглашению о вызовах методов класса thiscall, когда указатель на объект, от имени которого вызывается метод, записывается в ECX.
Так в том то и дело, что у меня все прекрасно работает. Не могу я воспроизвести баг.
SDL не использовал, когда выбирал между ними больше понравился SFML, поэтому напишу только про него:
1) норм, проблем не было.
2) мне скорости хватало, рисовал все через VertexArray. Вообще странный вопрос, т.к. что SDL, что SFML просто обертки.
3) хз, вроде на форумах что-то было. НИНУЖНО/нормальному гую похую к чему прикручиватся.
4) вроде норм.
Что не понравилось: у SFML нету нормальной матлибы, есть потешные структурки "типа" векторы, но без каких-либо методов/конструкторов. Стороннюю либу взять можно, но приходилось конвертировать свои векторы/цвет в это потешное говно. НАХУЙ ТАК ЖИТЬ.
Был баг при потери фокуса окна, но его мгновенно пофиксили.
Но вообще, достаточно симпатично.
Ели это олимпиадная задачка, то на каком тесте валится? Если не на первом - проблема в коде.
Ну так наставь дебажных выводов в stdout и в stderr вида "line 15: array created" и смотри на то что тебе вернёт проверяющая система.
Если я правильно понимаю, в ACM вывод не виден решающему непосредственно. Приходит типа отчета по пройденных тестах и все.
Тогда лови ошибку в try-catch. Есть ошибка - не поймал, тест провален и без ошибки - поймал.
Зазывают в достаточно крупную международную компанию POS/банковских сервисов. Прошел первый этап собеседования, выяснил для себя что кодить нужно на чистом Си.
Нет, я конечно писал на нем и много, но: может кто сталкивался - в чем специфика? Почему именно Си? Я как-то всегда наивно считал (до этого писал медийный хайлоад), что весь банковский софт пишется на плюсах и джаве. А вот оно как.
Заранее признателен.
У этих пидоров запрещены любые исключения, даже которые ты сам ловишь. Как только бросается - runtime error.
Цэ - потому что быстрый. Не кресты - потому что тяжкий крест груз стандарта и обратной совместимости с Си и ненужных обвесков-заплаток, которыми никто не пользуется. 0x14 сейчас вроде актуальный стандарт, они в последних стандартах толковой хуеты надобавляли(лямбды, замыкания, moving semantics, constexpr, STL smart pointers, threads, hashtables) - но нужно во всём этом разбираться. Копаться в чьих-то сколь-нибудь сложных templates - это адский ад. Хотя сама штука весьма полезная и нужная по задумке, реалии мира же суровы.
Квалификация нужна повыше, чем в Цэ соответственно. Иногда чистого Цэ хватает за глаза для определённых задач(где не надо ООП, полиморфизма). Например те же вычислительные/алгоритмические задачи, где надо пережевать огромный входной файл/базу во что-то полезное.
>Никто минимальным размером стека особо не заебывается - его размера достаточно для того для чего он предназначен (хранения адресов возврата).
Он также предназначен для локальных переменных(к примеру тех же временно живущих указателей, в которые распределяешь кучу, временных значений при вычислении) и передачи параметров(т.н. фреймов вызова функций) - и рекурсии соответственно.
Тогда по старинке - комментируешь половину кода и посылаешь. Есть rt-error – ошибка в незакомментированном коде.
Только сам сначала проверяй, что полученная каша запускается.
А замыкания разве добавили уже? Это же вроде пока только экспериментальная фича, которую кроме мелкомягких ни один компилятор не внедрил.
Они их внедряют избирательно. Большая часть весомых фич из 17 стандарта за ними, но зато не весь 14 держат.
Есть задача: Заявки 1-го типа поступают в "хвост" очереди по случайному закону с интервалом времени Т1, равномерно распределенным от 0 до 5 единиц времени (е.в.). В ОА они поступают из "головы" очереди по одной и обслуживаются также равновероятно за время Т2 от 0 до 4 е.в., после чего покидают систему.
Найти, например, время прохождения 1000 заявок.
Как-то запрограммировать?
Очень желательно без stl
Я думаю, что сначала лучше разобраться "как всё устроено", пописать свои pop-push/подобное руками, а потом уже stl использовать.
Но вообще, я буду рад любому решению, которое я смогу понять, ибо задачка выше-это кусок большой задачи, которую мне потом нужно сделать.
> без stl
В твоей постановки он не нужен. Тебе не надо хранить очередь, нужна только её текущая глубина.
http://www.r-bloggers.com/simulating-a-queue-in-r/
Вот так, только на cpp. Хотя нахуй cpp, на R это проще, только при генерации времени следующего прихода/ухода вместо rexp() заюзай runif().
Я, когда писал дипломную, обернул тот код в функцию, которая принимает на вход функцию распределения времени прибытия и обработки событий и листы с параметрами для первой и второй функции и гонял с разными параметрами.
Они и 11 пока не держат, лол. Нет, если мне не изменяет память, какой-то ебалы для SFINAE и еще чего-то.
Лол, у нас что-то подобное по имитационному моделированию задавали. По меркам МГУ халява лютая, все радовались.
Позавчера попалась книга Хакинг. Искусство эксплоита. Открываю значит, ознакомился с содержанием. Там язык С. Про который я думал, что он мертв. Неужели, чтобы понять и применить на практике(с целью ознакомления) все хуитки из книги я должен пердолить С? Все эти работы с памятью, эти сдвиги, че несут вообще. Никакой альтернативы нет?
три курса хтмл+цсс и жбскрипта.
Да, здесь таки все в свое время отведали низкоуровневого говна, и ты так делай. Почему это нужно - есть статья Спольски: http://russian.joelonsoftware.com/Articles/LeakyAbstractions.html Так что читай Кернигана-Ритчи и пиздуй в си-тред, ссылка есть в шапке.
sdl - это палка и верека, исключительно подменяет прослойку между окноопй подсистемой и opengl, ну и пле немножко обработки ввода, евентов, таймеров и звука, но плохо, если надо лучше, надо вкорчивать в программу платформозависмые костыли сразу
sfml полноценный фреймворк, к тому же на крестах, а сдл на чистом си, впрочем там настолько все просто о и тупо что на крестах это не сделать даже если бы и захотели бы
И как мне тогда реализовать такую схемку - вначале у меня кучу раз добавляется всё в этот map, а потом одним вызовом всё инициализируется? И все указатели, которые были получены до этого через Submit, мгновенно становятся валидными?
> Я же получаю указатель на переменную, т.е., если изменится её значение, я узнаю об этом.
https://ideone.com/AzFlkj
Лучше юзай ссылку.
Спасибо.
Указатель указывает на какое-то место в памяти. В твоём случае он указывает в никуда. Возвращая его из метода ты копируешь его. А он всё так же указывает на пустоту. Как и с обычной переменной это твоя локальная копия.
Если бы этот указатель указывал на определённый адрес в системе, то ты бы по нему менял объект по этому адресу. При этом сам указатель бы не менялся. Повторюсь, т.к. это просто копия. И эта копия хранится совсем в другом месте, нежели то, что в мапе или то что создано в методе. При условии, что отсутствует оптимизация компиля.
А вот сейчас осторожно.
Для твоего воgроса о слежении за изменениями объекта по указателю тебе и нужно брать адрес этого указателя. И таким образом ты сможешь отследить появился ли объект там, куда указывал указатель. Изменился ли он и т.п.
На всякий случай приложу код.
https://ideone.com/B25kqS
И почитай много хорошей лит-ры. Этот код очень не хорош, за него даже не пизят по ебальнику, а просто закапывают :3 Сохранил твою структуру, чтобы тебе было проще понять как оно работает. На этапе обучения это важнее
>>552963
Ещё забыл добавить, что твой возврат из метода map[key] тоже не очень хорошо.
Если ты зайдёшь вот сюда http://en.cppreference.com/w/cpp/container/map , то увидишь
"Search, removal, and insertion operations have logarithmic complexity". Это, увы, обозначает что ты потратишь в худшем случае log(map_size) времени на повторный поиск. А ещё учти посимвольное странение строк. Короче, проебёшь кучу времени. И от таких ситуаций оптимизация компилятора не спасёт.
Поэтому теперь переводим свой взгляд на http://en.cppreference.com/w/cpp/container/map/insert и http://en.cppreference.com/w/cpp/container/map/emplace и видим что-то такое:
std::pair<iterator,bool> insert( const value_type& value );
...
Return value
1-2) Returns a pair consisting of an iterator to the inserted element (or to the element that prevented the insertion) and a bool denoting whether the insertion took place.
3-4) Returns an iterator to the inserted element, or to the element that prevented the insertion.
5-6) (none)
Вот. Отсюда, мы вернём указатель с гораздо меньшими затратами.
Надеюсь не зря простыню написал и что-то ты понял :3
Так у меня не этап обучения, а менеджер текстур. С условием, чтобы не было никакой подгрузки в рантайме. И с условием, чтобы одна и та же текстурка не грузилась дважды. А ещё с условием, что текстуры могут быть как ID3D11ShaderResourceView, так и ID3D12Resource, так и какой-нибудь OpenGL-овский unsigned int.
Ну ладно, с типами данных легко, можно создать map<string, void*>, возвращать этот же войд и делать reinterpret_cast в рендерере. Да, немного костыльно, но по-другому нельзя. Зато reinterpret_cast не ест тактов процессора.
Условие, чтобы она не грузилась дважды, сделать тоже легко - взять map с ключом - именем файла. И проверять на наличие в map этого ключа.
А вот что делать с отложенной инициализацией... Созданные текстуры раскиданы довольно много где.
Я думал о том, чтобы ввести систему ID текстур и просто получать их по ID. Да, неплохо, но оверхед пугает, да и друг сказал, что не нужно и можно обойтись. Жёсткий рантайм всё-таки.
Возвращать двойной указатель? Тогда и хранить двойной указатель нужно во всех местах, где он используется. А это выглядит не очень хорошо.
>>552965
Я знаю про логарифмическую сложность. Поэтому и взял map - в нём поиск всегда занимает логарифмическую сложность, что означает, что это будет происходить довольно быстро.
Хотя всё равно спасибо.
char SomeAlgorithm(char S[35]) {
char S1 = NULL, S2 = NULL;
S1 = (char )malloc( 35 );
S2 = (char )malloc( 35 );
strcpy( S2, S );
…
strcpy( S1, S2 );
return S1;
}
и этой:
static char SomeAlgorithm(char S[35]) {
char S1 = NULL, S2 = NULL;
S1 = (char )malloc( 35 );
S2 = (char )malloc( 35 );
strcpy( S2, S );
…
strcpy( S1, S2 );
free( S2 );
return S1;
}
И вообще, когда применяется static к функциям?
char SomeAlgorithm(char S[35]) {
char S1 = NULL, S2 = NULL;
S1 = (char )malloc( 35 );
S2 = (char )malloc( 35 );
strcpy( S2, S );
…
strcpy( S1, S2 );
return S1;
}
и этой:
static char SomeAlgorithm(char S[35]) {
char S1 = NULL, S2 = NULL;
S1 = (char )malloc( 35 );
S2 = (char )malloc( 35 );
strcpy( S2, S );
…
strcpy( S1, S2 );
free( S2 );
return S1;
}
И вообще, когда применяется static к функциям?
Если static применён просто так, к глобальной функции - то это будет означать, что доступа к функции не будет из других файлов, она будет видна только в этом.
Если в классе - то это будет означать, что не нужно создавать объект класса, чтобы вызвать функцию.
Со static перед функцией ты не засираешь глобальное пространство имен, лучше писать везде, где возможно.
Понятно, спасибо.
Type variable;
и
Type variable;
???
Хуйню написал. static для нелокальных сущностей deprecated, следует использовать анонимные пространства имен, если хочешь запретить доступ из других файлов.
Разницы нет.
Хех, а вот тут спасибо.
Хм, ну да, формально все верно. Но энивей лучше не использовать, когда есть возможность в анонимные пространства имен, они же более наглядны у static вообще сильно многозначная семантика.
>у static вообще сильно многозначная семантика
Вполне однозначная, непонятно только ньюфагам, но им и анонимные неймспейсы лучше не будут.
почему компилятор не выдает ошибку, когда я пытаюсь положить значение в область памяти, которая моей не является?
вот код:
int mas=(int)calloc(10,sizeof(int));
int mas2[10];
if (mas!=NULL)
{
mas2[10]=1;
mas[10]=1;
}
2) является ли эта ситуация undefined или unspecified behavior?
1. Потому что компилятор не занимается статическим анализом.
2. А system("rm -rf /") - это какой behavior?
> почему компилятор не выдает ошибк
Компилятор не следит за границами массивов. Это UB. UB даже просто установить указатель за границы выделеного именно для этого указателя массива памяти, за исключением одного элемента следущего прямо за выделеным блоком. Тоесть mas+=10; - норма, mas+=11; - UB, *(mas+10) - UB.
И что?
Нашел еще, что можно при помощи либы librtmp сделать клиента, но пока ищу примеры как с её помощью вывести изображение на экран.
Не, я в том смысле, что одно и то же ключевое слово, в зависимости от контекста, означает разное. Это вообще довольно больное место C++, потому что из-за static, или, например, virtual которое может обозначать как виртуальный метод, так и виртуальное наследование грамматика не является бесконтекстной, и разбирать ее сложнее. И компиляция замедляется.
Undefined это.
Неправда же. Установить указатель можно на что угодно, это допустимо. UB возникнет при попытке его разыменования.
Щяс проверю))
за исключением одного элемента следущего прямо за выделеным блоком - почему так?? там же уже мусор лежит и это не выделенная память?
получается, я могу положить любое значение в любой участок памяти, выделенной процессу (и на стеке и в куче), если он уже не используется мной же?
> там же уже мусор лежит и это не выделенная память?
Ты не знаешь, что там лежит, т.к. не можешь разыменовывать указатель.
> за исключением одного элемента следущего прямо за выделеным блоком - почему так?
Потому что массивы принято описывать как полуоткрытые интервалы.
как не могу, если я свободно туда значение кладу
и если он полуоткрытый [0;10), почему я могу ложить значение в [10]?
Потому что размер массива в общем случае известен только в рантайме. Ты можешь сказать, что в твоем конкретном случае это не так, но компилятор статическим анализом не занимается, и он понятия не имеет, заходишь ли ты за границы массива или нет.
По стандарту это UB.
> за исключением одного элемента следущего прямо за выделеным блоком - почему так
Чтобы в цикле можно было удобно пройти по выделеному блоку памяти, что-то типа for(i=0, i <size; i++), где i - указатель. На последней итерации указатель станет указывать на участок памяти сразу за выделеным, что доспукается, но разименовывать уже нельзя. И дальше передвигать нельзя.
Есть системы где сама ОС следит чтобы ты не вылез за выделеный буфер, я деталей не знаю, но там наверное указатель не просто переменная с адресом, а объект который выдается системой (типа мьютекса), и система следит как ты с ним работаешь. Если ты запросил указатель для работы с блоком памяти то при попытке передвинуть указатель вне блока система пошлет нахуй.
> я могу положить любое значение в любой участок памяти, выделенной процессу
Вообще да, но могут всплыть нюансы. Гугли "переполнение буфера".
Ты не понял, что это значит. Это значит, что если прибавить к адресу последнего элемента единицу, то переполнения не случится, то есть нельзя расположить массив в памяти по адресам N - последнее возможное число. А вот по адресам N - последнее возможное число минус один - можно.
Я загуглил этот отрывок и нашел это - говорят, C стандарт. http://c0x.coding-guidelines.com/6.5.6.html
мимо-рандом
Лол, нет.
> никто не запрещает
Угу. Но и никто не гарантирует. Указатель, полученный из рандомного числа не является safely-derived и его поведение unspecified.
Если вкратце, что гарантирует стандарт: можно присвоить указателю что угодно, все будет WB. Можно разыменовать указатель на существующий объект, WB. Можно сравнивать указатели на любые корректные объекты при помощи == друг с другом и с nullptr, будет WB. Можно сравнивать при помощи <, >, <=, >=, но WB будет только если это элементы одного массива, либо точка сразу за концом массива (поэтому и гарантируется отсутствие переполнения по твоей цитате - чтобы можно было пройти по массиву, сравнивая с точкой за его концом, чтобы вовремя остановиться), либо члены одного объекта. Для всех прочих указателей сравнение будет unspecified behaviour, т.е. программа корректная, но конкретный результат неизвестен и зависит от реализации.
но если я положу значение в Nый элемент, мне никто не сообщит о том, что так делать нельзя?
Не совсем так. Дальше передвигать можно, без разыменования UB не будет в любом случае. Но отсутствие переполнения уже не гарантируется, т.е. в указателе может появиться теоретически рандомный адрес, ну как если бы ты без инициализации его определил, с мусором. Вроде все корректно, но использовать нельзя.
>Ты не понял, что это значит
Я прекрасно понимаю что это значит. Это пункт об арифметике указателей и о том, когда и что можно к ним прибавлять. Так вот, прибавлять к указателю можно когда он является указателем на элемент массива и так, что можно вылезти только на один элемент после конца массива. Всё остальное — UB.
Он может заниматься, но не обязан. Даже в случае ill-formed программы стандарт не всегда требует диагностики, а уж отслеживать предполагаемое UB в рантайме точно от компиляторов не требовалось и не будет.
Нет же. Переполнение возможно, но это нихуя не UB. Если ты сложил два MAX_INT, то UB не будет, ты просто данные свои же попортишь. Тут то же самое.
Тогда что считать переполнением?
Что ты несёшь?
Зауисит от компилятора. Если запустишь шланг с какими-нибудь опциями проверки нелегального доступа к памяти, то возможно он во время запуска сообщит. А может какой-нибудь компилятор и просто с -Wall -Wextra даст ворнинг, хз. А может ты попытаешься обратиться к памяти, которая принадлежит не твоей программе, и тебе операционка завершит твою прогу.
Unspecified это не критично же, программа не поломается, если ты знаешь, что делаешь. Если ты сделал двойной каст в исходный тип через тип большего размера, то ты пройдешь через unspecified и вереншься в нормальное поведение, гарантированно. А если ты попытаешься приойти так через undefined, то это некорректно, потому что все может нахуй сломаться.
Well behaviour.
Блджад, покурил стандарт и таки да. Мне всегда казалось, что это unspecified. Энивей, "most existing implementations of C++ ignore integer overflows".
Неа. Остальное UB - только если действительно случится переполнение. А если не случится, то никакого UB. Так что эта хуйня рандомно в реальном мире скорее всего никогда может превратиться в UB, типа такого
if (get_random_int() == 100500) {
invoke_undefined_behaviour();
}
Хм, но ты-то не знаешь, случится ли переполнение, так что по любому определенности нет у тебя.
>Неа
Ты не понимаешь, к чему относится "otherwise". Оно относится к "If both the pointer operand and the result...", а не к "shall not produce an overflow".
По факту никто не следит, всем похуй, и просто портятся данные, с отбрасыванием старшей единицы. А в стандарте это типа как отказ от ответственности.
Нет.
>most existing implementations of C++ ignore integer overflows
Я уверен, что это не совсем так.
Как минимум выдача ворнингов, если статический анализ выявит, что переполнение гарантированно будет - что-то типа MAXINT + MAXINT прямо в коде.
А иногда еще какие-нибудь компиляторские оптимизации производятся на основании того, что если овервлоу, то это UB.
А еще я сейчас опять подумал и припомнил, что где-то читал, что UB это переполнение то ли только signed чисел, то ли только unsigned. Не помню, каких именно.
>>553404
Вообще процессор за этим следит и в случае переполнения ставит флаг, что случилось переполнение. C и C++ вроде как не предоставляют возможности работать с этим флагом. Так что в реальном ирл мире если у тебя в программе складываются два числа и случается переполнение, и язык у тебя используется не какая-нибудь Джава, а что-то типа C или C++, то вероятно оно переполнится, и язык на это не обратит внимания, и программа дальше будет работать.
Зависит от. Можно компилировать с флагом защиты от переполнения, плюс ос может вскукарекнуть, если ты, например, залезешь на адрес возврата. А может и не вскукарекнуть.
Статический анализ это да, но в целом я не могу представить реализацию, когда случится что-то плохое от присваивания указателю рандомного значения, хоть даже запрещенного/с переполнением. Ну, только если это специально вставлять код, который будет это отслеживать и срать в кашу неаккуратным погроммистам.
видимо имелся ввиду выход за границы и разыменование
Ладно, ты прав, там так написано.
Но
1. Я не уверен, так ли это в C++, а еще я где-то что-то читал, что вроде противоречит этому, так что хуй знает
2. Я это вообще нашел в каком-то там The New C Standard, и я хуй знает, что это такое
3. Стоило привести весь абзац от начала, чтобы было понятно, что речь вообще про математические операции плюс и минус между указателем и числом.
>Стоило привести весь абзац от начала, чтобы было понятно, что речь вообще про математические операции плюс и минус между указателем и числом.
Ну а как ещё получить указатель на конец массива, кроме как прибавляя к указателю на начало длину массива?
получается в mas[mas.length] можно класть значение и это не будет UB?
нельзя потому что это запрещено стандартом, или потому что поведение в этом случае неопределено?
Ладно, оказывается действительно
если прибавить или отнять сколько-то от указателя на сишный массив, не на что-то другое, так вот - прибавить или отнять столько, что результат не вписывается в [начало массива; конец массива плюс 1], то это UB.
Это в C++ стандарте.
для >>553421
про разыменование там ничего не сказано
Но я на 100% уверен, что разыменование конца массива плюс один, если ты на эту ячейку получил указатель не каким-то другим способом, то если не через какую-то другую переменную, это UB
Потому что стандарт говорит я не знаю, где именно, но инфа сотка говорит, что в таком случае поведение не определено
всем спасибо за разъяснения
Чтоу? Стандарт определенно где-то говорит, что в случае такого разыменования поведение не определено. Просто не в том месте, которое приведено тут. Ведь это место - оно про операции сложения и вычитания.
замени на void и посмотри где ошибка, не?
Это потому что ты нарушаешь https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md P.1 и P.3 (у тебя наверное почти последний example из P.3)
Сишный стандарт говорит " If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined. If the result points one past the last element of the array object, it shall not be used as the operand of a unary * operator that is evaluated."
В C++-стандарте последнего предложения нет.
Вот и думай тут.
Очевидно, C++-ный стандарт просто по-другому структурирован. А в C-стандарте получается это написано в двух местах - ведь в описании оператора * унарного наверняка написано, что если он не указывает на подходящий объект, то UB.
Ну вот есть такое:
If an object of type T is located at an address A, a pointer of type cv T<star> whose value is the
address A is said to point to that object, regardless of how the value was obtained. [ Note: For instance, the address one past the end of an array (5.7) would be considered to point to an unrelated object of the array’s element type that might be located at that address. There are further restrictions on pointers to objects with dynamic storage duration; see 3.7.4.3. — end note ]
Потому что русский язык не нужен.
Как в консоли это поправить? Я гуглил, писал setlocale, но ничего не помогает.
http://pastebin.com/ameqBHY9
помогите плиз, не корректно работает программа, хотя код вроде бы правильный
мне нужно создать массив, в котором находятся элементы, которые содержатся в двух множествах
если общий элемент один, то всё верно, а если их несколько, то программа не работает, что не так?
Если ты на cout пишешь юзай cout.imbue() передавая туда объект C++ локали. Попробуй разные локали - на винде win1251, dos866 пробуй, не помню какая уже.
Слишком длинно. Вот как, блядь, нужно писать:
[code lang="cpp"]
std::vector <int> set1, set2, result;
// Здесь заполняем set1 и set2
std::sort (std::begin (set1), std::end (set1));
std::sort (std::begin (set2), std::end (set2));
std::set_intersection (std::begin (set1), std::end (set1),
\t\t\t\t\t\tstd::begin (set2), std::end (set2),
\t\t\t\t\t\tstd::back_inserter (result));
\t\t\t\t\t\t
result.data (); // Здесь твой массив с общими элементами
[/code]
Ну давай разберем по частям тобой написанное. Складывается впечатление, что ты вообще не имеешь представления о безопасности исключений. В конструкторе set ты память выделил? Выделил. А что будет, если T выбросит исключение в операции присваивания, ты подумал? Потечет твой массив из памяти, как твоя мамка при виде куска сала, ибо объект не будет считаться созданным, и деструктор не вызовется.
Нормально ли использовать Spirit для написания парсера простого ЯП?
Нормально. Нынче и хуйлоад на питонах пытаются пейсать, а ты паришься о лексическом анализе с фреймворком.
Кроме Spirit есть еще несколько реализаций генераторов лексических парсеров (lexer один из них называется или что-то вроде этого). Задаешь грамматику в БНФ вроде. Погугли lexical parser generators У них свои плюсы/недостатки перед Spirit. Например, не надо ебаться с шаблонным метапрограммированием.
Прям подбробно, как он выглядит изнутри.
Допустим, цикл принимает вот такое
for( действие; действие; действие, действие)
но ругается на такое
for( действие, действие; действие; действие)
Страуструпа в ОПпосте открывал, там подробностей нет, в гугле тоже инфа уровня for(тут можно задать перменную; тут условие; тут инкремент)
?
На 10 страниц повыше есть описание for, но точно такое же как у Страуструпа (если это не та же книга)
потому что в for первым идет объявление переменных, а не действие. Нельзя вроде сделать (int a=1, float b=2); по стандарту. Уточняй.
Потому что "," - это "оператор запятая", который действует так: вычислить выражение до запятой, вычислить выражение после запятой и вернуть его. Поэтому i=0,j=0 работает.
Но ты пишешь типа, это уже не "оператор запятая", а разделение имен переменных в объявлении. Поэтому "int i=0, int j =0" не работает. Точно так же, как не работает в отдельной строчке:
int main() {
yoba();
int i=0, int j=0;
yoba2();
}
Зато for(int i=0,j=0;...) работать будет по той же причине, что и работает
int main() {
yoba();
int i=0, j=0;
yoba2();
}
Да, спасибо, до меня наконец дошло, вся фишка была вот в этом операторе запятой. Я как-то сразу и не подумал.
мимоучуплюсы
Открываешь его как ifstream и читаешь, это обычный файл же. Алсо, если тебе просто нужно рандомное число, используй встроенный генератор std::mersenne_twister_engine, например.
Спасиб.
Сложно, но на этом основано много магии типа boost::bind.
Так я чернь несведующая, мне примеры подавай, расписывай все
Ну почему же. Если ты хочешь повторно использовать мономорфный код, то правильно будет просто сделать именованный функтор. Но вообще это дело вкуса, делай, как тебе удобно.
Нет, не отжили, но их сильно потеснили. Лямбды - для анонимного inline определения функтора, используемого на месте, это нужно для алгоритмов в основном. Еще у лямбд замыкание есть, а это экономит время - и может даже быстрее выполняться(если оно реализовано ссылкой на стек, вместо копирования переменных). Если же функтор не привязан к окружающему коду(используется вне контекста алгоритмов), и является обычной функцией с состоянием - то можно его объявить и классически.
Ты только что джаву
Где можно почитать про lvalue/rvalue/xvalue, чтобы понять это дерьмо? Сколько ни пытался понять - так и не выходит. Просто не у кого больше спросить.
Замыкание - это волшебная фича из функционального программирования. Позволяет использовать переменные из контекста объявления лямбды(переменные в зоне видимости).
https://ru.wikipedia.org/wiki/Замыкание_(программирование)
http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11
>>554832
http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-and-prvalues
Тащемта, stackoverflow рулит. Там даже C++ FAQ есть в виде вопросов-ответов.
Ты должен понять мотивацию. Мотивация простая - тебе нужен механизм детектирования "временных" объектов - которые сдохнут в этой же строке от "постоянных", которые еще поживут. Зачем? Ради скорости. У временного объекта ты можешь забрать все ресурсы, все равно он труп, а вот из постоянного объекта все придется или копировать или еще как извращаться.
Например в выражении `y=f(g(x))` результат g(x) тут же сдохнет, не дожив до следующей строки. А вот `y` эту строку переживет.
И вот механизм детектирования заключается в том, что временные объекты являются rvalue references (обозначаются они не int&, а int&&). Это значит, что они могут существовать только справа от знака присваивания. Поэтому, сделав конструктор, принимающий rvalue-ссылку, ты можешь быть уверен, что ты принимаешь временный объект, который сдохнет и делать ты с ним можешь что хочешь. Например, забрать у него все unique_ptr и толстые векторы через std::move.
Это - мотивация, поэтому почитай о move-семантике и сделай класс, который может move'иться. А lvalue/rvalue/xvalue оставь разработчикам компиляторов С++.
>>554839
Еще поддвачну - rvalue/xvalue позволяет компилятору делать
https://en.wikipedia.org/wiki/Return_value_optimization
https://en.wikipedia.org/wiki/Copy_elision
Скотт Мейерс оче грамотно поясняет в своей последней книжке и вот в этой статье: http://habrahabr.ru/post/157961/
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
И люсинда шрифт в консоли (у меня на семёрке так)
Задание: Распечатать только простые числа в диапазоне от 1 до N.
Вот мой код:
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <conio.h>
void main()
{
clrscr();
cout <<"Lab-02"<<endl;
cout<<"Zadacha-6"<<endl;
int N,k,count,d;
cout <<"N = "; cin>>N;
for (k=1;k<=N;k++);//Generator chisel ot 1 do N
{
count=0;//kol-vo delitelei priravnivaem k 0
for (d=2;d<=k;d++)//Generator delitelei ot 2 do k
if (k%d==0) count++;//yvelichivaem kol-vo delitelei na 1
printf("%4d ",count);
if (count==2) //ecli 2 delitelya - chislo prostoe
printf("%4d",k); //vivodim k
}
getch();
}
И что с ним не так, кроме того, что он тяжело читается?
Короче понял, где там ошибка.
последний if должен быть
if(count==0)
cout<<k;
Ты бы хоть алгоритм изучил перед применением.
Что нет-то? Обоснуй. Суть rvalue - что не нужно временный объект создавать/копировать(он всё равно справа от присвоения будет), можно запихнуть сразу в левую часть присвоения(т.е. компилер может передать в функцию указатель, вместо возврата и копирования/переноса объекта). В чём я не прав?
>cout вместе с printf
>i++ вместо ++i
>код не отформатирован
>стало лень разбираться
facepalm.jpg
Решето эратосфена возьми рабочее, скопипасти и заюзай.
>Блджад, покурил стандарт и таки да. Мне всегда казалось, что это unspecified. Энивей, "most existing implementations of C++ ignore integer overflows".
СУРЬЁЗНО? Я может неправильно понял? У меня есть код, в котором (не один раз) встречаются (упрощённо) следующего вида циклы for:
>const std::size_t size_t_max = static_cast<std::size_t>(-1);
>for (std::size_t i = size_t_max; count < n; ++count)
>{
>array[++i] = count;
>array[++i] = count;
>array[++i] = count;
>array[++i] = count;
>}
Я хочу проходить по 4 значения array, присваивая им текущее значение счётчика. Array состоит из четырёх миллионов значений. За счёт ++i вместо i++ я хочу выиграть миллисекунду, я жадный.
В самую первую итерацию в первый инкремент у меня происходит переполнение i с size_t_max до предполагаемого нуля. И в MSVS Express 2013 это работает ровно так, как я и ожидал -- обращается к array[0] и т.д. Тем не менее, вопросы:
std::size_t i = static_cast<std::size_t>(-1);
++i;
1) Это UNDEFINED behaviour? да/нет
2) Это unspecified behaviour? да/нет
3) Можно привести прямую цитату из стандарта, разъясняющую этот момент?
Итт тебя наебали. C signed типами - unspecified, с unsigned всё ок.
Это копия, сохраненная 30 октября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.