Это копия, сохраненная 17 сентября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
В stderr погрязших мыслям вопреки:
Была свирепа их толпа дурная.
Визжа, на стол роняли кулаки,
То лоб клавиатурой разбивая,
То мыши норовя изгрызть в клочки.
Учитель молвил: "Сын мой, здесь страдают
Те жалкие, кто выбрал путь крестов.
На гуще из compile-errors гадают
Несчастные. О них довольно слов."
Литература:
Для нюфань:
Три классических учебника для начинающих. Все примерно одинаковой годноты, читать имеет смысл только какой-нибудь один, который больше приглянется.
Герберт Шилдт - C++. Базовый курс (2010) - http://goo.gl/qMLAFl
Роберт Лафоре - Объектно-ориентированное программирование в C++ (2004) - http://goo.gl/QvjR6x
Стивен Прата - Язык программирования C++ (2012) - https://goo.gl/z7kA8u
Для желающих сразу начинать с Откровений Создателя - классика (может показаться суховатым):
Бьерн Страуструп - Программирование. Принципы и практика использования C++ (2009) - https://goo.gl/87qXtW
Учимся не писать говнокод:
Книги про основные подводные камни для тех, кто осилил предыдущий пункт. Следует пролистать все.
Скотт Мейерс - Эффективное использование C++ (2005) - https://goo.gl/wsDXGz
Скотт Мейерс - Наиболее эффективное использование C++ (1996) - https://goo.gl/tHa0tO
Скотт Мейерс - Effective Modern C++ (на ангельском) (2015) - https://goo.gl/uImH0J
Скотт Мейерс - Эффективное использование STL (2002) - https://goo.gl/QtS8Dc
Герб Саттер и Андрей Александреску - Стандарты программирования на языке C++ (2005) - https://goo.gl/Cpk4YR
Наиболее детальные описания языка:
Бьерн Страуструп - Язык программирования C++ (2010) - https://goo.gl/iZBDiV
Стандарт C++14 (на ангельском) - https://github.com/cplusplus/draft/raw/master/papers/n4140.pdf
Последняя на данный момент версия черновика стандарта C++17 (на ангельском) - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4527.pdf
Тонкости языка (для гурманов):
Андрей Александреску - Современное проектирование на C++ (2002) - https://goo.gl/e1V5BC
Герб Саттер - Решение сложных задач на C++ (2002) - https://goo.gl/iWaa6S
Герб Саттер - Новые сложные задачи на C++ (2004) - https://goo.gl/4nn512
Также для легкого чтения подойдет книжка c историей создания C++:
Бьерн Страуструп - Дизайн и эволюция C++ (1994) - https://goo.gl/FqbPwo
Отдельные аспекты:
Читать по необходимости.
Энтони Уильямс - Параллельное программирование на C++ в действии (2012) - https://goo.gl/qJfBkD
Николаи Джоссатис - C++. Стандартная библиотека (2012) - https://goo.gl/PEyiMH
Дэвид Вандевурд, Николаи Джоссатис - Шаблоны C++. Справочник разработчика (2003) - http://goo.gl/0M4NpG
Ссылки:
Годный блог, в котором все просто и понятно тян не нужны кококок борщ - http://alenacpp.blogspot.ru/
Краткие описания библиотечных функций и контейнеров - http://ru.cppreference.com/w/
Блог Герба Саттера (на ангельском) - http://herbsutter.com/
Блог Скотта Мейерса (на ангельском) - http://scottmeyers.blogspot.ru/
Куда писать код:
Под шиндошс удобно использовать IDE Microsoft™ Visual Studio®. Базовую версию (2015 Community) можно бесплатно скачать, следуя инструкциям с этой страницы: https://www.visualstudio.com/ru-ru/products/free-developer-offers-vs.aspx. Чтобы начать писать код, нужно запустить Visual Studio, кликнуть "Файл - Создать - Проект - Пустой проект", после создания кликнуть слева правой кнопкой мыши по пункту "Файлы исходного кода", выбрать "Добавить - Создать элемент - Файл C++". Свои хэллоуворлды писать в этот файл, в дальнейшем можно добавить другие файлы и хедеры. Чтобы скомпилировать и запустить проект, нужно нажать "Сборка - Собрать решение", а затем "Отладка - Запуск без отладки".
Под *nix, как правило, уже предустановлен компилятор gcc (если нет, используй sudo aptitude install gcc), так что достаточно сохранить хэллоуворлд, набранный в текстовом редакторе, и выполнить g++ helloworld.cpp и ./a.out. Но удобнее установить какую-нибудь IDE, например, Code::Blocks (sudo aptitude install codeblocks) и работать в ней.
Можно также не устанавливать ничего, а запускать свои хэллоуворлды на http://ideone.com, выбрав в левом нижнем углу язык C++14.
Памятка:
Вопросу по синтаксису идут на хуй.
Лабы идут на хуй.
"Как мне сделать Х на чистых крестах без библиотек" идут на хуй.
Все идут на хуй.
Хейтер сосет члены на пару со своей мамашей.
Тег [code] работает через жабаскрипт-костыль: https://github.com/ololoepepe/MakabaCode
Предыдущий: >>518004 (OP)
https://arhivach.org/thread/94971/
https://arhivach.org/thread/94972/
https://arhivach.org/thread/99414/
В шапку добавлены новые драфты стандарта и информация об IDE.
Черновики стандарта на ангельском, которые в третьем пункте литературы. В них можно уточнить самые детали от безысходности, если больше нигде инфы не находишь.
#define kukareku
koko = a + kukareku b;
Я правильно понимаю что это способ вставить комментарий прямо посреди строки кода?
Ничего, игра закончена. С каждой написанной программой жызненное просранство для каждого отдельно взятого программистишки сжималось, http://gans-spb.livejournal.com/14901.html
Это говно какое-то, для комментария посреди строки можно юзать /комментарий/ же.
Да, я понял что это грубо говоря функция которая вызывается во время наступление некоторого события, это если объяснять словами.
Но вот как это все реализовано, у меня в голове не укладывается.
Всюду простые примеры кода типа такого(пикрелейтед)
Здесь просто вызывается функция ссылку на которую содержит указатель на функцию. Но в таком примере можно это можно заменить непосредственным вызовом функции, да и всё. Непонятно когда именно очень необходим этот самый колбэк.
И еще.
> которая вызывается во время наступление некоторого события
Неясно каким это магическим образом оно узнает что событие наступило.
Оно что запускает в потоке бесконечный цикл и все время проверят наступило ли событие(например нажатие мыши) или как? Как это физически происходит? Как оно узнает какую именно функцию ей нужно вызвать в том или ином случае?
>Под шиндошс удобно использовать
А почему в IDE про Eclipse ничего нету? Он неудобный? Там вроде даже рефакторинг какой-то из коробки и Git.
/мимонафаня
Профит в том, что ты можешь передать указатель на свою функцию куда-то, и там, имея этот указатель, и зная какие аргументы ей можно передавать, ее могут вызывать когда пожелают передавая в аргументы что-нибудь полезное.
Можно показать на примере куска кода регистрации обработчика событий окна шиндовс:
http://ideone.com/qzuf7T
>Передача ссылки на функцию
Сохранение указателя на функцию. & операция взятия адреса.
Мама,я все забыл
> и там, имея этот указатель, и зная какие аргументы ей можно передавать, .
Что-то еще более не понятнее стало.
Почему бы просто не вызвать функцию и передать те же аргументы.
> ее могут вызывать когда пожелают передавая в аргументы что-нибудь полезное
Как вызов то происходит, как система узнает что вот сейчас пора вызывать, а когда не надо?
спасибо анончик, пойду осилять
> Как вызов то происходит, как система узнает что вот сейчас пора вызывать, а когда не надо?
на очереди тредик висит и выковыривает из неё сообшченьицца
>Как вызов то происходит,
Ты передал указатель. С его помощью можно вызвать.
>, как система узнает что вот сейчас пора вызывать, а когда не надо?
Система сама решает, что пришло время о чем-то сообщить.
>Почему бы просто не вызвать функцию и передать те же аргументы.
Допустим, твое приложение хочет узнать где в данный момент находится указатель мыши на окне, которое ты создал.
Ты подписываешься на это сообщение - каждый раз как пользователь будет перемещать мышь, ОС совершит вызов твоей функции, и передаст в качестве аргумента координаты курсора.
Можно было бы опрашивать ОС о координатах раз в секунду, но это не так эффективно, поскольку курсор движется быстро по экрану, а пользователю твоего окна придется ждать когда твое приложение отошлет запрос и обработает положение мыши на экране. К тому же, ты будешь опрашивать ОС даже тогда, когда курсор находится за пределами твоего окна, а это неэффективно.
Ты не забывай еще, что хотя бывают указатели на методы, наподобие int (TvoyaMamka::*) (int), делать их коллбэками нельзя, тому що вызов методов не совместим ни с какими соглашениями о вызовах VC вон указатель на this передает вообще в регистре. И даже если метод статический, хотя по факту он везде будет нормально работать как коллбэк, если объявить его с _cdecl соглашением о вызовах, стандарт запрещает делать его коллбэком все равно, ибо нехуй. Используй глобальные функции, будь алтфаком.
Потому что я убежденный спермораб, очевидно же. Ну я указал ту, которой сам пользуюсь. Если кто-нибудь напишет про Eclipse, добавлю, конечно.
Самая банальная ситуация - у тебя есть какой-нибудь libcurl библиотека для работы с http, написана на pure c. Ты хочешь скачать этот тред при помощи своей программы. Поскольку pure c не может в std::string, он хочет писать код страницы в обычный char . Но буфер из ограниченного по размеру char передавать ему некошерно, ибо тред может быть большим и не влезть в него. Что делать? Ответ прост - ты передаешь в libcurl собственную функцию-обработчик потока символов, который генерится из кода страницы. Этот обработчик знает, куда пихать символы, он может юзать std::string, или уточнить размер буфера, или еще что-то придумать. Важно, что библиотека не может знать всего, поэтому она передает ответственность за схоронение твоему коллбэку, и дальше ее не ебет.
Если весь код твой, то, в принципе, можно обойтись без коллбэков. Если библиотека новая и на крестах, то тоже. Коллбэки же нужны именно для работы с чужим кодом на pure c, и вообще на других языках.
Я делал и такие:
setlocale(LC_ALL, "rus");\t
setlocale(LC_ALL, "russian");
Всё равно не работает как надо.
А что в консоли делать? Я в гугле читал про:
\tSetConsoleCP(1251);
\tSetConsoleOutputCP(1251);
Оно?
Но не совсем понял куда вставлять.
Я учебник страуструпа читаю, там есть далеко не все понятия, а некоторые немного размыты.
конспектируй, другой учебник глянь если какая-то тема не лезет в голову
Я подумал - можно ли как-то было укоротить решение? Но так, чтобы использовать только простые, стандартные функции, типа if или while? А так же тип стринг.
https://ideone.com/s591kt
Сама задача: Напишите программу, предлагающую пользователю ввести определенное коли-
чество 1-, 5-, 10-, 25-, 50-центовых и долларовых монет. Пользователь должен
по отдельности ввести количество монет каждого достоинства, например
“Сколько у вас одноцентовых монет?” Результат должен выглядеть следующим
образом.
У вас 23 одноцентовые монеты.
У вас 17 пятицентовых монет.
У вас 14 десятицентовых монет.
У вас 7 25-центовых монет.
У вас 3 50-центовые монеты.
Общая стоимость ваших монет равна 573 центам.
Усовершенствуйте программу: если у пользователя только одна монета, выве-
дите ответ в грамматически правильной форме. Например, “14 десятицентовых
монет” и “1 одноцентовая монета” (а не “1 одноцентовых монет”). Кроме того,
выведите результат в долларах и центах, т.е. 5,73 доллара, а не 573 цента
Я всё понял :3
>>525336
То есть система несет ответственность за то когда курсор дернется и когда это произойдет она передает ссылку на свою функцию как аргумент в мою функцию, которая выполняется в отдельном потоке?
>>525386
Это же другая ситуация, если нам просто нужно подставить свою реализацию в некоторую функцию.
Вот в вики написанно:
Об обратном вызове можно думать как о действии, передаваемом некоторой основной процедуре в качестве аргумента. И это действие может рассматриваться как:
1. подзадача и использоваться для обработки данных внутри этой процедуры;
2. «телефонная связь», используемая для того, чтобы «связываться» с тем, кто вызвал процедуру, при наступлении какого-то события (англ. callback дословно переводится как «звонок обратно»).
Меня же интересует второй случай.
>Я подумал - можно ли как-то было укоротить решение?
>Я функции еще не изучал.
>Вынеси поворяющийся код в функции
форман джипег.
Вот иди изучи и упростишь
Вместо своих россыпей суффиксов юзай функции же.
[code lang="cpp"]
enum class Case { SINGLE_SUBJ, MULTI_SUBJ, MULTI_GEN };
Case getCase (int number)
{
\tint res = number & 10;
\t
\tif (res == 1)
\t\treturn Case::SINGLE_SUBJ;
\telse if ((res > 1) && (res < 5))
\t\treturn Case::MULTI_SUBJ;
\telse
\t\treturn Case::MULTI_GEN;
}
std::string getCoinSuffix (int number)
{
\tCase res = getCase (number);
\t
\tif (res == Case::SINGLE_SUBJ)
\t\treturn "а";
\telse if (res == Case::MULTI_SUBJ)
\t\treturn "ы";
\telse
\t\treturn "";
}
std::string getNominalSuffix (int number)
{
\tCase res = getCase (number);
\t
\tif (res == Case::SINGLE_SUBJ)
\t\treturn "ая";
\telse if (res == Case::MULTI_SUBJ)
\t\treturn "ые";
\telse
\t\treturn "ых";
}
[/code]
Вместо своих россыпей суффиксов юзай функции же.
[code lang="cpp"]
enum class Case { SINGLE_SUBJ, MULTI_SUBJ, MULTI_GEN };
Case getCase (int number)
{
\tint res = number & 10;
\t
\tif (res == 1)
\t\treturn Case::SINGLE_SUBJ;
\telse if ((res > 1) && (res < 5))
\t\treturn Case::MULTI_SUBJ;
\telse
\t\treturn Case::MULTI_GEN;
}
std::string getCoinSuffix (int number)
{
\tCase res = getCase (number);
\t
\tif (res == Case::SINGLE_SUBJ)
\t\treturn "а";
\telse if (res == Case::MULTI_SUBJ)
\t\treturn "ы";
\telse
\t\treturn "";
}
std::string getNominalSuffix (int number)
{
\tCase res = getCase (number);
\t
\tif (res == Case::SINGLE_SUBJ)
\t\treturn "ая";
\telse if (res == Case::MULTI_SUBJ)
\t\treturn "ые";
\telse
\t\treturn "ых";
}
[/code]
На самом деле это концептуально одно и то же. Чужой код не знает как совершить действие и использует твой "обработчик". А что конкретно он делает - обрабатывает данные или обращается к тебе - это уже дело десятое.
>То есть система несет ответственность за то когда курсор дернется и когда это произойдет она передает ссылку на свою функцию как аргумент в мою функцию, которая выполняется в отдельном потоке?
То есть система вызывает метод в библиотеке (которая отвечает за работу с UI), когда ты дернул мышь:
void mouseMoved(int x, int y);
А внутри метода примерно так:
{for (int i=0; i++; i < subscribes.lenght) {
subscribes.DO_IT(x, y);
}}
где subscribes - массив структур, в которых хранятся указатели на все методы, которые должны выполниться на этом событии.
Это константа через дефайн. Нахуй не нужно имхо. Хотя некоторые любят.
>некоторые любят
С принятием C++11 эти некоторые оффициально считаются говноедами. Если раньше альтернативой было только const TvoyaMamka kukareku, которую хуевый компилятор уносил в рантайм даже если она использовалась только как константа времени компиляции, то теперь есть православный constexpr, для которого не сгенерируется никакого кода, и при этом не будет проблем с областью видимости и статическими проверками типов, которые есть у #define.
И где там константа?
Да я знаю что такое #define. Тут же ничего не присваивается, и получается что этот define можно писать где хочешь без влияния на программу.
Всё, теперь вроде наконец понял.
Есть метод в системе который заточен для того чтобы добавлять субскрайберов(указатели на функции) на метод изменения координат курсора - этот метод взаимодействует с этим списком субскрайберов и когда мышь изменяет координаты выполняет каждую из функций, которые были на него подписаны, а уже что там за реализация не имеет значения для этого метода.
Можно в дальнейшем заменить пустоту на #define kukareku c + же. Если написать a + kukareku + b, то для пустоты не сработает, а так можно добавить любое количество слагаемых.
Давай код. Телепаты в отпуске.
Макросы. Заменяются препроцессором на настоящий код. С помощью них можно творить нечитаемое говно, например написать ОС http://www0.us.ioccc.org/2004/gavin.c
что это за мусорка с твиттера?
А я нашел ответ в гугле по запросу setlocale getlocale (stackoverflow)
похуй же. Говно какое нибудь делает. А программистом любой аутист с гуманитарным образованием сможет стать при должном усердии и наличии интернета.
В начале каждого .h ставишь #pragma once, либо весь файл целиком в include guard. Константы у include guard не должны, блджад, повторяться, поэтому в подавляющем большинстве случаев удобнее не следить за этим, а использовать прагму кококок нестандарт символические ссылки.
Итак, в каком-то .h описан твой класс. Если ты, хуила, вынес из класса определение метода, но оставил его в том же .h файле, а не перенес в соответствующий .cpp, то подставляй свою сраку - это говно иногда будет компилироваться, а иногда нет.
Где-то в другом файле ты хочешь использовать свой класс TvoyaMamka. Если он используется только в сигнатуре функции, или ты используешь ссылку/указатель на него, но не обращаешься к его членам, то достаточно в начале файла написать class TvoyaMamka, то есть, просто объявить его. Никаких инклудов делать не надо, понял епту?
А вот если ты в новом файле наследуешься от него, хранишь или создаешь его экземпляры, обращаешься к членам - короче говоря, делаешь что-то, для чего нужно знать внутренности или размер этого класса, то ты должен в начале нового файла написать include.
Если у тебя возникла ситуация, когда файлы инклудят друг друга, то у меня для тебя плохие новости - ты долбоеб. Чтобы избавиться от циклического включения, необходимо выбрать из этих двух файлов "главный". В "главном" файле ты оставляешь инклуд "неглавного", а в "неглавном" приводишь код к такому виду, чтобы, блядь, инклуд "главного" не требовался - переходишь к указателям, выносишь все говно в .cpp и так далее. И потом вместо инклуда "главного" просто объявляешь его с помощью class.
Это далеко не все, но достаточно, чтобы ты не срал в штаны слишком уж часто.
А если у меня есть три файла A.h, B.h и C.h, причем А и B используют говно из С stdlib, например, а у класса в А есть член-экземпляр класса из В, то только А должен иметь инклуды оставшихся двух?
Чему в новом стандарте не откажутся от .h и всей сопутствующей ебли зависимостей? Почему не позаимствуют опыт других языков, например того же шарпа, в котором компиль справляется с генераций без всяких дополнительных заголовков?
Обратная совместимость потому что. А в плане опциональной поддержки вроде что-то замышлялось, но вряд ли это будет до C++20.
>>525776
Тогда в A включен B, а A и B могут при необходимости включать C, но по возможности следует этого избежать. Например, подключать stdlib транзитом это плохой тон. Нужны тебе куски stdlib в A - подключай их непосредственно в A. Это уменьшает зависимости же, вдруг ты потом решишь переделать C, чтобы он не использовал stdlib.
Ниочем вообще, на одних гардах далеко не уедешь, там даже порядок включения роль играет.
Если играет, то ты делаешь что-то не так. Используешь using в заголовочных файлах, циклические зависимости или еще какое говно.
У вас финализатор отклеился, уважаемый. Проследуйте в свой загон, будьте так любезны.
А Лафоре/Прата рассказывают только про ножовку, информация про ржавые трубы стыдливо спрятана в конце книги, а о том, что у человека есть анус, не упоминается вообще.
ну тем не менее это нужнее, и после них Стратоуструпа можно просто пролистать просмотреть листинги. У меня первой книгой был как раз Стратоуструп, и я наверное целый месяц осмысливал первую программку где калькулятор предлагает сделать.
>осмысливал первую программку где калькулятор предлагает сделать
не понял как на это реагировать, ты ебанутый(да)?
в основном тебе нужно было понять как работать с классами(начально) и разбивать программу на функции. ВСЕ, там даже задания не нужно делать, если ты все понял, потому что они настолько ебанутые, что иди нахуй просто.
Я никогда не пользовался, самому интересно. Но вроде это какая-то ебала, хороша только когда очень много гигантских хедеров, ибо из-за предкомпиляции накладываются ограничения.
Каков вопрос..
Как я понял - это символ перемещения переменной в? Или как?
Побитовый сдвиг числа влево и вправо. Например, у тебя есть char tvoya_mamka = 3, это 00000011 в двоичной системе. Ты пишешь char tvoya_babka = tvoya_mamka << 1, и бабка инициализируется значением 6, которое равно 00000110 в двоичной системе и получено сдвигом влево на один бит. Это можно использовать для умножения на степени двойки, ибо сдвиг иногда работает быстрее настоящего умножения.
Поскольку операции сдвига можно перегружать, а сдвиг с правым аргументом, не являющимся целым числом, смысла не имеет, было решено использовать их как операторы ввода и вывода, когда справа стоит что-то кроме целого числа.
Т.е. это операторы ввода и вывода? А как они точно описываются?
Я их использую для cin или cout, например:
cin >> var;
Т.е. ввожу что-то в вар.
cout << "test";
Ввожу что-то в команду вывода.
Так?
[code lang="cpp"]
std::ostream & operator<< (const TvoyaMamka & mamka)
{
//...
}
[/code]
Вот стандартная сигнатура перегруженного для класса TvoyaMamka оператора. Внутри оператора может быть что угодно, стандарт не обязывает делать именно ввод и вывод. Но обычно ты внутри каким-то образом форматируешь члены класса и вызываешь операторы вывода для них. Они, в свою очередь, выводят свои члены... Когда доходит до примитивных типов, например, double или int, вызываются стандартные функции <<, которые используют низкоуровневые функции вывода, зависящие от операционной системы.
Obosralsya, конечно же
[code lang="cpp"]
std::ostream & operator<< (std::ostream & stream, const TvoyaMamka & mamka)
{
//...
}
[/code]
>А Лафоре/Прата рассказывают только про ножовку
... для ньюфагов это очень плохо. Я это говорю фактически как ньюфаг. Надо наступить на максимальное количество граблей, чтобы потом действительно оценить разбиение на функции и прочие ножовки сто страниц спустя.
>>526210
>ну тем не менее это нужнее, и после них Стратоуструпа можно просто пролистать просмотреть листинги
... и совершенно не понять эволюцию его кода в том же калькуляторе. Т.е. ты сможешь его править, а переписать целиком вряд ли. А я переписывал, вот. Но самое главное, я понимаю, как он работает. Потому что перекусил анусом много ржавых труб.
>>526210
>и я наверное целый месяц осмысливал первую программку где калькулятор предлагает сделать
Если ты и про шестую, и про седьмую главу вместе, то ты просто гений. Я над шестой главой месяц ебался, кажется.
Возникала тут задачка на работе, которую численными методами решить надо было, с хуйлиардом входных данных. Я прикинул - а оно всё на мапы и векторы идеально ложилось. Ну я и набросал за пару дней няшную компактную програмку, отдебажил, запустил на реальных данных, и сел ждать результаты первой порции. И что-то как то МЕДЛЕННО. Запускаю профайлер - а оно 99% времени проводит в вызовах map.
В общем, я охуел и выкорчевал нахуй весь stl-код из проекта, после чего всё стало работать в стопицот раз быстрее. Ну вот как так? Или STL вообще не предназначена для высоконагруженных приложений?
>>526409
да про нее. Я тогда был школодроном с максимализмом и не пониманием как можно что то учить самому, и только после бейсик. Зашел в магазин и увидел этот монолит Стратоуструпа на полке, купил. Вроде бы все было легко до ебучего калькулятора, там я месяц сидел в отладчике и пошагово выполнял каждую команду, и где то спустя чуть более месяца на меня наконец то снизошло озарение, как же там блять все работает. Потом где то до середины досчитал и бросил, вернулся к ней только на втором курсе.
Ну что за задача-то? Вроде умный человек, решаешь какие-то задачи, а никакой конкретики нет. STL писали для быстрой работы с памятью в 90% стандартных ситуаций. Может, ты просто не умеешь её готовить -- я имею в виду выбрать правильный контейнер для твоих задач.
> выкорчевал нахуй весь stl-код из проекта, после чего всё стало работать в стопицот раз быстрее
На что заменил-то?
Предназначена. Но надо понимать, а не просто бездумно укладывать все на контейнеры. Если у тебя там были, блядь, поэлементные присваивания этих векторов, а вместо unordered_map с грамотной хэш-функцией обычная map с ключами из string, когда при каждом обращении к элементу идет O(log(n)) сравнений строк, то удивительно бы было, если бы оно быстро работало.
Сам указатель-параметр копируется, а то, на что он указывает - нет. Если присвоить что-то разыменованному pointer, то оно запишется по реальному адресу, навсегда. Если присвоить что-то самому pointer, то изменится только копия параметра внутри функции, после выполнения никакого эффекта не будет. Чтобы был эффект, нужно сделать
[code lang="cpp"]
int clss::a () { return &clssVar; }
//либо
void clss::a (int pointer) { pointer = &clssVar; }
[/code]
Второй вариант удобен, когда таких указателей несколько, чтобы не пихать их все в возвращаемое значение. Делать изменение по ссылке типа int & pointer некошерно, ибо можно выстрелить себе в ногу.
Но ведь так и есть.
Во втором случае будет ошибка "int* to int", pointer - указатель на int, а не просто Int.
&classVar это указатель на int
pointer это указатель на указатель на int, разыменованный pointer это указатель на int.
Как что все там нормально будет, присваиваются указатели на int.
//raw - указатель на QDataStream
raw->readRawData(temp, 4);
[/code]
Выдает ошибку
[code]
invalid type argument of unary '' (have 'int')
*raw->readRawData(temp, 4);
^
[/code]
Что я делаю не так?
Либо ты делаешь *raw.readRawData, либо raw->readRawData.
Почему многие рикаминдуют сначала выучить С, чтобы потом учить С++? Ведь это разные языки, и если тебе надо С++, то не проще сначала учить то что надо, а потом уже посмотреть его отличия от того же С?
Ну, я ещё понимаю советы для ньюфагов, которые ничего не понимают в программирование, но если взять уже человека который понимает что-то, нахуя ему С учить?
Поясните позязя.
Плюсобоги, помогите, гугл ничего не дал, да и скорее всего не даст, так как это что-то странное.
В чем суть:
Есть конструктор класса. Туда агрументом я передаю указатель на рендерер и хочу чтобы он сохранился в ren(private SDL_Renderer N_Texture::ren)
когда я создаю класс в main.cpp и даю в конструктор рендерер, то с ren НИЧЕГО НЕ ПРОИСХОДИТ
N_Texture::N_Texture(SDL_Renderer renderer)
{
\tTexture = NULL;
\twidth = 0;
\theight = 0;
\tren = renderer;
}
Но если я сначала создам экземпляр, а потом в коде программы вызову вот это:
void N_Texture::setRenderer(SDL_Renderer* renderer)
{
\tren = renderer;
}
то ren таки становится равен переданному значению. Конечно, можно для каждого экземпляра вызывать эту функцию, но это какой-то костыль
Что ему правильно советуют?
помогите, почему в конструкторе присваивание не происходит, а в функции происходит?
У меня конечно есть подозрение, что это из-за того что я объявляю экземпляр ВНЕ блоков(т.е. не в main или любой функции). Но как тогда вызывать конструкторы глобальных переменных?
А то у меня будет этих N_Texture просто гора и для каждой вызывать setRenderer...это просто стена кода будет. А если нету иного пути, можно это сделать как-то красиво?
Глобальные переменные определяются не всегда по порядку. Можешь создать вспомогательный класс, установить в нем renderer один раз, а потом просто вызывать метод N_Texture Factory::N_Texture() { return N_Texture(renderer); }, можешь запилить статичную переменную-член и установить её значение в main(), можешь запилить отдельный глобальный класс, а потом просто читать из него renderer каждый раз, когда понадобится.
Я бы не сказал что это разные языки. И в проекте написанном на C++ можно ебаться в сраку с битами и указателями. Просто если не хочешь быть тупой макакой которая просто складывает программу из непонятных ему кусков, лучше изучить более низкоуровневый язык, для того чтобы знать что стоит за всей этой хуйней.
Нихуя не разные. Ты можешь всю программу в одну строку написать, что в Си, что в C++. Это вопрос только стиля, куда ставить скобочку.
Что мне нужно на выходе? Массив амплитуд или мощностей (энергий) частот. Ради такой мелочи не хотелось бы возиться с подключением fftw.
А почему такое не подходит, например?
http://www.nayuki.io/page/how-to-implement-the-discrete-fourier-transform
>А почему такое не подходит, например?
Потому что я не умею гуглить? Вообще,
>We will use the Java programming language to illustrate.
Но я думаю, разберусь. Спасибо.
А по каким ключевым словам искал, что нашёл именно то, что нужно?
Блядь, там на Си есть. Сажи мне и говна.
1. тип элементов в виде строки
2. количество элементов
3. сами элементы подряд
Нужно засунуть элементы в вектор. Как это лучше сделать?
Algorithms in C++, Third Edition
Есть на рюском, но как обычно с переводом уровня гуглтранслейта.
Ну тогда самое время начать его учить, потому что это самый главный язык на погроммиста.
В душе неебу, не читаю корявые переводы уже давно, но до этого встречал всего пару раз не полное говно
Спасибо. Тогда её и почитаю. Но на русском. Там 2 книги вроде. Они же на разные темы и читать обе? Или это я не третье издание нашёл?
Там 5 частей разбили на две книги просто.
Погоди. Там про оптимизацию не написано.
int foo::count находится в глобал скоупе. В глобал скоупе нельзя создавать экземпляры класса.
Вектор union'ов, читаешь количество элементов, потом создаешь вектор с помощью указателей на первый и последний элемент.
Не, в цикле заполняешь вектор
Наоборот, это вредно, как правило. Потому что сериализовываться, по идее, должно только видимое извне состояние мамки. Внутри могут быть служебные данные, которые негоже использовать при выводе. Лучше сделать публичный метод у мамки, который вернет все,что необходимо напечатать.
Схуяли нельзя? Можно, просто порядок вызова конструкторов статических членов не определен. Гарантируется, что это произойдет до первого обращения емнип. Это и сюда >>526998 ответ, поведение будет unspecified а может даже и undefined, хуй знает, вот это было бы здорово прояснить, потому что неизвестно, в каком порядке они инициализируются.
Чтобы таких проблем не было надо пиать static int count=0 и не заморачиваться с отдельным объявлением и определением? Когда полезно писать так как на том пике?
Ну не знаю, какие-нибудь настройки хранить, когда одни параметры зависят от других. Конечно, можно и нужно юзать синглтон тогда, но общее направление понятно.
Нахуй пошел, говорю.
С инжектом и хелловорлд-длл всё получилось, но вот как из этой длл мне читать нужные значения и дёргать нужные ф-ии - я нихуя не понимаю.
Может кто-нибудь тут уже занимался подобным долбоебизмом?
> сериализовываться, по идее, должно только видимое извне состояние мамки
Схуяли? Если сериализовать только видимое до десериализовать нельзя будет, объект не полный же.
Речь не идет о том, чтобы сериализовать только публичные члены-данные. Просто за установку приватных данных должны отвечать методы самого класса, если это возможно.
[code lang="cpp"]
class TvoyaMamka
{
\tstd::size_t height_;
\tstd::size_t weight_;
\t
\tstd::short weight_in_tons_; //Чтобы избежать переполнения в ряде случаев
\t
\tvoid recalculateTons ()
\t{
\t\tweight_in_tons_ = weight / 1000;
\t}
\t
public:
\tstd::size_t getWeight () const
\t{
\t\treturn weight_;
\t}
\t
\tshort getWeightInTons () const
\t{
\t\treturn weight_in_tons_; //Используем кэшированное значение
\t}
\t
\tvoid setWeight (std::size_t input_weight)
\t{
\t\tweight_ = input_weight;
\t\trecalculateTons ();
\t}
\t
\t//...
};
[/code]
Если дать сериализующим функциям доступ к внутреннему состоянию объекта, то они легко могут сделать вес мамки в тоннах несоответствующим весу мамки в килограммах и нарушить инварианты. Чтобы этого не было, необходимо контролировать весь дружественный код, чтобы тот поддерживал инварианты, легко запутаться.
Речь не идет о том, чтобы сериализовать только публичные члены-данные. Просто за установку приватных данных должны отвечать методы самого класса, если это возможно.
[code lang="cpp"]
class TvoyaMamka
{
\tstd::size_t height_;
\tstd::size_t weight_;
\t
\tstd::short weight_in_tons_; //Чтобы избежать переполнения в ряде случаев
\t
\tvoid recalculateTons ()
\t{
\t\tweight_in_tons_ = weight / 1000;
\t}
\t
public:
\tstd::size_t getWeight () const
\t{
\t\treturn weight_;
\t}
\t
\tshort getWeightInTons () const
\t{
\t\treturn weight_in_tons_; //Используем кэшированное значение
\t}
\t
\tvoid setWeight (std::size_t input_weight)
\t{
\t\tweight_ = input_weight;
\t\trecalculateTons ();
\t}
\t
\t//...
};
[/code]
Если дать сериализующим функциям доступ к внутреннему состоянию объекта, то они легко могут сделать вес мамки в тоннах несоответствующим весу мамки в килограммах и нарушить инварианты. Чтобы этого не было, необходимо контролировать весь дружественный код, чтобы тот поддерживал инварианты, легко запутаться.
Вот у меня как у новичка вопрос:
Прочитав эти книг из оп поста, есть шанс реально стать программистом, и нормально зарабатывать?
Ну если будешь ебошить - будешь зарабатывать.
Книги из оппоста это не необходимое и не достаточное условие. У каждого свой путь же. Однако собранные в одном месте хорошие материалы всегда полезны, особенно для новичка, который не знает с чего начать.
Ну вот я новичок, тот самый кто поднял этот вопрос. Прочитал книгу "С++ за 21" купил Прата. Читается и вроде понимается. Прочту. А что дальше?
> А что дальше?
Джосаттиса можно, как раз 2ое издание пару лет назад вышло.
У Майерса есть советы по С++ аж 3 книжки.
Подрастешь - узнаешь
Не три, а четыре. Последняя очень годная, которая на английском в оппосте. Ее кстати обещали выпустить на русском в ближайшем месяце уже.
В общей куче они расположены.
Куча, она же heap — двусвязный список.
Эндрю Таненбаум, «Операционные системы» и «Архитектура компьютера».
Он не про кучу спрашивал, а про взаимное расположение частей объекта. На стеке то же самое будет.
Я тут выяснил, что первая цивилизация, написаная на голом Си без плюсов, имела разные форматы сохраненок со звуком и без. Соответственно, игру, начатую со звуком, без звука продолжить было невозможно.
Как вы думаете, откуда возникла такая поебота?
Си тред есть, вот он: https://2ch.pm/pr/res/518562.html
Хуй знает, если возможность сделать звук была изначально, то даже не знаю, зачем такое нужно было делать. Вполне возможно, что какая-нибудь бета-версия была без звука, а потом, когда добавили звук, сохраненки получили новый формат, который из-за криворукости кодеров был несовместим со старым. И решили оставить оба. Но это только моя догадка, я вообще про это в первый раз слышу и нагуглить ничего не смог.
Расскажите, господа, как грамотно работать со сценой и айтемами в Qt. У меня есть поле из квадратиков, по квадратикам ходят разные ребята. Кто должен думать, как ребятам ходить? Вроде по абстракции сам айтем должен решать, как ему выбирать путь. С другой стороны, он не знает о других айтемах ничего, а сцена знает. Получается, она должна давать ему маршрут?
Еще вопрос с обработкой столкновений. Вот два айтема столкнулись. Как они должны взаимодействовать? Нужно просто проходить по collidingItems и дергать у каждого функцию "обработать столкновение", передавая туда все нужные параметры типа, не знаю, шкварит ли айтем при соприкосновении? Или этим тоже должна заниматься сцена, самостоятельно дергая айтемы за нужные веревочки?
В общем, интересно понять, как с этой системой работать нормально, не делая тонны костылей.
Вообще, не очень понимаю, стоит ли опираться на стандартный айтем или все-таки сделать своего наследника (где будут прописаны всякие общие параметры, типа размера, который у всех айтемов одинаковый) и каждый раз кастовать к нему? Кастовать не хочется, но похоже Кьют рассчитан именно на такой педерастический подход. Я что-то не понимаю или реально так?
Нет, можешь в одном месте выделить, передать указатель куда-то и там удалить. А ещё лучше не удалять память вручную, а использовать умные указатели и/или всякие принципы владения.
кути
нет))0)))0)00
Играй в доту. Шанс получать такие деньги там выше, чем программировать.
//CLASS.H
namespace heh {
Class example {
//stuff
enum class dir_t {s_e, s_w, n_e, n_w};
void genStart();
//stuff
};
}
//CLASS.CPP
void example::genStart()
{
using s_e = dir_t::s_e; //ошибка
using s_e = typename dir_t::s_e //ошибка
}
[/code]
Хули не пашет?
а, ну еще и using namespace heh; в CLASS.CPP
У меня есть только бумажная, но сканера нет. Если нужно что-то конкретное из нее, то могу сфоткать, в принципе.
Допустим я хочу найти какая директива подключает функцию square.
В шапке треда есть ссылка на cppreference. Там ищешь по имени функции, и сверху будет название хедера, в котором она объявлена.
Значит нет такой функции в стандартных.
Если ты это у Страуструпа нашёл, то эту функцию тебе самому надо писать вообще-то, такой нет в стандартной библиотеке.
У них есть не только виртуальный деструктор но ещё и чисто виртуальный деструктор, они там размножаются делением, в общем.
Недавно анон задавал вопрос в 87-м ньюфаг-треде:
>10 минут в крестах - почему деструктор авторы одного SDK всегда выносят из хедера в сорсы, если он обычно совершенно пуст? То есть просто две фигурные скобки. Это просто для порядка или какая-то особенность крестов?
Короче, я гуглил, гуглил... и нашёл следующее:
1) Виртуальный деструктор, объяснение на русском: http://valera.asf.ru/cpp/scpp/cppd_constructor.htm (в конце главы: «Чтобы не допускать таких ситуаций необходимо использовать виртуальный деструктор...»)
2) Чисто виртуальный деструктор: http://alenacpp.blogspot.ru/2005/03/blog-post.html и http://rsdn.ru/forum/cpp/2532634.1 и http://stackoverflow.com/questions/1219607/why-do-we-need-a-pure-virtual-destructor-in-c — похоже, это самый подробный ответ на вопрос.
Чиста конкретный виртуальный деструктор заявлен в стандарте C++65536 и скоро будет уже!!!!
Более детально:
Открыто окно с игрой, программа получается цветные кадры из этого окна, для их последующей обработки.
Ну как бы да. Но нахуя ты сюда это принес, это же азы, лол. Чисто виртуальный деструктор может быть, почему бы и нет, но он в итоге должен быть определен, поэтому его определяют либо в каждом потомке через ::, либо вне объявления класса в .cpp файле (синтаксис не позволяет определять чисто виртуальную функцию на месте). Поэтому обычно так делают только когда других чисто виртуальных методов нет, а запретить создание объектов из-за абстрактности хочется.
Нееет, тут виртуальный деструктор может быть не замешан вообще. Суть такова: когда ты делаешь класс с pimpl-членами то есть в классе вместо членов указатели на них, это позволяет работать в хедере с неполными классами и уменьшить время компиляции, хэдеру не нужны полные типы для этих указателей и объявлений функций. А конструктору и деструктору - нужны, потому что они должны уметь создавать и удалять их например, когда через unique_ptr хранится это все, и конструктор инициализирует через make_unique. Конструктор обычно с телом и, понятное дело, выносится в .cpp. Но деструктор тоже выносится, несмотря на пустое тело, потому что он должен неявно вызывать deleter у unique_ptr'ов, а этот deleter, естественно, требует, чтобы объект, на который указывает unique_ptr, был полного типа. Поэтому пустой деструктор тоже выносится в .cpp, только потому что в .cpp подключаются все нужные хэдеры и тип становится полным, а не предварительно объявленным. Такие дела. Перепости это туда, где спрашивали, интересный вопрос же.
Конкретно я заметил что на 137 звука нет, на 138 есть. Такой как ПИК!
Очевидно, что символ с кодом 137 используется для проигрывания звука (предупреждения) в терминале.
Алсо, ты занимаешься хуйней. Сразу выкинь using namespace, "\n" замени на std::endl, а еще установи ОПЕРАЦИОННУЮ СИСТЕМУ, чтобы не было setlocale и _getch.
мимопроходил
>Сразу выкинь using namespace
Без него не работает.
>"\n" замени на std::endl
Поясни где про это узнать?
>а еще установи ОПЕРАЦИОННУЮ СИСТЕМУ, чтобы не было setlocale и _getch.
На какую? У меня 7. Есть еще ноут с линуксом, но как я понял - лучшая де для с++ это вижуал, а его на линуксе нет?
Поясни пожалуйста, я, просто, недавно начал читать учебник...
Б-же упаси. Я же говорю, это специфические случаи. Когда у тебя настоящий интерфейс без хуев и нестатических членов, то, как правило, кроме деструктора есть еще чисто виртуальные методы иначе пустой интерфейс нахуй не нужен, лол. И тогда тебе не надо делать деструктор чисто виртуальным, достаточно просто сделать виртуальным, с пустым телом и без выноса в .cpp.
>не работает
Либо пишешь using std::cout и т.п. для всего, что используешь из стандартной библиотеки, либо ничего не пишешь, а в местах использования пишешь std::cout вместо cout. Это классика, блядь.
>где узнать
В шапке есть ссылка на cppreference, там можно в поиске вбить любую сущность и посмотреть.
>на какую
Если у тебя спермерка + VS, то никаких setlocale быть не должно, окстись. Все итак работает если ты не ломал настройки, хуиная голова. getch тоже не нужен, IDE автоматически добавляет "нажмите любую клавишу", только запускать надо из самой IDE, а не кликом по бинарнику, блядь.
Не надо заменять '\n' на std::endl просто так. endl сбрасывает кеш вывода. В цикле может здорово просадить производительность.
Еще js забыл. Вместо него мы тоже можем. http://www.cocos2d-x.org/wiki/How_to_bind_C++_to_Javascript
Добра тебе, я не знал.
>Либо пишешь using std::cout и т.п. для всего, что используешь из стандартной библиотеки, либо ничего не пишешь, а в местах использования пишешь std::cout вместо cout. Это классика, блядь.
Где про это почитать? Я учусь по книге Страуструпа, там нет такого, сейчас удалил namespace std; Заметил что теперь пишет на vector без std:: что он не идентифицирован.
Поясните смысл этого, в книге не написано.
>Если у тебя спермерка + VS, то никаких setlocale быть не должно, окстись.
У меня русские буквы в терминале без локала отображались как крякозябры, сетлокал исправил всё.
>getch тоже не нужен, IDE автоматически добавляет "нажмите любую клавишу", только запускать надо из самой IDE, а не кликом по бинарнику, блядь.
У меня такой код без getch запускается и сразу закрывается:
int main()
{
std::vector<int> v;
v.push_back(2.7);
v.push_back(5.6);
v.push_back(7.9);
std::cout << v[1];
return 0;
}
>где почитать
В книге это есть в разделе про пространства имен.
>кракозябры
Когда кракозябры, нужно исправлять консоль, а не программу. Иначе гроб гроб кладбище непереносимость.
>закрывается
Ты что-то сломал. Там сверху в панели инструментов есть кнопка переключения режимов завершения, найди ее и нажми. Или Ctrl-Alt-Пробел.
>В книге это есть в разделе про пространства имен.
Пока не дошёл до туда, а в чём смысл выносить using namespace std; или сразу писать с ним? 1 вариант же проще.
>Когда кракозябры, нужно исправлять консоль, а не программу. Иначе гроб гроб кладбище непереносимость.
А что исправлять? Просто, я установил чистый ВС, в общем всё.
Хотя, я не уверен. Но в книге, в начале говорили создавать win32 приложение, а я создаю empty project. Может из-за этого?
>Ты что-то сломал. Там сверху в панели инструментов есть кнопка переключения режимов завершения, найди ее и нажми.
>Просто, я установил чистый ВС, в общем всё.
>Или Ctrl-Alt-Пробел.
Ничего не даёт.
>в чем смысл
Не захламляется глобальное пространство имен. Когда получишь первый конфликт имен из-за подключения двух библиотек, поймешь.
>что исправлять
chcp 1251 в консольке перед запуском, например. Это все гуглится легко, попробуй.
>чистый вс
У меня пару раз была такая хуйня, из-за неправильных настроек проекта. Создай новый проект в точности как описано в оппосте и скопируй код туда. Должно помочь.
>chcp 1251 в консольке перед запуском, например. Это все гуглится легко, попробуй.
1 пик - что выдёт.
>У меня пару раз была такая хуйня, из-за неправильных настроек проекта. Создай новый проект в точности как описано в оппосте и скопируй код туда. Должно помочь.
Сделал как в оппике, всё равно сразу пропадает.
Но у меня немного не так как там, я создаю файл *.срр как на 2 пике.
Всё правильно?
project ->Properties ->Configuration Properties -> Linker -> System, select Console (/SUBSYSTEM:CONSOLE) in “SubSystem” option
Сделал, ничего не изменилось.
Там была пустая строка до этого.
Кстати, я юзаю vs pre-release 2015 candidate, может баги?
Хотя, я как-то делал тоже самое на комьюнити 2012 года, было всё тоже самое.
Такого быть не может, что не изменилось. Я только что проверил. Попробуй еще раз, и сверху выбери не Active (debug), а all configurations. Потом перекомпилируй и запускай по ctrl-f5.
Нет, это не то. Просто открываешь файл блокнотом и сохраняешь туда же, выбрав кодировку.
Ну тогда используй наиболее универсальное решение. Внутри все текстовые строки делаешь юникодовскими, двухбайтовыми. wchar вместо char, wstring вместо string. Работа с ними абсолютно такая же как с обычными. И для потоков ввода-вывода таки делаешь setlocale с пустыми кавычками во втором параметре. Тогда под любой системой будет установлена ее дефолтная локаль и не будет проблем, если у китайского юзера не окажется русского языка, но при этом твои сообщения останутся корректными, потому что юникод.
Ставить так: setlocale(LC_ALL, "");
Такой вопрос, а если у меня вывод идёт не в переменной, а в ковычках?
Фигня какая-то с wstring, пишет такую ошибку, что не может перевести в char*.
Если удалить w, то нормально переводит, но с крякозябрами.
У всех мест с кавычками так сделать надо, ну очевидно же, анон! Когда ты пишешь "твоя мамка", компилятор воспринимает это как строковый литерал const char []. Отсюда ошибки. Пиши L"...", и все будет ништяк.
Т.е. L ставить даже в определении?
Например, std::string test = L"тест"; ? Даже в случае когда я на русском не пишу?
У меня с wstring одни ошибки, ставил даже L перед ним, всё равно.
>ошибки
Ты опять не перед всеми поставил L, лол. Еще раз: перед ВСЕМИ строками в кавычках поставь L. L"\t", L"Median temperature: ", всеми, блядь. Хватит добавлять по одному L каждый раз и жаловаться на ошибки.
>даже в определении
Везде. Видишь открывающую кавычку - ставишь L.
>одни ошибки
Это из-за смешивания char и wchar. Если кратко, то в обычной вычислительной консольной программе не должно быть русского языка вообще. char это обычно байт, следовательно, поддержка русского языка для char строк оборачивается еблей с кодировками и ужасной хрупкостью с невозможностью ничего запустить на другой пекарне. Поэтому я советую в хэллоуворлдах, которые не предназначены специально для изучения локалей, использовать латиницу и не париться.
В серьезных программах, где требуется именно ввод-вывод на пользовательском языке, выделяют обычно отдельный модуль для этого. В нем используются только wstring, wchar и L"...", без смешивания с обычными строками. Это дает требуемую переносимость и надежность, но довольно громоздко, поэтому по возможности ничего просто не локализуют, опять же.
wcout вместо cout же. Я в тебя верю, анон, еще немного и ты скомпилируешь его. Как же я проигрываю.
Вот такое, например. Твой змей одноглазый может так?
http://nz2wy3dsn52xizi.mv2s433sm4.cmle.ru/mirrors/analogliterals/analogliterals.xhtml
Хм... Вроде, получилось. Спасибо.
Но я не тролль, как тут написал кто-то:>>528573
Просто, я недавно начал учить язык, сейчас изучаю векторы по Страуструпу.
Ты тоже программируешь на С++, так?
Кстати, подскажи еще 2 вопроса:
1. Как сделать так, чтобы >>528521 это ставилось во все проекты автоматически? Я сейчас создал новый, там была эта строка пустая.
2. Можно ли как-то в ВС переключаться между проектами? А то я пока делаю так: закрываю текущий, открываю новый.
Да не за что. Обращайся, тред для того и висит.
>автоматически
Оно и должно автоматически, по идее. Возможно, это из-за того, что не релизная версия. На релизных 2010, 2013, 2015 ставится всегда.
>переключаться
Неа, вроде никак. Но можно открыть вторую копию студии, будет два окна с разными проектами.
Это анонимайзер, оно залочено в рассеюшке. Власти скрывают существование пользовательских литералов!!!111
Многомерные литералы, можно делать программу с картинками, которые сами компилируются в код.
Ты вместо Rectangle <int> {5, 4}; пишешь
[code lang="cpp"]
o-----------o
! !
! !
! !
! !
o-----------o
[/code]
Разметка проебалась, ну и похуй.
Учи сразу C++, а то будешь писать на C++ в стиле C.
http://cmcmsu.no-ip.info/2course/
Читаешь все за 4 семестр, что относится к C++. Делаешь практические задания оттуда же. В качестве справки используешь талмуд и книги из оппоста. Когда сделаешь - считай, что начало пройдено, и можно уже читать Мейерса и остальное в оппосте.
Нихуя они ебашат.
Ты не понял вопрос, по-моему. Я спросил, как поменьше читать, а не как побольше читать.
Там получается около десяти презентаций, они совсем маленькие. И вот эта книжка, чуть больше ста страниц: http://cmcmsu.no-ip.info/download/cpp.base.oop.pdf Если ты это не можешь осилить, то я даже не знаю.
Там он расписывает, мол так и так, когда нужно использовать, когда необязательно.
И появился вопрос, а есть ли разница в скорости передачи аргумента в функцию между:
- Ссылкой и обычным копированием значения в функцию (при условии, что передается обычное число, а не какой-то массив или вектор etc.)
- Ссылкой и константной ссылкой.
Надеюсь, что не слишком тупые вопросы написал.
1. Ссылка преобразуется в указатель, указатель по размеру обычно как int. Если что-то меньше int, по значению быстрее все равно не факт что будет, выравнивание, все дела.
2. Одинаково, константность ни во что не компилируется.
> 2. Одинаково, константность ни во что не компилируется.
Не всегда. Компилятор может положить константу в read-only memory для ускорения доступа.
Вообще, хороший тон - использовать константные ссылки как можно чаще. Неконстантная ссылка = выходной параметр.
Всё, извини, не разобрался. Про Qt что-нибудь скажешь? Может что-то подобное есть?
Ты как это на такой сайт набрел? Много в рашке такого, лол? Ну, выложенных материалов с годных вузовских семинаров, лекций...? Кроме очевидного интуита?
Ты путаешь константы и константные ссылки. Константность ссылки не значит ничего абсолютно в ассемблерном коде, объект уже создан в другом месте, константный или нет - все равно.
Я набрел на этот сайт главным образом потому что я учусь на там и в свое сдавал экзамен по этому курсу точнее, получил автомат, но энивей.
За куте не скажу, мне он не очень нравится, и я не особо интересовался. У них вроде неплохая документация, но она на ангельском, конечно же.
Слишком громоздкий, можно то же самое делать без ебли на специализированных библиотеках.
Тяжело в дрочении, легко в бою.
Это как? Разве он не наоборот объединяет тонну говн - звук, регэкспы, многопоточность, гуй в одно?
Именно из-за этого там обязательно окажется что-то, что тебе не понравится, как реализовано. Гораздо приятнее искать библиотеки по мере необходимости, не понравилась - заменил на аналогичную, и устанавливать кучу говна не надо.
>и устанавливать кучу говна не надо
Ага, и вместо этого надо устанавливать еще больше говна и ебаться каждый раз.
Если еще дадите каких-нибудь советов, кроме лекций и книжки выше, буду благодарен. Ну, интенсивы типа. Скажите таки что-нибудь насчет бауманского Специалиста. Говно?
Да, ты прав, перепутал
У меня тоже "[code lang="cpp"]" видно
Просто они каким-то сторонним скриптом пользуются, когда это пишут. Я так понял что Абу не будет допиливать. А тот скрипт обновляется каким-то антоном, подгружает иконки с его сайта, и прочими странными вещами занимается.
В стандарте это не описано. Каждый компилятор будет их располагать по-своему. А для отладочной версии он вообще все подряд будет обрамлять опкодами прерывания, чтоб при случае выхода за пределы сразу в отладчик IDE вылетать.
Ищи статью в RSDN magazine про vtable и прочие страшные штуки.
За много лет общая идея не изменилась, разве что компиляторы стали лучше оптимизировать все это и избавляться от лишних промежуточных сущностей.
Я не видел интенсивов по крестам и, если честно, сомневаюсь, что они существуют. Понимаешь, анон, кресты это сложный и объемный язык, его надо осваивать вдумчиво и серьезно. Все рассказы про 21 день это полный бред, так только питон можно выучить. Точнее, ты можешь за 21 день выучить синтаксис и простейшие примеры порешать, и такие курсы, несомненно, есть, но это ничем не лучше прочтения какого-нибудь самоучителя для ньюфагов, да чтоб потоньше. Но духу языка ты так не научишься, однозначно. Так что лучше сначала набрать базовые знания, а вот уже потом есть и годные книжки про детали, и мастер-классы тот же Мейерс ведет на ангельском, разумеется, по вполне доступным ценам.
Есть же ссылка в шапке на него, ставишь Greasemonkey/Tampermonkey, качаешь скрипт и вуаля.
У меня обычный тхтшник, в который пишу хитрые детали, good practices, вопросы, на которые сам пытаюсь ответить, ну ты понел. И периодически перечитываю его. Но самое главное это писать код, только во время написания живого кода такой тхтшник быстро наполняется. Переписывать из книжки - это совсем не то.
Про макрооптимизации алгоритмов асимптотика и вот это все читай Кормена "Алгоритмы", отличная классическая книга. Она не про кресты, а вообще.
Про микрооптимизации сэкономить на сложении и всякая хуйня читай "Effective STL" Мейерса, ибо детали на крестах обычно реализуются STL, а у Мейерса там больше половины про оптимизации. Еще наверни Джоссатиса про STL, там тоже много про ее оптимальное использование, но уровень выше, чем Мейерс.
Наконец, есть неплохие книжки - "Жемчужины программирования" Бентли и "Алгоритмические трюки для программистов" Уоррена мл. Там тоже не только про кресты, но описаны всякие мелкие оптимизации.
Есть проблема: мне по роду деятельности приходится вебмакакить и там все паттерны проектирования, гуд практисес и подобное нахуй не нужны, там это только время отнимает и непонимание вызывает, ну и вообще там плюсами даже не пахнет. Плюсы для меня - хобби, хочу когда-нибудь игрушки писать. Соответственно, я могу забросить написание кода резко и хоть на полгода из-за какого-нибудь аврала, потом захотеть вернуться и быстро "вспомнить всё".
Спасибо.
Забей на сраные коллбэки, они мало того что не интуитивны, так и еще нетипобезопасны. Посмотри в сторону Qt с сигналами-слотами, они интуитивно понятны и типобезопасны.
Игоры, например. Напиши с нуля какой-нибудь рогалик, отличная практика для начинающего, и в графику не нужно уметь.
Ты заебал, как ты, блядь, прикрутишь куте/буст/tvoa_mamka_anal_interface_lib_3000, если речь идет про работу с сишным легаси-кодом? Он не понимает ничего, кроме коллбэков, поэтому классику надо знать и точка. Куте он захотел прикрутить, вообще пушка.
В том, что
[code lang="cpp"]
for (auto it = std::begin (mamkas); it != std::end (mamkas); ++it)
{
if (it->isGoodMamka ())
good_mamkas.push_back (*it);
}
//превращается в
std::copy_if (std::begin (mamkas), std::end (mamkas), std::back_inserter (good_mamkas), [] (const TvoyaMamka & momma) { return momma.isGoodMamka ();});
Впервые столкнулся с COM, VARIANT, BSTR и тд. Выручай анон.
Есть примерно такой код (не совсем такой конечно, оставил суть вопроса).
[code]
void f1(IDispatch object, VARIANT value) {
IDispatchEx dispEx;
object->QueryInterface(IID_IDispatchEx, (void)&dispEx);
dispEx->GetDispID(L"name", fdexNameEnsure, &dispId);
DISPID namedArgs[] = { DISPID_PROPERTYPUT };
DISPPARAMS params = { value, namedArgs, 1, 1 };
dispEx->InvokeEx(dispId, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, ¶ms, NULL, NULL, NULL); // Что тут происходит? Как оно копируется?
}
void f2(IDispatch object) {
// Создаем VARIANT с BSTR
_bstr_t nameBstr("helloworld");
VARIANT value;
VariantInit(&value);
value.vt = VT_BSTR;
value.bstrVal = nameBstr.GetBSTR();
f1(object, &value); // добавляем наш VARIANT в object
// вот тут _bstr_t освободит память, выделенную для BSTR, насколько я понимаю
}
// Итак, у нас есть IDispatch *object;
// Вызываем функцию f2()
f2(object);
// ...
// А вот тут мы что-то делаем с object, в частности используем то, что добавили с DISPATCH_PROPERTYPUT
[/code]
Внимание, вопрос. Что происходит с VARIANT value в строчке, которую я отметил соответствующим вопросом? Если оно куда-то копируется, то копируется ли BSTR вместе с ним? В общем, не будет ли проблем в использовании объекта object после того, как функция f2() завершится? Не будет ли у него невалидный BSTR, который уже свободился?
Впервые столкнулся с COM, VARIANT, BSTR и тд. Выручай анон.
Есть примерно такой код (не совсем такой конечно, оставил суть вопроса).
[code]
void f1(IDispatch object, VARIANT value) {
IDispatchEx dispEx;
object->QueryInterface(IID_IDispatchEx, (void)&dispEx);
dispEx->GetDispID(L"name", fdexNameEnsure, &dispId);
DISPID namedArgs[] = { DISPID_PROPERTYPUT };
DISPPARAMS params = { value, namedArgs, 1, 1 };
dispEx->InvokeEx(dispId, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, ¶ms, NULL, NULL, NULL); // Что тут происходит? Как оно копируется?
}
void f2(IDispatch object) {
// Создаем VARIANT с BSTR
_bstr_t nameBstr("helloworld");
VARIANT value;
VariantInit(&value);
value.vt = VT_BSTR;
value.bstrVal = nameBstr.GetBSTR();
f1(object, &value); // добавляем наш VARIANT в object
// вот тут _bstr_t освободит память, выделенную для BSTR, насколько я понимаю
}
// Итак, у нас есть IDispatch *object;
// Вызываем функцию f2()
f2(object);
// ...
// А вот тут мы что-то делаем с object, в частности используем то, что добавили с DISPATCH_PROPERTYPUT
[/code]
Внимание, вопрос. Что происходит с VARIANT value в строчке, которую я отметил соответствующим вопросом? Если оно куда-то копируется, то копируется ли BSTR вместе с ним? В общем, не будет ли проблем в использовании объекта object после того, как функция f2() завершится? Не будет ли у него невалидный BSTR, который уже свободился?
[code]DISPID dispId;[/code] в начале f1() случайно удалил
Парни у меня возник вопрос. Может ли изменить значение приватной переменной класса функция которая передана по указателю методу класса как аргумент?
Хотя вроде вник. Она же не в области видимости класса. Нет скорее всего. Сейчас проверю.
ну я вот читаю Прату. И там было задание нужно сделать что бы в классе можно было изменять переменную с помощью функции(ну либо уменьшать либо вычитать).
У меня возникло в голове несколько решений.
1) Хуярим две функции одна увеличивает другая уменьшает значение.
2) Создаем перечисление в Enume если функции значение перечисления где она внутри функции с помощью if'ов определяет что надо сделать.
3) Создаем две функции одна увеличивает, а другая уменьшает. Внутри класса один метод который принимает ссылку на одну из этих функции, и передает этой функции указатель на закрытую переменную.
Само собой вроде как второй метод оптимальный во всяком случае с моей нубо колакольник, но третий вызвал любопытство пытаюсь реализовать и не получается. Хотя возможно потому что я криворукий.
ах блять можно же одну функцию создать внутри класса где все будет складываться, но передавать туда либо положительные либо отрицательные значения.
Тупонул. Если метод имеет доступ к значению приватного члена класса, то он может дать его как аргумент другой функции.
Почему в 13ой строке нельзя написать cout<<g(p)<<'\n'<<p<<'\n';?
Почему в 20ой строке нельзя написать A a.h(k);?
>>529299
И без подобной вот блевотины "h(int(*g)(int&))" в реальных задачах?
просто ты неосилятор. В этом нет ничего плохого, просто иди присаживайся у параши к тем ребятам с в футболочках Java и C#.
Не нрав синтаксис, привязка к майкрософту и вообще подход.
>>529328
Думал об этом, но ну его нахер, не доставляет ни то, ни другое
>>529331
Ну да, в отсутствии контроля длины массива и введении регулярных выражений спустя 30 лет развития языка - это тоже ничего плохого, но это колхоз, а я бы не хотел быть колхозником с красными глазами, я хотел бы взять достоинства языка и забыть про недостатки.
Чего вы злые какие?
> не нрав привязка к майкрософту
> хотел бы пилить игрушки
Давай заново. Чего хочешь, что не устраивает и чего не хватает. Вместе решим что с этим можно сделать. Но язык мы вряд ли будем переделывать.
Игры можно пилить и мультиплатформенные, и на консоли, и на носимые устройства.
Это не привязка к инструментарию, разработанному майкрософтом, меняемому по желанию левой пятки майкрософта и в соответствии с представлениями этой компании о прекрасном. Нахер такое. Нахер шарп, нахер .Net, нахер Visual Studio, нахер их понимание красоты в отношении библиотеки классов. Даже ява приятнее.
Мне нравится С++, он красивый, лаконичный в целом, а особенно красив Qt. Но вот type_cast, указатели, все эти сочетания круглых скобок с угловыми, вот это вот все уже ни разу не красиво и не доставляет. Зачем оно мне? Могу я обойтись без этого? Если хочу производительно, лаконично, читабельно, удобно для написания. Стилистически мне вполне нравится lua, php, python, больше, чем ява или шарп. В первой смущает комбайновость, перегруженность, зависимость от виртуальной машины, во втором сама суть и привязка к майкрософту. Но в любом случае, python или php я к UE4 не подключу и нужно привыкать к крестам, потому что они везде и все библиотеки под кресты. Вопрос - можно ли это сделать, не одев свитер и не испортив зрение.
>Вопрос - можно ли это сделать, не одев свитер и не испортив зрение.
Скорее всего нет. Указатели точно нужны.
Не совсем понял. Ты хочешь писать кроссплатформенные игры на С++, но тебе не нравиться его синтаксис? Ну синтаксис ты точно не поменяешь. Можешь попытаться библиотек или фреймворков подключить, но я не знаю каких.
Придется заниматься и вот этим всем, если понадобится писать аллокаторы, контейнеры и прочее своё под задачу. Другое дело, что можно таки писать читаемый код с помощью typedef, alias и auto, маленькими функциями. Поверь бро, это не сложно и есть даже проги которые парсят все эти многозвездочные объявления в человеком читаемый вид лол
спасибо большое, так это считается что функция из вне может изменить приватный член класса? или типа норм?
совсем поехавший там есть куча других структур которые заменяют массивы и позволяют контролировать длину строки. Просто ты неосилятор.
Она сама не может, это метод класса может вызвать эту функцию чтобы изменить свой член. Создатель класса в данном случае представляет такое API.
f может изменять т.к. медот класса передают её ссылку на приватный член, а v не может изменять, а только читать т.к. медот передаёт ей только значение приватного члена класса. И никакие указатели на функцию не нужны.
Richard Bornat, «Understanding and Writing Compilers»
Terence Parr, «Language Implementation Patterns»
Нет, не может. Видимость это уровень компиляции, зависит только от места, где функцию описана. Компилятор не знает, что ты ее потом передашь в объект класса, и видимость не дает. Наоборот, если создать в методе класса лямбду и потом отдать ее другому классу, видимость останется, потому что объявлена была внутри первого класса.
1. Можно.
2. Нельзя, но если бы у тебя был только h(k) или только g(), короче, только один метод надо вызвать, то можно A ().h(k);
Просто ты начал читать какой-то хуевый учебник с начала, посмотри там в конце, про STL и C++11 должно быть. Никакого байтоебства, все на высшем уровне.
Просто, я читал что С и С++ одинаковы в плане кода, просто, у ++ есть доп. фичи.
И, теоретически, зная С++ я знаю С - так ли это?
Правда ли что С быстрее С++?
>Try these examples:
>int ((foo)(void ))[3]
>declare bar as volatile pointer to array 64 of const int cast foo into block(int, long long) returning double
Зачем? Как так получилось, что все остальные языки обходятся без этого поноса, а С++ - нет?
>И, теоретически, зная С++ я знаю С - так ли это?
За неделю переучишься.
>Правда ли что С быстрее С++?
Да.
cout << a << b << c эквивалентно
operator<< (operator<< (operator<< (cout, a), b), c). Порядок вычисления аргументов не определен, поэтому у тебя компилятор считывает p до выполнения g(p).
Если написать такую, то будет так же быстро, как в C. Но так никто не делает, потому что если ты хочешь писать как на C, то ты можешь написать на C, лол.
>все остальные языки обходятся без этого поноса
Без функции без аргументов, возвращающей массив из трех целых?
Такое только в дремучем posix-совместимом коде ты найдешь. Почему вы так любите обвинять крестогоспод в грехах, которые сами же выдумали?
В cout порядок выполнения не определён? Когда придётся использовать несколько cout чтобы такого не было? Можно как-то компилятору сказать делать всё по порядку?
Очень зависит от того, какие возможности C++ ты используешь. Если учитывать оптимизации компилятора, то, думаю, 0-20%.
Если программы одинаковые, то и работают одинаково быстро.
Не порядок не определен. Порядок вывода определен, но он может сначала, например, вычислить и запомнить самый правый аргумент, потом вывести остальные, а затем уже его. Можно добавить точек следования, самое простое - разбить на несколько операторов, как у тебя сделано, или с помощью запятой.
cout << g(p) << "/n", cout << p << "/n";
Или cout << (g(p), p) << "/n"; если тебе достаточно вывести только само p.
Без >int ((foo)(void ))[3]
блеовотины, там это будет как угодно, "int foo[3]", к примеру, не не вот эта чертовщина тип((имя(тип))[размер]. Что за пиздарики под двойными скобками, зачем этот пиздец? И зачем выносить квадратные скобки наружу, раз уж решили всю хуйню внутрь запихать?
Извини, я тупой и не понял нихуя.
>cout << g(p) << "/n", cout << p << "/n";
Тоже самое только вместо ; стоит ,
>cout << (g(p), p) << "/n";
Это не то выводит.
Ладно. Спасибо. На нескольких cout остановлюсь.
У тебя кстати слэш не в ту сторону.
Затем, что ты видишь int (...) [3] и понимаешь, что после применения такой функции у тебя будет массив интов. Это удобно, потому что по объявлению функции можно понять, во что она превратит аргументы при вызове, а разбираться в ее работе не всегда хочется. Читать такие объявления тоже весьма легко и без всяких typedef, есть четкий алогритм, как читать изнутри наружу. "Найти имя сущности, читать вправо до скобки, читать влево до скобки, повторять, пока не кончится выражение".
То же самое, лол, но формально это одно выражение, а не два. Это критично, если ты пихаешь в какую-нибудь функцию это.
>есть четкий алогритм, как читать изнутри наружу. "Найти имя сущности, читать вправо до скобки, читать влево до скобки, повторять, пока не кончится выражение".
Точно вспомнил. Это тебе.
>>529324
http://habrahabr.ru/post/116255/
Я, вроде, написал правильно, но результат не такой, какой я ожидал.
> Зачем? Как так получилось, что все остальные языки обходятся без этого поноса
До 8 джавы джависты, когда им требовалось передать функцию, передавали объект анонимного класса, реализующего определённый интерфейс.
Теперь они могут передавать лямбды и функции.
Поясните, мне 1 кажется что первые скобки во 2 цитате какие-то кривые? В частности 2 скобка.
Спасибо, но что насчет внутренностей-то скажешь? (void ) - вот это и вообще двойные скобки нахуя? Почему не int foo [3]?
Что будет, если я захочу объявить массив массивов каких-нибудь объектов некоторого класса? Вообще же нечитаемый пиздец.
>Почему не int foo [3]?
Потому что там не массив, а функция, возвращающая массив. Что, кстати, нельзя.
Ааааа, вон оно как получается...блядь, ну реально как-то не слишком понятно. Почему тогда не написать было int [3] function foo (void)
или просто int [3] foo ()?
Зачем опять эти скобки, разделения...ебанись.
Если бы функция могла вернуть массив, то было бы int foo()[3], да. А так приходится скобками звездочку отделять, чтоб компилятор не решил, что возвращается массив указателей.
Вот код: https://bpaste.net/show/be3d38894653
Собственно, я не знаю в чём дело, проверил 2 раза. Суть в том, что если я введу слово из спамлиста - у меня qwe и test, то они должны заменится на BLEEP, но они заменяются не корректно.
Суть кода проверки на пике.
Ты понимаешь, что у тебя выделенный кусок кода перезаписывает check во время каждой итерации цикла? В итоге имеет значение только чекнулось ли оно при последней j или нет.
А еще рекомендую использовать ключи компилятора -Wall -Wextra -pedantic и когда компилятор тебя ткнет в то, что ты используешь int'ы вместо size_t как индекс у векторов, исправить это.
Так я так и хотел.
У меня так: ЧЕК=0, берётся 1 элемент 1 массива и сравнивается со всеми элементами 2 массива.
Если во 2 массиве есть слова из 1 массива, то ЧЕК=1.
Если ЧЕК=1, то вывод такой.
ЧЕК=0.
Потом берётся 2 элемент 1 массива...
>>529596
Не понял, это одна из начальных задач по страуструпу, если что. Я пока не очень в крестах разбираюсь.
>>529598
Выделенный желтым отрывок кода по сути эквивалентен следующему:
http://pastebin.com/ZHF5LBd2
Потому что в твоем внутреннем цикле все итерации кроме последней ни на что не влияют, потому что в последней check все равно затрется новым значением.
Хм... Точно. Спасибо.
>2 - удаляет одинаковые слова.
Что он делает я вижу, я смысла в нем не вижу. Впрочем это скорее всего просто я дебил.
Судя по тому что я не решил, а ты решил, ты - не дебил.
Хуй знает, но он работает со всеми, для которых это будет осмысленно. С %, возможно, не будет, с логическими тоже. С побитовыми и сдвигами должен.
Как вы не отвлекаетесь от программирования? А то мне тяжело сосредоточится на програмировании.
Ну я, например, не работаю на фуллтайм, если ты об этом. Но свои проекты пилю, и по учебе довольно часто надо, ну и вообще интересно же.
Работаю, senior c++ engineer. Дома для себя постоянно пишу что-нибудь.
Отношусь к программированию как к искусству, творчеству. Язык - инструмент, кисти и краски, например.
Быстро вхожу "в поток", могу всю ночь, например, решать какую-нибудь задачу, а утром пойти на работу.
Пару лет назад на хабре была статья про химеру программистов - создание и поддержка целой вселенной в голове в процессе работы.
Меняй отношение к делу. Если процесс нравится, то он затягивает.
Ошибка\t1\terror LNK2001: неразрешенный внешний символ
my.h
[code lang="c++"]
extern int foo;
void print_foo();
void print(int);
[/code]
my.cpp
[code lang="c++"]
#include <std_lib_facilities.h>
#include "my.h"
void print_foo()
{
\tcout << "FOO: " << foo;
}
void print(int i)
{
\tcout << "I: " << i;
}
[/code]
use.cpp
[code lang="c++"]
#include "my.h"
int main()
{
\tfoo = 7;
\tprint_foo();
\tprint(99);
}
[/code]
Ошибка\t1\terror LNK2001: неразрешенный внешний символ
my.h
[code lang="c++"]
extern int foo;
void print_foo();
void print(int);
[/code]
my.cpp
[code lang="c++"]
#include <std_lib_facilities.h>
#include "my.h"
void print_foo()
{
\tcout << "FOO: " << foo;
}
void print(int i)
{
\tcout << "I: " << i;
}
[/code]
use.cpp
[code lang="c++"]
#include "my.h"
int main()
{
\tfoo = 7;
\tprint_foo();
\tprint(99);
}
[/code]
int foo не определена же. Та, что в main, будет локальной и никак не связанной с объявленной через extern.
В срр. В хедере должны быть только инклюды родительского класса (если есть) и библиотек. Это в идеале, естественно. Реальная жизнь может вносить свои коррективы, но нужно стараться как можно меньше инклюдить в хедеры - в основном чтобы было меньше перекомпилировать после изменений, и чтобы не пердолится с цикличными инклюдами.
И там и там могут быть.
Антоны тебя немного троллят. Одна из основных идей, заключенных в плюсах, это как раз демонтаж красноглазия.
Точнее, как -- в плюсах можно писать си-стайл с вот этой вот страшной ебенью, и это даже бывает нужно, но это как правило задачи, связанные с тонкой оптимизацией или низким уровнем (написание драйверов, например).
Если же ты не хочешь с этим ебаться, то для тебя в C++ есть стандартные контейнеры и умные указатели. И их вполне хватает чтобы делать все, что угодно. Я более чем одинарные указатели, например, использую крайне редко, и то только для того, чтобы запихнуть их в контейнер.
Пример - 1m.
Просто, так в задаче написано, я думал, но не придумал как это сделать:
Там, просто, надо будет потом операции с числами делать. У меня, в целом, есть идея через пробел писать текст. Вот текст задачи:
>Добавьте к каждому введенному числу типа double единицу измерения; иначе
говоря, введите значения, такие как 10cm , 2.5in , 5ft или 3.33m .
Переводи всё в одну единицу измерения. Время в секунды,расстояние в метры и т.д. Храни значение в дабле.
Обосрался, возвращает тоже long double, конечно же.
Не знаю, я пока изучил простейшие функции: if, for, while.
Long double 1 раз слышу.
Ладно, сейчас подумаю как сделать...
А как им в этом случае пользоваться?
Кину я значения в стринг, но они же складываться не будут.
Я бы мог сделать что-то, если бы умел определять текстовую часть и цифровую отдельно.
Ладно, я уже сделаю так, что буду писать число и стринг через пробел.
Стринг в одном поле хранишь, а дабл в другом. Пишешь функции для их сумирования или можешь оператор + переопределить.
Костыль? Костыль? А лямбды тоже костыль? Правильно, нахуя эти непонятные квадратные скобки, лучше еще один функтор именованный написать. unique_ptr тоже костыль? Деды raw-pointers с дерьмом вместе ели, и мы будем. Чего там, variadic templates тоже костыль. Нахуя нам эллипсисы непонятные, пачки какие-то, лучше через void * сделать! Стандартизация не нужна! Даешь C с классами!
>>530086
Пиздос. Я даже это комментировать не буду.
Я, вообще, так сделал, по простому.
https://bpaste.net/show/4c4f17c7f50f
Можешь подсказать, а как с твоего лонг дабла сделать? Я не совсем понял.
Только понял - если вводить так как я сделал, всё верно же получается, пикрелейтед. Я думал выдавать ошибку будет, ведь разрыв по пробелу происходит?
Почему если я пишу 4ft, то разрыв всё равно идёт, а не пишет ошибку?
[code lang="cpp"]
//Пусть оператор с long double из предыдущего уже описан где-то раньше
long double distance1 = 10.0; //10 сантиметров
long double distance2 = 10.0m; //10 метров = 1000 сантиметров
[/code]
Немного не в тему вопрос, но я только задумался: если надо не считать наибольшее и наименьшее значения, а у меня всего 1 или 2 значения вбито - их надо будет считать или нет?
Вроде, 1 значение является и наибольшим и наименьшим, но я не уверен.
Если кому интересно, вроде написал программку, это конечная задача по учебнику Страуструпа в главе 4.7: https://ideone.com/lAsE78
Если что неправильно написал - пишите, я открыт для критики.
шёл 2015 год, а мы до сих пор имеем тормозмозные аллокейшены в каждом присваивании и в каждой подстроке
в обоссаном выжеэл студии 2003 года уже был сделан sso для строк!
вы тут про высокие материи, мол лямбды и вариадики - это прорыв, при этом для юник_птр в ++11 нет мейк_юник, при том что маке_шаред всё таки есть, надо писать километровые строки в коде и скроллить это говно по горизонтале, каждую версию ожидаешь, что избыточного кода станет меньше, а в итоге почти та же ссанина что и 10 лет назад,
ссука для сетки ни одной отдельной либы, только монстры типа буста и кьюте или нужно использовать сишное говно от системы, где кода проверки ошибок на порядок больше, чем реальной работы
>не сделано sso для строк
Ну поставь SGI реализацию, если тебе так критично.
>нет мейк_юник
>2015
Пора бы уже про 14 подумать, в нем все есть. И основные фичи реализованы в компиляторах.
>для сетки ни одной отдельной либы
Casablanca же, маленькая, шустрая, все фичи из новых стандартов поддерживает.
Если не секрет, спали зарплату.
Почему?
>if (value == "cm")
>array.push_back(number);
>else if (value == "m")
>array.push_back(number / 100);
Если см, то добавляем так, если метры, то делим на 100.
Давай проведем анализ размерностей.
Что известно: 100 см/м.
На входе:
1. number :: см => array.push_back :: см -> ()
2. number :: м => array.push_back :: (м / (см / м)) -> ()
Раскрываем скобки: м / (см / м) = м^2 / см
Получаем несоответствие - с одной стороны push_back принимает сантиметры, а с другой - квадратные метры на сантиметр.
Короче спрошу здесь, не хочу отдельный тред создавать.
Есть предположим ВЕКТОРЫ и МАТРИЦЫ и это все надо перемножать. На CPU это ОЧЕ долго, поэтому я хочу воспользоваться возможностями GPU. Но при этом не хочу покупать этот самый GPU, потому что он стоит денег, даже самый днищенский.
Сейчас есть процессоры с типа встроенной видюхой. Есть материнские платы со встроенной видюхой. Потенциала этого барахла хватает, чтобы показывало десктоп, делаю вывод, что должно хватит и на матрицы.
Вопросы такие.
1) Есть ли библиотеки для прямого доступа к возможностям встроенного в мать/проц GPU и если так, то на каких машинах это будет работать. Без анальных привязок и кросс-платформ.
2) Можно ли использовать opengl в таком случае и перемножать матрицы на вертекс шейдере? Какая версия opengl будет доступна? Насколько кросс-платформенно?
>1) Есть ли библиотеки для прямого доступа к возможностям встроенного в мать/проц GPU и если так, то на каких машинах это будет работать. Без анальных привязок и кросс-платформ.
Касательно Intel - только DirectCompute или C++AMP а он внутри все равно использует DC. Вроде AMP пытались прикрутить и к clang.
>Хотелось бы одно решение для всех процов.
ну вот попробуй это: http://www.hsafoundation.com/bringing-camp-beyond-windows-via-clang-llvm/
Там через OpenCL, поди и на AMD заведется.
Хотя там ссылки теперь ведут на Kalmar, а он, суда по всему, не будет работать с Intel. Но если тот же код скомпилить Visual C++, то запустистя на Intel. Но только под винду.
Короче хз.
А зачем здесь компилятор и что им компилировать? Если весь проект на нем пересобирать, то лучше сразу шейдер написать.
> OpenCL
Я вот о нем как раз и думал. Поясни за него. Насколько он мне подходит?
ох ты, судя по https://software.intel.com/en-us/articles/opencl-drivers#iris
они добавили поддержку OpenCL для интеловских GPU.
Значит OpenCL тебе подходит.
Я правильно понимаю, что оно не будет работать на нонейм GPU в материнке асуса?
Конкретная модель значения не имеет.
Обычная материнка со встроенной видюхой, года так 2011 выпуска.
Я хочу использовать как можно более дешевый хардвар, но иметь доступ к GPU. Мне не нужны йоба вычисления как в крузисе, нужен параллелизм хоть какой-то.
>Конкретная модель значения не имеет.
И как мы тебе подскажем нужный софт не зная железа? Совсем аутист или тут битва экстрасенсов?
И вообще, 2015 год, купи б/у видяху за 50 баксов, даже в круизис на средних поиграешь.
Короче это древнее говно мамонта, но зато дешевое.
>50 баксов
Это удорожает конечное изделие. Или ты думаешь, я такой нищеброд, который хочет поиграть в ПАРАЛЛЕЛИЗМ и копейки считает?
Меня не конкретно этот хлам интересует, а в целом подобный хлам как класс. Чтобы грубо говоря запустилось на любом говне, где есть хоть какое-то gpu - процессорное, чипсет в материнке, неважно.
Там чего с этим opencl делать? Фреймворк нужно ставить для конкретного типа gpu?
Вот кстати двачую вопрос. Будет ли OpenCL полностью кроссплатформенным решением? Условно говоря, везде, где есть C++ компилятор, компилируешь его исходники и используешь пусть даже и с различным быстродействием на разных архитектурах. Если нет, то есть ли в природе что-то подобное?
>OpenCL работает на nForce 630
Ну-ка пруфы!
Судя по http://www.gpu-tech.org/content.php/162-Nvidia-supports-OpenCL-1.1-with-Geforce-280.19-Beta-performance-suffers
nForce 630a относится к GeForce 7000. А GPGPU появился только в 8000.
>Будет ли OpenCL полностью кроссплатформенным решением
Да. нужен только OpenCL драйвер для интересующего устройства на клиентской машине.
Отлично, спасибо. Тогда в ближайшее время попробую вкатиться, ибо давно пора расширять горизонты.
>нужен только OpenCL драйвер для интересующего устройства на клиентской машине
Вот это не особо радует, тупой пользователь может не сообразить.
Еще вопрос.
Современные процы все с GPU на борту идут? Самые дешевые днищенские модели у интела и амд тоже с ним?
>Меня не конкретно этот хлам интересует, а в целом подобный хлам как класс. Чтобы грубо говоря запустилось на любом говне, где есть хоть какое-то gpu - процессорное, чипсет в материнке, неважно.
Главное, чтобы железка была с GPGPU, причем с достаточной для твоего кода Compute Capability. Можно, конечно, и шейдерами на OpenGL вычислять, но это уже прошлый век, и вряд ли ты найдешь сейчас для этого нормальную библиотеку.
Ноуп, далеко не все процессоры идут с GPU.
>Вот это не особо радует, тупой пользователь может не сообразить.
У nVidia и Intel они ставятся с обычными графическими дровами, судя по всему.
>и вряд ли ты найдешь сейчас для этого нормальную библиотеку
Руками напишу в крайнем случае. Я правильно понимаю, что в этом случае будет работать почти на любой хуйне?
>fixed pipeline
Ну это уж совсем днище, лол.
Кстати есть очень бюджетные процы всего за пару тысяч с интел HD. Это приемлемо. Походу все-таки самый нормальный вариант на такие ориентироваться.
На тебе няшек короче, спасибо.
Я так понимаю, что у тебя проблема с инклюдингом собственного кода. Просто разделяй все на хедеры и cpp файлы (если не шаблоны). инклюдить надо только хэдеры. Инклюдить можно и из хедеров, и из цпп. Во всех хедерах используй header guard, загугли что это.
А вообще можешь опубликовать свой проект, и я тебе поясню, что ты с инклюдами делаешь не так.
>>530369
Я использую гарды, просто иногда получаются дабл и циркулярные включения. Например есть a.h с классом clА, у которого методы и члены статичные - 3 члена-класса clB, clC, clD и одна int переменная varE. То есть уже идут включения b.h, c.h, d.h. У clD есть метод, который должен менять статическую переменную-член clA. Вот и получается, что a.h включает b.h, c.h, d.h, а d.h включает a.h, который включает в себя b.h, c.h, d.h, а d.h...
>У clD есть метод, который должен менять статическую переменную-член clA.
То есть он получает clA либо по ссылке, либо по указателю? Используй forward declaration.
Нет. Он прям берет и clA::varE = 0; Ну или на крайний случай можно сделать clA::setE(0);
>>530379
Подозреваю, что у тебя ошибка в чем-то другом, либо ты что-то совсем не так делаешь.
Вот так надо, все работает. Что-то непонятно - спрашивай.
http://pastebin.com/gNBziyPy
Ключевые знания - declaration - в хедерах. Имплементейшн - в cpp файлах. Cpp файлы инклюдить никогда не надо.
>Ключевые знания - declaration - в хедерах. Имплементейшн - в cpp файлах.
Поправка - это если не темплейты. В темплейтах все через жопу, и там нет .cpp и .hpp - там все в хедерах.
Потому что в таком порядке писал код. Сначала этот инклюд мне понадобился в ClassB.cpp, а потом - в ClassB.hpp. От того, что он и там и там, ничего плохого не будет.
Объявление "чего-то" можно хоть куда напихать, главное чтоб определение этого "чего-то" было одно на весь проект. Поэтому его обычно и засовывают в .сpp
Я тоже в свое время нихуя ничего этого не понимал и ебался, ебался, ебался с круговыми зависимостями.
Это наверн если объявление с гвардами, можно понапихать. А то вспоминаются всякие already defined ошибки
Да не. Как раз таки "defined" значит определение, а forward declaration можно делать спокойно, типа
[code lang="CPP"]
class A;
class A {
private:
A* a;
};
[/code]
А как тогда правильно сделать, чтобы в обоих .cpp была видна одна и та же переменная foo?
Ох уж этот Страуструп.
Обычно так не делают. Обычно 1 хедер - 1 файл реализации.
>Я хотел сделать разные хидеры, но оба класса используют один и тот же struct в типах аргументов методов.
Не понял, в чем проблема? Инклюдь заголовочный файл с этой структурой.
Хотя не, откомпилилось http://pastebin.com/9wtmdfCg
Но вот тут непонятно: если убрать из a.h, в самом конце, #include "b.h", компилятор ругается про форвард деклар и "error: invalid use of incomplete type class B"
>>530458
И я попытался посмотреть код дума3, и так понял, что там все файлы инклудят один хидер с форвард декларами и прочим, а тот инклудит все остальные хидеры. Но не понял, откуда https://github.com/id-Software/DOOM-3-BFG/blob/master/neo/renderer/GuiModel.h знает про vertCacheHandle_t
>>530463
Это не весь код, гарды есть. Но про инклуд в конце я сам не понимаю: компилятор без #include "b.h" ругается.
Очевидно, это значит, что ты где-то инклюдишь a.h и пытаешься использовать B, а b.h не инклюдишь
>"\n" замени на std::endl
Платина. Не надо так делать. Самое лучшее -- глобальная константа:
const char newline = '\n';
В a.cpp есть метод:
bool A::aaa(structA var1) {
a_b->bbb(var1);
return false;
}
вот тут и ругается.
>пишет на vector без std:: что он не идентифицирован
Он же не знает, что ты хочешь вектор именно из стандартной библиотеки языка. Ему нужно сообщить об этом, а то вдруг у тебя самопальный вектор из говна и палок.
Алсо, не слушай его. Локаль надо выставлять (как ты и делаешь), а вместо гетча пиши православный кроссплатформенный std::cin.get(ch):
include <iostream> //std::cin / std::cout
char ch;
std::cin.get(ch);
A - класс, structA - struct StructA в a.h
Ну так ты пытаешься у B использовать метод. Чтобы его использовать, нужно знать, какие методы у него есть. А чтобы это знать, нужно заинклюдить хедер b.h
>а вместо гетча пиши православный кроссплатформенный std::cin.get(ch):
Проще Dev-C++ юзать, он окошко консоли сам не закрывает.
В Visual Studio если запускать не в режиме отладки, то тоже не закрывает
Теперь в a.cpp два инклуда: "a.h" и "b.h"
Но компилятор ругается: undefined reference to `B::bbb(structA)'
Да, все, спасибо. Это просто предупреждение от компилятора. Но теперь другой вопрос: как сделать пиздато? Чтоб как в думе - один файл заинклудил и все.
Не предупреждение, а ошибка. Предупрежедения это рекомендательные штуки, которые компилятор обычно выдает, когда подозревает, что где-то может получиться undefined behaviour.
>Но теперь другой вопрос: как сделать пиздато? Чтоб как в думе - один файл заинклудил и все.
Не ебу.
Там все запутанно.
Я тоже сначала хотел сделать свич, но там показало что он не поддерживает этот тип переменной.
>>530269
Что-то я не совсем понял, у меня же сделано так (брал сантиметры за образец вычислений):
>if (value == "cm")
>array.push_back(number);
Если см - просто заполняем массив.
>else if (value == "m")
>array.push_back(number / 100);
Если м - делим число на 100, т.е. получим сантиметры?
>2. number :: м => array.push_back :: (м / (см / м)) -> ()
Вот тут не понял - откуда ты взял: (м / (см / м)), если у меня там м / 100 = см.
switch std::hash (str) же.
set же есть, зачем вектор? Или Страуструп из всего STL только про него рассказал?
>Если м - делим число на 100, т.е. получим сантиметры?
Вводим 2м, потом чтоб получить см делим на 100, получаем 0,02см. Косяк, правда?
>откуда ты взял: (м / (см / м)), если у меня там м / 100 = см.
В метре 100 сантиметров. 100 сантиметров приходятся на каждый метр. 100 см/м. Подставляем: м / 100 = м / (см/м).
Ну если словей мало, то да, вектор будет предпочтительней. Но один фиг книжка написана через жопу.
Циклические включения -- верный признак хуевой архитектуры. Приведи какой-нибудь пример из жизни, где такое возникает, и я попробую подсказать, как надо переделать архитектуру.
Односвязный список, в котором в каждой ноде хранится указатель на следующую ноду.
Аноны, сабж о локальном скриптинге и автоматизации в Windows.
BATch, VBSсript, JScript, WMI и что с этим связанно.
Да, PowerShell сюда же.
Туда ли ты зашел?
signed short s_minus_one = -1 ;
if( s_minus_one > ui_one)
\t\tprintf("-1 > 1 \n");
Внимание, вопрос! Какого хуя?
Знаковый тип приводится к беззнаковому. Получается uint_max > 1
Рекомендую -Wall -Wextra -pedantic
Классика. При сравнении знакового и беззнакого целочисленного типа более высокий приоритет имеет беззнаковый, поэтому знаковый кастуется в него. Далее минус единица превращается в UINT_MAX и победа при строгом сравнении обеспечена всегда, кроме когда беззнаковое тоже равно UINT_MAX.
Чтобы сравнивать значения, они должны быть одинакового типа. Если они разного типа, компилятор (наверно при помощи статик_каста) приводит их к одному типу. Если бы всё приводилось к знаковым, тогда значения беззнакового, превышающие INT_MAX, кастовались бы в отрицательные, и тоже были бы "меньше" любых маленьких положительных.
Опять начинаешь, ебучий шакал.
В дополнение в вышесказанному, скажу, что беззнаковый от знакового отличаются интерпретацией первого бита. В знаковом первый бит числа отдаётся под знак, в беззнаковом - ещё один двоичный разряд числа. Так и получается, что -1 побитого равен uint_max в беззнаковом.
В константных строках не хранят \n на конце. Хранят саму строку, которую можно вывести, добавив << std::endl. Это позволяет конкатенировать строки без ебли, потому что не все строки предназначены для вывода отдельно от других и дальнейшего возврата каретки. Когда ты выводишь литерал что само по себе уже пахнет магическими константами, но в хэллоуворлдах или для отладки можно, конечно, тем более удобнее пользоваться std::endl, это лучше читается.
[code]enum{ A1 = 'q', A2 = 'w', A3 = 'e' };
std::cout << A1;[/code]
Можно и дефайнами это сделать, но мне интересно именно через enum. Кто что думает?
Ну и имя после class, конечно же.
Опередил, содомит. Добавлю, что глобальный enum сейчас фактически deprecated из-за того что не обеспечивает отдельную область видимости.
Нет.
[code lang=cpp]
enum class imya : char { A1 = 'q', A2 = 'w', A3 = 'e' };
std::cout << imya::A1;
[/code]
Это как если бы ты написал
[code lang="cpp"]
class TvoyaMamka { using width_type = int; };
std::cout << TvoyaMamka::width_type;
[/code]
И тут и там пытаешься вывести тип вместо переменной, так не пойдет. Пиши нормально, типа imya foo {imya::A1}; std::cout << foo;
Кажется, понял. Создать объект и инициализировать A1. Сделал так, но всё равно ему нужен оператор<<.
Да не, я обосрался на самом деле. Без создания объекта тоже должно бы было работать. Посмотрел сейчас встроенные перегрузки для operator<<, там enum'ов нет, разумеется. И неявно к своему базовому типу они не приводятся, так что придется тебе либо делать static_cast в char, а еще лучше засунуть это приведение в самописный operator<<.
Да, видимо, без этого никак. А что с дефайнами? В крестовом коде их использование не является моветоном?
Является, лучше даже и не начинай.
Первое же правило у Мейерса, кстати.
Сделать дружественный класс и в нем уже нужную константу?
Если константа и так член класса, то метод и так имеет к ней доступ, зачем её передавать в качестве аргумента?
Да, в одном. Но я уже нашел решение - инициализировать константу в initializer list.
Ок, новая проблема.
[code lang=cpp]
//EXAMPLE.h
Class Example {
public:
Example(const int&);
private:
const CONSTANTA;
void method();
};
//EXAMPLE.cpp
Example::Example(const int& value) : CONSTANTA{value}
{
//......
}
Example::method()
{
const int WIDTH = CONSTANTA / 9;
static_assert(WIDTH >= DRUGAYA_CONST, "error");
}
/error: the value of ‘WIDTH’ is not usable in a constant expression
note: ‘WIDTH’ was not initialized with a constant expression
const int WIDTH = D_WIDTH / 9; /
[/code]
Почему так?
Ок, новая проблема.
[code lang=cpp]
//EXAMPLE.h
Class Example {
public:
Example(const int&);
private:
const CONSTANTA;
void method();
};
//EXAMPLE.cpp
Example::Example(const int& value) : CONSTANTA{value}
{
//......
}
Example::method()
{
const int WIDTH = CONSTANTA / 9;
static_assert(WIDTH >= DRUGAYA_CONST, "error");
}
/error: the value of ‘WIDTH’ is not usable in a constant expression
note: ‘WIDTH’ was not initialized with a constant expression
const int WIDTH = D_WIDTH / 9; /
[/code]
Почему так?
const int CONSTANTA*
Используй по минимуму. Всегда есть typedef, constexpr, константы, экстерн и т.д.
void Example::method()*
Потому что значение CONSTANTA на момент компиляции неизвестно.
Нет. Будешь окна собирать.
Всё правильно сказал.
>>531345
Уровня школы. И да, алгоритмы != математика. Откуда вообще эта хуйня пошла? Большинство алгоритмов в говноразработке выстраиваются обычной логикой, а всякое серьезное дерьмо с математикой делается бородатыми дедами при университетах, называется "научной деятельностью". Когда программистишка с 4 курсами говноматана с говнопараши типа МГУ начинает считать себя математиком, где умирает один Мишаня.
http://imperium.lenin.ru/~verbit/MATH/programma.html
выполняя код на стареньком eeepc 701 я обнаружил что время выполнения задачи всё время одинаковое-47сек(выводится самой программой), хотя секундомером мерил оно доходит до 1минуты 5 сек. И доходило до 1минуты 50 сек при двойном запуске той же самой проги, программа всё равно выводит 47секунд.Пробовал запускать на настольном пк там составило 7 сек, но не стал морочиться с загрузкой ядер-там их несколько. Может ошибка какая-то в коде?
float seconds;
clock_t sstart = clock();
unsigned long wait=0;
while(wait<4000000000)
wait++;
cout<<wait<<endl;
seconds=(clock()-sstart)/CLOCKS_PER_SEC;
cout<<"Время затраченное на складывание "<<wait<<"раз=";
cout<< seconds<<endl;
оппа перекатился
Чтоб например можно было получать данные из другого приложения, или использовать хардверу компутера, например получить данные с компорта.
Я просто разобрался в базисе (указатели-стринги наследование, классы и прочее, дефолтные принципы и основы). И теперь уже 2 года никак не продвигаюсь. Кучи литературы для вступления, а что дальше - совершенно не ясно, не ясно с какой стороны подойти.
Я вот понемногу осваиваю программирование под мкк, очень много литературы, во всем можно разобраться. И никто не может ответить.
А как подойти к программированию под ось, так и не пойму.
VS 2015 не компилирует парочку кодов, но ошибок не выдает. Вместо этого компилирует прошлый успешный код. Проверил каждую строку, запускал другие коды, всё ок. Снес его, переустановил, проблема осталась. Попробовал на другом компиляторе, а там коды успешно компилируются. Что за говно?
foo(vector<int> &v, auto b = v.begin())
Это копия, сохраненная 17 сентября 2015 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.