Двач.hk не отвечает.
Вы видите копию треда, сохраненную 17 сентября 2015 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
2009 Кб, 1592x963
Оффициальный™ традиционный® C++ тред #4 #525225 В конец треда | Веб
И я увидел, долгий взгляд вперяя,
В 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)
#2 #525228
Предыдущие треды на архиваче:
https://arhivach.org/thread/94971/
https://arhivach.org/thread/94972/
https://arhivach.org/thread/99414/

В шапку добавлены новые драфты стандарта и информация об IDE.
#3 #525241
>>525228

>драфты стандарта


Что это и где?
#4 #525244
>>525241
Черновики стандарта на ангельском, которые в третьем пункте литературы. В них можно уточнить самые детали от безысходности, если больше нигде инфы не находишь.
удел насикомых Ананос #5 #525245
ананасы, какие узкие специальности можно задрочить, чтобы стать овердокуя оплачиваемым спецом? што сейчас актуально?
#6 #525248
Что значат строки типо:

#define kukareku

koko = a + kukareku b;

Я правильно понимаю что это способ вставить комментарий прямо посреди строки кода?
#7 #525256
>>525245
Ничего, игра закончена. С каждой написанной программой жызненное просранство для каждого отдельно взятого программистишки сжималось, http://gans-spb.livejournal.com/14901.html
#8 #525267
>>525248
Это говно какое-то, для комментария посреди строки можно юзать /комментарий/ же.
#9 #525268
>>525267
[code lang="cpp"]
/комментарий/
[/code]
41 Кб, 477x862
#10 #525307
Поясните за колбэк.
Да, я понял что это грубо говоря функция которая вызывается во время наступление некоторого события, это если объяснять словами.
Но вот как это все реализовано, у меня в голове не укладывается.
Всюду простые примеры кода типа такого(пикрелейтед)
Здесь просто вызывается функция ссылку на которую содержит указатель на функцию. Но в таком примере можно это можно заменить непосредственным вызовом функции, да и всё. Непонятно когда именно очень необходим этот самый колбэк.
И еще.

> которая вызывается во время наступление некоторого события



Неясно каким это магическим образом оно узнает что событие наступило.
Оно что запускает в потоке бесконечный цикл и все время проверят наступило ли событие(например нажатие мыши) или как? Как это физически происходит? Как оно узнает какую именно функцию ей нужно вызвать в том или ином случае?
#11 #525311
>>525225 (OP)

>Под шиндошс удобно использовать


А почему в IDE про Eclipse ничего нету? Он неудобный? Там вроде даже рефакторинг какой-то из коробки и Git.
/мимонафаня
#12 #525315
>>525307
Профит в том, что ты можешь передать указатель на свою функцию куда-то, и там, имея этот указатель, и зная какие аргументы ей можно передавать, ее могут вызывать когда пожелают передавая в аргументы что-нибудь полезное.

Можно показать на примере куска кода регистрации обработчика событий окна шиндовс:
http://ideone.com/qzuf7T
#13 #525316
>>525315

>Передача ссылки на функцию


Сохранение указателя на функцию. & операция взятия адреса.
Мама,я все забыл
#14 #525317
>>524533
репощу с ласт треда вопрос, надеюсь, что поцаны не проигнорят, спс.
#16 #525321
>>525315

> и там, имея этот указатель, и зная какие аргументы ей можно передавать, .


Что-то еще более не понятнее стало.
Почему бы просто не вызвать функцию и передать те же аргументы.

> ее могут вызывать когда пожелают передавая в аргументы что-нибудь полезное


Как вызов то происходит, как система узнает что вот сейчас пора вызывать, а когда не надо?
185 Кб, 1280x960
#17 #525322
>>525319
спасибо анончик, пойду осилять
#18 #525323
>>525321

> Как вызов то происходит, как система узнает что вот сейчас пора вызывать, а когда не надо?


на очереди тредик висит и выковыривает из неё сообшченьицца
#19 #525336
>>525321

>Как вызов то происходит,


Ты передал указатель. С его помощью можно вызвать.

>, как система узнает что вот сейчас пора вызывать, а когда не надо?


Система сама решает, что пришло время о чем-то сообщить.

>Почему бы просто не вызвать функцию и передать те же аргументы.


Допустим, твое приложение хочет узнать где в данный момент находится указатель мыши на окне, которое ты создал.

Ты подписываешься на это сообщение - каждый раз как пользователь будет перемещать мышь, ОС совершит вызов твоей функции, и передаст в качестве аргумента координаты курсора.

Можно было бы опрашивать ОС о координатах раз в секунду, но это не так эффективно, поскольку курсор движется быстро по экрану, а пользователю твоего окна придется ждать когда твое приложение отошлет запрос и обработает положение мыши на экране. К тому же, ты будешь опрашивать ОС даже тогда, когда курсор находится за пределами твоего окна, а это неэффективно.
#20 #525382
>>525307
Ты не забывай еще, что хотя бывают указатели на методы, наподобие int (TvoyaMamka::*) (int), делать их коллбэками нельзя, тому що вызов методов не совместим ни с какими соглашениями о вызовах VC вон указатель на this передает вообще в регистре. И даже если метод статический, хотя по факту он везде будет нормально работать как коллбэк, если объявить его с _cdecl соглашением о вызовах, стандарт запрещает делать его коллбэком все равно, ибо нехуй. Используй глобальные функции, будь алтфаком.
#21 #525383
>>525311
Потому что я убежденный спермораб, очевидно же. Ну я указал ту, которой сам пользуюсь. Если кто-нибудь напишет про Eclipse, добавлю, конечно.
#22 #525386
>>525321
Самая банальная ситуация - у тебя есть какой-нибудь libcurl библиотека для работы с http, написана на pure c. Ты хочешь скачать этот тред при помощи своей программы. Поскольку pure c не может в std::string, он хочет писать код страницы в обычный char . Но буфер из ограниченного по размеру char передавать ему некошерно, ибо тред может быть большим и не влезть в него. Что делать? Ответ прост - ты передаешь в libcurl собственную функцию-обработчик потока символов, который генерится из кода страницы. Этот обработчик знает, куда пихать символы, он может юзать std::string, или уточнить размер буфера, или еще что-то придумать. Важно, что библиотека не может знать всего, поэтому она передает ответственность за схоронение твоему коллбэку, и дальше ее не ебет.

Если весь код твой, то, в принципе, можно обойтись без коллбэков. Если библиотека новая и на крестах, то тоже. Коллбэки же нужны именно для работы с чужим кодом на pure c, и вообще на других языках.
39 Кб, 951x740
#23 #525418
Поясните пожалуйста, я внятного ответа в гугле не нашёл - когда я в стринг пишу русские символы, то вывод какой-то не такой, какой должен быть:
#24 #525419
>>525418
Либо setlocal делай правильный, либо в консоли chcp.
#25 #525420
>>525419
Я делал и такие:
setlocale(LC_ALL, "rus");\t
setlocale(LC_ALL, "russian");
Всё равно не работает как надо.
А что в консоли делать? Я в гугле читал про:
\tSetConsoleCP(1251);
\tSetConsoleOutputCP(1251);
Оно?
Но не совсем понял куда вставлять.
#26 #525424
>>525420

> ++


std::locale::global(std::locale(""))
8 Кб, 456x163
#27 #525425
>>525424

>std::locale::global(std::locale(""))


Такая же батва, делал пустой и russian.
#28 #525453
Где найти все понятия по С++? Все эти инициализация, объекты, типа, литералы етц?
Я учебник страуструпа читаю, там есть далеко не все понятия, а некоторые немного размыты.
#29 #525482
>>525453
конспектируй, другой учебник глянь если какая-то тема не лезет в голову
#30 #525486
Поясните, я сделал программку с учебника, но она получилась очень громоздкой с кучей копипасты.
Я подумал - можно ли как-то было укоротить решение? Но так, чтобы использовать только простые, стандартные функции, типа 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 цента
42 Кб, 700x573
#31 #525489
>>525486

>int one = 1;


>int two = 2;


>int three = 3;

#32 #525490
>>525486
Вынеси поворяющийся код в функции
#33 #525493
>>525489
Что не так? Типа, one - один цент.
Да, может стоило добавить one_cent.

>>525490
Я функции еще не изучал.
#34 #525499
>>525382
Я всё понял :3
>>525336
То есть система несет ответственность за то когда курсор дернется и когда это произойдет она передает ссылку на свою функцию как аргумент в мою функцию, которая выполняется в отдельном потоке?
>>525386
Это же другая ситуация, если нам просто нужно подставить свою реализацию в некоторую функцию.
Вот в вики написанно:

Об обратном вызове можно думать как о действии, передаваемом некоторой основной процедуре в качестве аргумента. И это действие может рассматриваться как:

1. подзадача и использоваться для обработки данных внутри этой процедуры;
2. «телефонная связь», используемая для того, чтобы «связываться» с тем, кто вызвал процедуру, при наступлении какого-то события (англ. callback дословно переводится как «звонок обратно»).

Меня же интересует второй случай.
#35 #525502
>>525493

>Я подумал - можно ли как-то было укоротить решение?


>Я функции еще не изучал.


>Вынеси поворяющийся код в функции


форман джипег.
Вот иди изучи и упростишь
#36 #525503
>>525486
Вместо своих россыпей суффиксов юзай функции же.

[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]
#36 #525503
>>525486
Вместо своих россыпей суффиксов юзай функции же.

[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]
#37 #525504
>>525503

>number % 10


Быстрофикс.
#38 #525507
>>525499
На самом деле это концептуально одно и то же. Чужой код не знает как совершить действие и использует твой "обработчик". А что конкретно он делает - обрабатывает данные или обращается к тебе - это уже дело десятое.
#39 #525508
>>525499

>То есть система несет ответственность за то когда курсор дернется и когда это произойдет она передает ссылку на свою функцию как аргумент в мою функцию, которая выполняется в отдельном потоке?



То есть система вызывает метод в библиотеке (которая отвечает за работу с UI), когда ты дернул мышь:
void mouseMoved(int x, int y);

А внутри метода примерно так:

{for (int i=0; i++; i < subscribes.lenght) {
subscribes.DO_IT(x, y);
}}

где subscribes - массив структур, в которых хранятся указатели на все методы, которые должны выполниться на этом событии.
#40 #525510
>>525508
Вакаба сожрала скобки:
subscribes[\ i \].DO_IT(x, y);
#41 #525531
анон, помогай, у меня трабл с файловым выводом. Вывожу в файл экземпляры класса second, производного от first, все идет норм, выводится, читается, до тех пор, пока я не делаю функции базового класса first виртуальными, после этого ни в какую не читает экземпляр из файла. какой там танец с бубном нужно станцевать?
#42 #525581
>>525248
Это константа через дефайн. Нахуй не нужно имхо. Хотя некоторые любят.
#43 #525584
>>525581

>некоторые любят


С принятием C++11 эти некоторые оффициально считаются говноедами. Если раньше альтернативой было только const TvoyaMamka kukareku, которую хуевый компилятор уносил в рантайм даже если она использовалась только как константа времени компиляции, то теперь есть православный constexpr, для которого не сгенерируется никакого кода, и при этом не будет проблем с областью видимости и статическими проверками типов, которые есть у #define.
#44 #525603
>>525581
И где там константа?
#45 #525621
>>525581
Да я знаю что такое #define. Тут же ничего не присваивается, и получается что этот define можно писать где хочешь без влияния на программу.
sage #46 #525626
>>525508
Всё, теперь вроде наконец понял.
Есть метод в системе который заточен для того чтобы добавлять субскрайберов(указатели на функции) на метод изменения координат курсора - этот метод взаимодействует с этим списком субскрайберов и когда мышь изменяет координаты выполняет каждую из функций, которые были на него подписаны, а уже что там за реализация не имеет значения для этого метода.
#47 #525658
>>525621
Можно в дальнейшем заменить пустоту на #define kukareku c + же. Если написать a + kukareku + b, то для пустоты не сработает, а так можно добавить любое количество слагаемых.
#48 #525659
>>525531
Давай код. Телепаты в отпуске.
#49 #525662
>>525248
Макросы. Заменяются препроцессором на настоящий код. С помощью них можно творить нечитаемое говно, например написать ОС http://www0.us.ioccc.org/2004/gavin.c
#51 #525708
>>525675
что это за мусорка с твиттера?
14 Кб, 915x375
#53 #525719
>>525418
А я нашел ответ в гугле по запросу setlocale getlocale (stackoverflow)
#54 #525725
>>525675
похуй же. Говно какое нибудь делает. А программистом любой аутист с гуманитарным образованием сможет стать при должном усердии и наличии интернета.
#55 #525747
Есть что почитать про правильное и неправильное использование инклудов, а то я заебался с этими "does not name a type", "has no member named", "expected primary-expression before 'int'" и остальными ошибками из-за неправильного использования инклудов. Вроде и везде гарды стоят, но все равно говно получается.
#56 #525764
>>525747
В начале каждого .h ставишь #pragma once, либо весь файл целиком в include guard. Константы у include guard не должны, блджад, повторяться, поэтому в подавляющем большинстве случаев удобнее не следить за этим, а использовать прагму кококок нестандарт символические ссылки.

Итак, в каком-то .h описан твой класс. Если ты, хуила, вынес из класса определение метода, но оставил его в том же .h файле, а не перенес в соответствующий .cpp, то подставляй свою сраку - это говно иногда будет компилироваться, а иногда нет.

Где-то в другом файле ты хочешь использовать свой класс TvoyaMamka. Если он используется только в сигнатуре функции, или ты используешь ссылку/указатель на него, но не обращаешься к его членам, то достаточно в начале файла написать class TvoyaMamka, то есть, просто объявить его. Никаких инклудов делать не надо, понял епту?

А вот если ты в новом файле наследуешься от него, хранишь или создаешь его экземпляры, обращаешься к членам - короче говоря, делаешь что-то, для чего нужно знать внутренности или размер этого класса, то ты должен в начале нового файла написать include.

Если у тебя возникла ситуация, когда файлы инклудят друг друга, то у меня для тебя плохие новости - ты долбоеб. Чтобы избавиться от циклического включения, необходимо выбрать из этих двух файлов "главный". В "главном" файле ты оставляешь инклуд "неглавного", а в "неглавном" приводишь код к такому виду, чтобы, блядь, инклуд "главного" не требовался - переходишь к указателям, выносишь все говно в .cpp и так далее. И потом вместо инклуда "главного" просто объявляешь его с помощью class.

Это далеко не все, но достаточно, чтобы ты не срал в штаны слишком уж часто.
#57 #525776
>>525764
А если у меня есть три файла A.h, B.h и C.h, причем А и B используют говно из С stdlib, например, а у класса в А есть член-экземпляр класса из В, то только А должен иметь инклуды оставшихся двух?
#58 #525777
>>525764
Чему в новом стандарте не откажутся от .h и всей сопутствующей ебли зависимостей? Почему не позаимствуют опыт других языков, например того же шарпа, в котором компиль справляется с генераций без всяких дополнительных заголовков?
#59 #525783
>>525777
Обратная совместимость потому что. А в плане опциональной поддержки вроде что-то замышлялось, но вряд ли это будет до C++20.
>>525776
Тогда в A включен B, а A и B могут при необходимости включать C, но по возможности следует этого избежать. Например, подключать stdlib транзитом это плохой тон. Нужны тебе куски stdlib в A - подключай их непосредственно в A. Это уменьшает зависимости же, вдруг ты потом решишь переделать C, чтобы он не использовал stdlib.
#60 #525838
>>525776
Google://include guards
#61 #525842
>>525838
Ниочем вообще, на одних гардах далеко не уедешь, там даже порядок включения роль играет.
#62 #525891
>>525842
Если играет, то ты делаешь что-то не так. Используешь using в заголовочных файлах, циклические зависимости или еще какое говно.
#63 #525904
>>525891

>Используешь еще какое говно


C++
#64 #525926
>>525904
У вас финализатор отклеился, уважаемый. Проследуйте в свой загон, будьте так любезны.
#65 #525935
>>525926
Чиво блять?
#66 #526098
>>525490 >>525502
Ребята, это Страуструп для ньюфагов, будьте снисходительны. Страуструп сначала заставляет перекусить ржавую трубу собственным анусом, и только потом рассказывает про ножовку где-то страниц через сто.
#67 #526134
>>526098
А Лафоре/Прата рассказывают только про ножовку, информация про ржавые трубы стыдливо спрятана в конце книги, а о том, что у человека есть анус, не упоминается вообще.
#68 #526210
>>526134
ну тем не менее это нужнее, и после них Стратоуструпа можно просто пролистать просмотреть листинги. У меня первой книгой был как раз Стратоуструп, и я наверное целый месяц осмысливал первую программку где калькулятор предлагает сделать.
9 Кб, 250x256
#69 #526217
>>526210

>осмысливал первую программку где калькулятор предлагает сделать


не понял как на это реагировать, ты ебанутый(да)?
в основном тебе нужно было понять как работать с классами(начально) и разбивать программу на функции. ВСЕ, там даже задания не нужно делать, если ты все понял, потому что они настолько ебанутые, что иди нахуй просто.
#70 #526224
>>525764
А что на счёт precompiled headers?
Как с ними правильно работать?
#71 #526279
>>526224
Я никогда не пользовался, самому интересно. Но вроде это какая-то ебала, хороша только когда очень много гигантских хедеров, ибо из-за предкомпиляции накладываются ограничения.
#72 #526286
Платиновый вопрос, как перекатиться с шарпа на кресты?
324 Кб, 380x380
#73 #526302
>>526286
Каков вопрос..
#74 #526350
Поясните, что в ++ значит << или >> ?
Как я понял - это символ перемещения переменной в? Или как?
#75 #526353
Как лучше всего создать гуи?
#76 #526363
>>526350
Побитовый сдвиг числа влево и вправо. Например, у тебя есть char tvoya_mamka = 3, это 00000011 в двоичной системе. Ты пишешь char tvoya_babka = tvoya_mamka << 1, и бабка инициализируется значением 6, которое равно 00000110 в двоичной системе и получено сдвигом влево на один бит. Это можно использовать для умножения на степени двойки, ибо сдвиг иногда работает быстрее настоящего умножения.

Поскольку операции сдвига можно перегружать, а сдвиг с правым аргументом, не являющимся целым числом, смысла не имеет, было решено использовать их как операторы ввода и вывода, когда справа стоит что-то кроме целого числа.
#77 #526365
>>526353
WinAPI - единственный легитимный выбор.
#78 #526367
>>526363
Т.е. это операторы ввода и вывода? А как они точно описываются?
Я их использую для cin или cout, например:
cin >> var;
Т.е. ввожу что-то в вар.
cout << "test";
Ввожу что-то в команду вывода.
Так?
#79 #526371
>>526367
[code lang="cpp"]
std::ostream & operator<< (const TvoyaMamka & mamka)
{
//...
}
[/code]

Вот стандартная сигнатура перегруженного для класса TvoyaMamka оператора. Внутри оператора может быть что угодно, стандарт не обязывает делать именно ввод и вывод. Но обычно ты внутри каким-то образом форматируешь члены класса и вызываешь операторы вывода для них. Они, в свою очередь, выводят свои члены... Когда доходит до примитивных типов, например, double или int, вызываются стандартные функции <<, которые используют низкоуровневые функции вывода, зависящие от операционной системы.
#80 #526372
>>526371
Obosralsya, конечно же
[code lang="cpp"]
std::ostream & operator<< (std::ostream & stream, const TvoyaMamka & mamka)
{
//...
}
[/code]
#81 #526376
>>526365
Перетолстил.
#82 #526409
>>526134

>А Лафоре/Прата рассказывают только про ножовку


... для ньюфагов это очень плохо. Я это говорю фактически как ньюфаг. Надо наступить на максимальное количество граблей, чтобы потом действительно оценить разбиение на функции и прочие ножовки сто страниц спустя.

>>526210

>ну тем не менее это нужнее, и после них Стратоуструпа можно просто пролистать просмотреть листинги


... и совершенно не понять эволюцию его кода в том же калькуляторе. Т.е. ты сможешь его править, а переписать целиком вряд ли. А я переписывал, вот. Но самое главное, я понимаю, как он работает. Потому что перекусил анусом много ржавых труб.

>>526210

>и я наверное целый месяц осмысливал первую программку где калькулятор предлагает сделать


Если ты и про шестую, и про седьмую главу вместе, то ты просто гений. Я над шестой главой месяц ебался, кажется.
#83 #526416
Скажите мне, это STL такое говнище, или я как-то неправильно ей пользуюсь?
Возникала тут задачка на работе, которую численными методами решить надо было, с хуйлиардом входных данных. Я прикинул - а оно всё на мапы и векторы идеально ложилось. Ну я и набросал за пару дней няшную компактную програмку, отдебажил, запустил на реальных данных, и сел ждать результаты первой порции. И что-то как то МЕДЛЕННО. Запускаю профайлер - а оно 99% времени проводит в вызовах map.
В общем, я охуел и выкорчевал нахуй весь stl-код из проекта, после чего всё стало работать в стопицот раз быстрее. Ну вот как так? Или STL вообще не предназначена для высоконагруженных приложений?
#84 #526417
>>526217
>>526409
да про нее. Я тогда был школодроном с максимализмом и не пониманием как можно что то учить самому, и только после бейсик. Зашел в магазин и увидел этот монолит Стратоуструпа на полке, купил. Вроде бы все было легко до ебучего калькулятора, там я месяц сидел в отладчике и пошагово выполнял каждую команду, и где то спустя чуть более месяца на меня наконец то снизошло озарение, как же там блять все работает. Потом где то до середины досчитал и бросил, вернулся к ней только на втором курсе.
#85 #526419
Как сделать, чтоб указатель указывал на переменную-защищенный член класса? Метод clss::a(int* pointer) { pointer = &clssVar; } сработает? Или надо адрес переменной возвращать? Как вообще все эти функции и методы с переменными работают? Копируют значения или читают по реальным адресам?
#86 #526434
>>526416
Ну что за задача-то? Вроде умный человек, решаешь какие-то задачи, а никакой конкретики нет. STL писали для быстрой работы с памятью в 90% стандартных ситуаций. Может, ты просто не умеешь её готовить -- я имею в виду выбрать правильный контейнер для твоих задач.
#87 #526439
>>526416

> выкорчевал нахуй весь stl-код из проекта, после чего всё стало работать в стопицот раз быстрее


На что заменил-то?
#88 #526441
>>526416
Предназначена. Но надо понимать, а не просто бездумно укладывать все на контейнеры. Если у тебя там были, блядь, поэлементные присваивания этих векторов, а вместо unordered_map с грамотной хэш-функцией обычная map с ключами из string, когда при каждом обращении к элементу идет O(log(n)) сравнений строк, то удивительно бы было, если бы оно быстро работало.
#89 #526444
>>526419
Сам указатель-параметр копируется, а то, на что он указывает - нет. Если присвоить что-то разыменованному pointer, то оно запишется по реальному адресу, навсегда. Если присвоить что-то самому pointer, то изменится только копия параметра внутри функции, после выполнения никакого эффекта не будет. Чтобы был эффект, нужно сделать
[code lang="cpp"]
int clss::a () { return &clssVar; }
//либо
void clss::a (int
pointer) { pointer = &clssVar; }
[/code]
Второй вариант удобен, когда таких указателей несколько, чтобы не пихать их все в возвращаемое значение. Делать изменение по ссылке типа int & pointer некошерно, ибо можно выстрелить себе в ногу.
#90 #526446
>>526376
Но ведь так и есть.
#91 #526481
>>526444
Во втором случае будет ошибка "int* to int", pointer - указатель на int, а не просто Int.
#92 #526500
>>526481
&classVar это указатель на int
pointer это указатель на указатель на int, разыменованный pointer это указатель на int.
Как что все там нормально будет, присваиваются указатели на int.
#93 #526549
[code lang=c++]
//raw - указатель на QDataStream
raw->readRawData(temp, 4);
[/code]
Выдает ошибку
[code]
invalid type argument of unary '
' (have 'int')
*raw->readRawData(temp, 4);
^
[/code]
Что я делаю не так?
#94 #526550
>>526549
Либо ты делаешь *raw.readRawData, либо raw->readRawData.
872 Кб, 949x1453
#95 #526572
Такой вопрос.

Почему многие рикаминдуют сначала выучить С, чтобы потом учить С++? Ведь это разные языки, и если тебе надо С++, то не проще сначала учить то что надо, а потом уже посмотреть его отличия от того же С?
Ну, я ещё понимаю советы для ньюфагов, которые ничего не понимают в программирование, но если взять уже человека который понимает что-то, нахуя ему С учить?

Поясните позязя.
#96 #526575
>>526572
Учи Си, лентяй. Всё верно тебе советуют.
#97 #526601
>>525225 (OP)
Плюсобоги, помогите, гугл ничего не дал, да и скорее всего не даст, так как это что-то странное.
В чем суть:

Есть конструктор класса. Туда агрументом я передаю указатель на рендерер и хочу чтобы он сохранился в 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 таки становится равен переданному значению. Конечно, можно для каждого экземпляра вызывать эту функцию, но это какой-то костыль
#98 #526605
>>526601
SDL_Renderer N_Texture::ren

и еще

N_Texture::N_Texture(SDL_Renderer
renderer)

самофикс
#99 #526606
>>526575
Что ему правильно советуют?
#100 #526613
>>526601
помогите, почему в конструкторе присваивание не происходит, а в функции происходит?

У меня конечно есть подозрение, что это из-за того что я объявляю экземпляр ВНЕ блоков(т.е. не в main или любой функции). Но как тогда вызывать конструкторы глобальных переменных?

А то у меня будет этих N_Texture просто гора и для каждой вызывать setRenderer...это просто стена кода будет. А если нету иного пути, можно это сделать как-то красиво?
#101 #526626
>>526613
Глобальные переменные определяются не всегда по порядку. Можешь создать вспомогательный класс, установить в нем renderer один раз, а потом просто вызывать метод N_Texture Factory::N_Texture() { return N_Texture(renderer); }, можешь запилить статичную переменную-член и установить её значение в main(), можешь запилить отдельный глобальный класс, а потом просто читать из него renderer каждый раз, когда понадобится.
#102 #526646
>>526572
Я бы не сказал что это разные языки. И в проекте написанном на C++ можно ебаться в сраку с битами и указателями. Просто если не хочешь быть тупой макакой которая просто складывает программу из непонятных ему кусков, лучше изучить более низкоуровневый язык, для того чтобы знать что стоит за всей этой хуйней.
81 Кб, 775x415
#103 #526652
почему не работает?
#104 #526654
>>526646

>Я бы не сказал что это разные языки.


Там даже фигурные скобочки разные.
#105 #526656
>>526654
Какие скобочки блять?
#106 #526668
>>526656
На той же строке справа вверху, не видел штолле?
#107 #526721
>>526668
Нихуя не разные. Ты можешь всю программу в одну строку написать, что в Си, что в C++. Это вопрос только стиля, куда ставить скобочку.
#108 #526738
Не могу нагуглить сам. Накидайте код дискретного преобразования Фурье (ДПФ) для одномерного массива значений произвольной длины. ДПФ, подчёркиваю, т.е. мне не нужно гнаться за n X log(n). Хочу просто увидеть несколько строчек преобразования Фурье, скажем, для int_array размера array_size. Будем считать, что значения int_array отстоят друг от друга на единичку.

Что мне нужно на выходе? Массив амплитуд или мощностей (энергий) частот. Ради такой мелочи не хотелось бы возиться с подключением fftw.
#109 #526742
>>526738
А почему такое не подходит, например?
http://www.nayuki.io/page/how-to-implement-the-discrete-fourier-transform
#110 #526745
>>526742

>А почему такое не подходит, например?


Потому что я не умею гуглить? Вообще,

>We will use the Java programming language to illustrate.


Но я думаю, разберусь. Спасибо.

А по каким ключевым словам искал, что нашёл именно то, что нужно?
sage #111 #526749
>>526745
Блядь, там на Си есть. Сажи мне и говна.
#112 #526903
Есть массив байтов, в нем лежат по порядку:
1. тип элементов в виде строки
2. количество элементов
3. сами элементы подряд

Нужно засунуть элементы в вектор. Как это лучше сделать?
#113 #526921
Реквестирую книгу по алгоритмам и структурам данных с нуля и примерами на С++ уровня выучил за 21 день. Также реквестирую гайд по оптимизации не улучшения читаемости и красоты программ на С++ не изменяя алгоритм их работы.
#114 #526939
>>526921
Algorithms in C++, Third Edition
Есть на рюском, но как обычно с переводом уровня гуглтранслейта.
#115 #526941
>>526939
Я похож на знатока английского? Есть то что хорошо на русский переведено?
#116 #526944
>>526941
Ну тогда самое время начать его учить, потому что это самый главный язык на погроммиста.
В душе неебу, не читаю корявые переводы уже давно, но до этого встречал всего пару раз не полное говно
#117 #526945
>>526944
Спасибо. Тогда её и почитаю. Но на русском. Там 2 книги вроде. Они же на разные темы и читать обе? Или это я не третье издание нашёл?
#118 #526947
>>526945
Там 5 частей разбили на две книги просто.
#119 #526953
>>526372
Забыл упомянуть, что оператор надо сделать friend к TvoyaMamka.
35 Кб, 437x556
#120 #526981
Поясните за программу на пике. Почему начало вызывается int foo::count = 0; а только потом конструкторы?
#121 #526988
>>526939
Погоди. Там про оптимизацию не написано.
#122 #526996
>>526981
Ну он же «static» всё-таки...
#123 #526997
>>526981
int foo::count находится в глобал скоупе. В глобал скоупе нельзя создавать экземпляры класса.
#124 #526998
>>526996
>>526996
Понял. А что было бы если бы foo f1,f2,f3; Было в глобальном пространстве имён? Имело ли значение до или после int foo::count = 0; они объявлены?
#125 #526999
>>526998
>>526997
Тебе тоже вопрос.
#126 #527000
>>526903
Вектор union'ов, читаешь количество элементов, потом создаешь вектор с помощью указателей на первый и последний элемент.
#127 #527001
>>527000
Не, в цикле заполняешь вектор
#128 #527015
>>526953
Наоборот, это вредно, как правило. Потому что сериализовываться, по идее, должно только видимое извне состояние мамки. Внутри могут быть служебные данные, которые негоже использовать при выводе. Лучше сделать публичный метод у мамки, который вернет все,что необходимо напечатать.
#129 #527018
>>526997
Схуяли нельзя? Можно, просто порядок вызова конструкторов статических членов не определен. Гарантируется, что это произойдет до первого обращения емнип. Это и сюда >>526998 ответ, поведение будет unspecified а может даже и undefined, хуй знает, вот это было бы здорово прояснить, потому что неизвестно, в каком порядке они инициализируются.
#130 #527021
>>527018
Чтобы таких проблем не было надо пиать static int count=0 и не заморачиваться с отдельным объявлением и определением? Когда полезно писать так как на том пике?
#131 #527023
>>527021
Ну не знаю, какие-нибудь настройки хранить, когда одни параметры зависят от других. Конечно, можно и нужно юзать синглтон тогда, но общее направление понятно.
#132 #527129
>>525935
Нахуй пошел, говорю.
#133 #527185
Котоны, решил тут подтянуть немного скилл и поиграться с dll-inj и написать какого-нибудь бота.
С инжектом и хелловорлд-длл всё получилось, но вот как из этой длл мне читать нужные значения и дёргать нужные ф-ии - я нихуя не понимаю.
Может кто-нибудь тут уже занимался подобным долбоебизмом?
#134 #527187
>>527015

> сериализовываться, по идее, должно только видимое извне состояние мамки


Схуяли? Если сериализовать только видимое до десериализовать нельзя будет, объект не полный же.
#135 #527212
>>527187
Речь не идет о том, чтобы сериализовать только публичные члены-данные. Просто за установку приватных данных должны отвечать методы самого класса, если это возможно.

[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]

Если дать сериализующим функциям доступ к внутреннему состоянию объекта, то они легко могут сделать вес мамки в тоннах несоответствующим весу мамки в килограммах и нарушить инварианты. Чтобы этого не было, необходимо контролировать весь дружественный код, чтобы тот поддерживал инварианты, легко запутаться.
#135 #527212
>>527187
Речь не идет о том, чтобы сериализовать только публичные члены-данные. Просто за установку приватных данных должны отвечать методы самого класса, если это возможно.

[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]

Если дать сериализующим функциям доступ к внутреннему состоянию объекта, то они легко могут сделать вес мамки в тоннах несоответствующим весу мамки в килограммах и нарушить инварианты. Чтобы этого не было, необходимо контролировать весь дружественный код, чтобы тот поддерживал инварианты, легко запутаться.
#136 #527250
Всем сап
Вот у меня как у новичка вопрос:
Прочитав эти книг из оп поста, есть шанс реально стать программистом, и нормально зарабатывать?
#137 #527289
>>527250
Нет.
#138 #527293
>>527289
Не траль, плз.
#139 #527296
>>527293
Ну если будешь ебошить - будешь зарабатывать.
#140 #527304
>>527250
Книги из оппоста это не необходимое и не достаточное условие. У каждого свой путь же. Однако собранные в одном месте хорошие материалы всегда полезны, особенно для новичка, который не знает с чего начать.
#141 #527336
>>527304
Ну вот я новичок, тот самый кто поднял этот вопрос. Прочитал книгу "С++ за 21" купил Прата. Читается и вроде понимается. Прочту. А что дальше?
#142 #527347
>>527336

> А что дальше?


Джосаттиса можно, как раз 2ое издание пару лет назад вышло.
У Майерса есть советы по С++ аж 3 книжки.
39 Кб, 240x320
#143 #527350
>>525307
Подрастешь - узнаешь
540 Кб, 1920x1080
#144 #527351
Плюсаны, киньте пожалуйста ссылку на док или книгу, где показано, как расположены объекты в памяти со всякими vtable'ами, выравниваниями, наследованием и проч. Чтобы с картинками и пояснениями.
#145 #527352
>>527347
Не три, а четыре. Последняя очень годная, которая на английском в оппосте. Ее кстати обещали выпустить на русском в ближайшем месяце уже.
1 Кб, 812x194
#146 #527353
>>527351
В общей куче они расположены.
Куча, она же heap — двусвязный список.
Эндрю Таненбаум, «Операционные системы» и «Архитектура компьютера».
#148 #527356
>>527353
Он не про кучу спрашивал, а про взаимное расположение частей объекта. На стеке то же самое будет.
#149 #527363
Господа, возник вопрос немного не по теме треда, но все же думаю стоит задать его здесь, тем более что Си-тред я чего-то не нашел.

Я тут выяснил, что первая цивилизация, написаная на голом Си без плюсов, имела разные форматы сохраненок со звуком и без. Соответственно, игру, начатую со звуком, без звука продолжить было невозможно.

Как вы думаете, откуда возникла такая поебота?
#150 #527368
>>527363
Си тред есть, вот он: http://2ch.pm/pr/res/518562.html

Хуй знает, если возможность сделать звук была изначально, то даже не знаю, зачем такое нужно было делать. Вполне возможно, что какая-нибудь бета-версия была без звука, а потом, когда добавили звук, сохраненки получили новый формат, который из-за криворукости кодеров был несовместим со старым. И решили оставить оба. Но это только моя догадка, я вообще про это в первый раз слышу и нагуглить ничего не смог.
#151 #527373
>>525418
using namespace std делают только школьники
#152 #527379
И я такой к вам с милашковопросами.

Расскажите, господа, как грамотно работать со сценой и айтемами в Qt. У меня есть поле из квадратиков, по квадратикам ходят разные ребята. Кто должен думать, как ребятам ходить? Вроде по абстракции сам айтем должен решать, как ему выбирать путь. С другой стороны, он не знает о других айтемах ничего, а сцена знает. Получается, она должна давать ему маршрут?

Еще вопрос с обработкой столкновений. Вот два айтема столкнулись. Как они должны взаимодействовать? Нужно просто проходить по collidingItems и дергать у каждого функцию "обработать столкновение", передавая туда все нужные параметры типа, не знаю, шкварит ли айтем при соприкосновении? Или этим тоже должна заниматься сцена, самостоятельно дергая айтемы за нужные веревочки?

В общем, интересно понять, как с этой системой работать нормально, не делая тонны костылей.
#153 #527380
Вдогонку: чтобы осуществлять взаимодействие по шагам, мне нужно каждый такт игры дергать какую-то функцию у QGraphicsItem, которая будет запускать дальнейшее поведение объекта. Корректно ли использовать для этого advance(), про которую в справке написано, что она для анимации? Или лучше сделать свою функцию?

Вообще, не очень понимаю, стоит ли опираться на стандартный айтем или все-таки сделать своего наследника (где будут прописаны всякие общие параметры, типа размера, который у всех айтемов одинаковый) и каждый раз кастовать к нему? Кастовать не хочется, но похоже Кьют рассчитан именно на такой педерастический подход. Я что-то не понимаю или реально так?
sage #154 #527386
ПАСАНЫ ПАЯСНИТИ ЕСЛЕ Я ПРОЧИТАЮ 100500 ГОВНОКНИЖЕК И НЕ БУДУ ПИСАТЬ КОД Я БУДУ ЗАРАБАТЫВАТЬ $9000 В ЧАС??77111!!
#155 #527407
Освобождать память при помощи delete надо только там, где ты выделял её динамически через new?
#156 #527412
>>527373
только школьники пишут что с именами как в std
вот свои костыли то можно занеймспейсить
#157 #527414
Какие есть годные способы создания гуевых программ на C++ под винды?
#158 #527415
>>527407
Нет, можешь в одном месте выделить, передать указатель куда-то и там удалить. А ещё лучше не удалять память вручную, а использовать умные указатели и/или всякие принципы владения.
#159 #527432
>>527414
кути
#160 #527435
>>527386
нет))0)))0)00
#161 #527439
>>527386
Играй в доту. Шанс получать такие деньги там выше, чем программировать.
#162 #527512
Накидайте сайтов с задачами на крестах.
18 Кб, 200x278
90 Кб, 300x426
#163 #527539
>>527512
Правда, думаю, некоторые моменты могут быть уже устаревшими.
#164 #527748
Реквестирую Шилдта "Шаг за шагом", в гугле ниосилил найти.
#165 #527770
[code lang="cpp"]
//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]

Хули не пашет?
#166 #527771
>>527770
а, ну еще и using namespace heh; в CLASS.CPP
#167 #527843
>>527748
У меня есть только бумажная, но сканера нет. Если нужно что-то конкретное из нее, то могу сфоткать, в принципе.
#168 #527855
Подскажите как искать директивы для функций?
Допустим я хочу найти какая директива подключает функцию square.
#169 #527860
>>527855
В шапке треда есть ссылка на cppreference. Там ищешь по имени функции, и сверху будет название хедера, в котором она объявлена.
#170 #527861
>>527860
Странно, функцию square не находит.
#171 #527876
>>527861
Значит нет такой функции в стандартных.
#172 #527877
>>527861
Если ты это у Страуструпа нашёл, то эту функцию тебе самому надо писать вообще-то, такой нет в стандартной библиотеке.
#173 #527890
>>525225 (OP)
У них есть не только виртуальный деструктор но ещё и чисто виртуальный деструктор, они там размножаются делением, в общем.

Недавно анон задавал вопрос в 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 и скоро будет уже!!!!
#174 #527897
Антош, мне нужно захватывать изображение из работающей игрушки, чет гуглил-гуглил, не осилил. Работаю в куте, хелпаните плз.
Более детально:
Открыто окно с игрой, программа получается цветные кадры из этого окна, для их последующей обработки.
#176 #527943
>>527890
Ну как бы да. Но нахуя ты сюда это принес, это же азы, лол. Чисто виртуальный деструктор может быть, почему бы и нет, но он в итоге должен быть определен, поэтому его определяют либо в каждом потомке через ::, либо вне объявления класса в .cpp файле (синтаксис не позволяет определять чисто виртуальную функцию на месте). Поэтому обычно так делают только когда других чисто виртуальных методов нет, а запретить создание объектов из-за абстрактности хочется.
#177 #527946
>>527890
Нееет, тут виртуальный деструктор может быть не замешан вообще. Суть такова: когда ты делаешь класс с pimpl-членами то есть в классе вместо членов указатели на них, это позволяет работать в хедере с неполными классами и уменьшить время компиляции, хэдеру не нужны полные типы для этих указателей и объявлений функций. А конструктору и деструктору - нужны, потому что они должны уметь создавать и удалять их например, когда через unique_ptr хранится это все, и конструктор инициализирует через make_unique. Конструктор обычно с телом и, понятное дело, выносится в .cpp. Но деструктор тоже выносится, несмотря на пустое тело, потому что он должен неявно вызывать deleter у unique_ptr'ов, а этот deleter, естественно, требует, чтобы объект, на который указывает unique_ptr, был полного типа. Поэтому пустой деструктор тоже выносится в .cpp, только потому что в .cpp подключаются все нужные хэдеры и тип становится полным, а не предварительно объявленным. Такие дела. Перепости это туда, где спрашивали, интересный вопрос же.
736 Кб, 2000x1086
#178 #528162
Скажите, а вы на С++ только игры программируете ?
sage #179 #528163
>>528162
Сайты пишем, сынок.
#180 #528173
Так что, даже когда класс-интерфейс пишешь тоже надо к нему .срр приделывать и туда деструктор выносить?
6 Кб, 455x369
#181 #528281
Поясните за интересную вещь, почему при запуске этйо программки проигрывается какой-то звук?
Конкретно я заметил что на 137 звука нет, на 138 есть. Такой как ПИК!
#182 #528282
>>528163
Но ведь сайты пишут на хтмл + цсс + пхп?
#183 #528304
>>528281
Очевидно, что символ с кодом 137 используется для проигрывания звука (предупреждения) в терминале.

Алсо, ты занимаешься хуйней. Сразу выкинь using namespace, "\n" замени на std::endl, а еще установи ОПЕРАЦИОННУЮ СИСТЕМУ, чтобы не было setlocale и _getch.

мимопроходил
#184 #528306
>>528304

>Сразу выкинь using namespace


Без него не работает.

>"\n" замени на std::endl


Поясни где про это узнать?

>а еще установи ОПЕРАЦИОННУЮ СИСТЕМУ, чтобы не было setlocale и _getch.


На какую? У меня 7. Есть еще ноут с линуксом, но как я понял - лучшая де для с++ это вижуал, а его на линуксе нет?

Поясни пожалуйста, я, просто, недавно начал читать учебник...
#185 #528410
>>528173
Б-же упаси. Я же говорю, это специфические случаи. Когда у тебя настоящий интерфейс без хуев и нестатических членов, то, как правило, кроме деструктора есть еще чисто виртуальные методы иначе пустой интерфейс нахуй не нужен, лол. И тогда тебе не надо делать деструктор чисто виртуальным, достаточно просто сделать виртуальным, с пустым телом и без выноса в .cpp.
#186 #528417
>>528306

>не работает


Либо пишешь using std::cout и т.п. для всего, что используешь из стандартной библиотеки, либо ничего не пишешь, а в местах использования пишешь std::cout вместо cout. Это классика, блядь.

>где узнать


В шапке есть ссылка на cppreference, там можно в поиске вбить любую сущность и посмотреть.

>на какую


Если у тебя спермерка + VS, то никаких setlocale быть не должно, окстись. Все итак работает если ты не ломал настройки, хуиная голова. getch тоже не нужен, IDE автоматически добавляет "нажмите любую клавишу", только запускать надо из самой IDE, а не кликом по бинарнику, блядь.
#187 #528418
>>528304
Не надо заменять '\n' на std::endl просто так. endl сбрасывает кеш вывода. В цикле может здорово просадить производительность.
#188 #528420
>>528282
Еще js забыл. Вместо него мы тоже можем. http://www.cocos2d-x.org/wiki/How_to_bind_C++_to_Javascript
#189 #528433
>>528418
Добра тебе, я не знал.
#190 #528441
>>528417

>Либо пишешь using std::cout и т.п. для всего, что используешь из стандартной библиотеки, либо ничего не пишешь, а в местах использования пишешь std::cout вместо cout. Это классика, блядь.


Где про это почитать? Я учусь по книге Страуструпа, там нет такого, сейчас удалил namespace std; Заметил что теперь пишет на vector без std:: что он не идентифицирован.
Поясните смысл этого, в книге не написано.

>Если у тебя спермерка + VS, то никаких setlocale быть не должно, окстись.


У меня русские буквы в терминале без локала отображались как крякозябры, сетлокал исправил всё.

>getch тоже не нужен, IDE автоматически добавляет "нажмите любую клавишу", только запускать надо из самой IDE, а не кликом по бинарнику, блядь.


У меня такой код без getch запускается и сразу закрывается:
int main()
{
std::vector<int> v;
v.push_back(2.7);
v.push_back(5.6);
v.push_back(7.9);
std::cout << v[1];
return 0;
}
24 Кб, 835x563
25 Кб, 848x583
#191 #528443
>>528441
Вот сетлокал.
#192 #528458
>>528441

>где почитать


В книге это есть в разделе про пространства имен.

>кракозябры


Когда кракозябры, нужно исправлять консоль, а не программу. Иначе гроб гроб кладбище непереносимость.

>закрывается


Ты что-то сломал. Там сверху в панели инструментов есть кнопка переключения режимов завершения, найди ее и нажми. Или Ctrl-Alt-Пробел.
#193 #528478
>>528458

>В книге это есть в разделе про пространства имен.


Пока не дошёл до туда, а в чём смысл выносить using namespace std; или сразу писать с ним? 1 вариант же проще.

>Когда кракозябры, нужно исправлять консоль, а не программу. Иначе гроб гроб кладбище непереносимость.


А что исправлять? Просто, я установил чистый ВС, в общем всё.
Хотя, я не уверен. Но в книге, в начале говорили создавать win32 приложение, а я создаю empty project. Может из-за этого?

>Ты что-то сломал. Там сверху в панели инструментов есть кнопка переключения режимов завершения, найди ее и нажми.


>Просто, я установил чистый ВС, в общем всё.



>Или Ctrl-Alt-Пробел.


Ничего не даёт.
#194 #528497
>>528478

>в чем смысл


Не захламляется глобальное пространство имен. Когда получишь первый конфликт имен из-за подключения двух библиотек, поймешь.

>что исправлять


chcp 1251 в консольке перед запуском, например. Это все гуглится легко, попробуй.

>чистый вс


У меня пару раз была такая хуйня, из-за неправильных настроек проекта. Создай новый проект в точности как описано в оппосте и скопируй код туда. Должно помочь.
25 Кб, 694x368
21 Кб, 968x439
#195 #528503
>>528497

>chcp 1251 в консольке перед запуском, например. Это все гуглится легко, попробуй.


1 пик - что выдёт.

>У меня пару раз была такая хуйня, из-за неправильных настроек проекта. Создай новый проект в точности как описано в оппосте и скопируй код туда. Должно помочь.


Сделал как в оппике, всё равно сразу пропадает.
Но у меня немного не так как там, я создаю файл *.срр как на 2 пике.
Всё правильно?
#196 #528521
>>528503
project ->Properties ->Configuration Properties -> Linker -> System, select Console (/SUBSYSTEM:CONSOLE) in “SubSystem” option
59 Кб, 849x603
#197 #528527
>>528521
Сделал, ничего не изменилось.
Там была пустая строка до этого.
Кстати, я юзаю vs pre-release 2015 candidate, может баги?
Хотя, я как-то делал тоже самое на комьюнити 2012 года, было всё тоже самое.
#198 #528537
>>528527
Такого быть не может, что не изменилось. Я только что проверил. Попробуй еще раз, и сверху выбери не Active (debug), а all configurations. Потом перекомпилируй и запускай по ctrl-f5.
26 Кб, 743x542
#199 #528540
>>528537
Да, теперь работает без getch, но русский не пашет.
#200 #528542
>>528540
А ты попробуй сохранить сам .cpp файл в 866 кодировке.
11 Кб, 618x283
#201 #528545
>>528542
Как внутри вижуала поменять кодировку?
Я саблаймом поменял на 866, вот что получилось.
#202 #528547
>>528545
Нет, это не то. Просто открываешь файл блокнотом и сохраняешь туда же, выбрав кодировку.
50 Кб, 1145x348
92 Кб, 1035x736
#203 #528549
>>528547
У меня какой-то инвалидный блокнот - 1 пик.
В саблайме я так сделал - 2 пик.
#204 #528552
>>528549
Ну тогда используй наиболее универсальное решение. Внутри все текстовые строки делаешь юникодовскими, двухбайтовыми. wchar вместо char, wstring вместо string. Работа с ними абсолютно такая же как с обычными. И для потоков ввода-вывода таки делаешь setlocale с пустыми кавычками во втором параметре. Тогда под любой системой будет установлена ее дефолтная локаль и не будет проблем, если у китайского юзера не окажется русского языка, но при этом твои сообщения останутся корректными, потому что юникод.
31 Кб, 677x932
#205 #528559
>>528552
Ставить так: setlocale(LC_ALL, "");
Такой вопрос, а если у меня вывод идёт не в переменной, а в ковычках?

Фигня какая-то с wstring, пишет такую ошибку, что не может перевести в char*.
Если удалить w, то нормально переводит, но с крякозябрами.
#206 #528561
>>528559
Надо писать L"тест", чтобы был широкий литерал сразу.
11 Кб, 548x348
#207 #528562
>>528561
Вообще, не понял зачем это, ну и ошибки:
#208 #528564
>>528562
У всех мест с кавычками так сделать надо, ну очевидно же, анон! Когда ты пишешь "твоя мамка", компилятор воспринимает это как строковый литерал const char []. Отсюда ошибки. Пиши L"...", и все будет ништяк.
13 Кб, 691x520
26 Кб, 558x494
#209 #528566
>>528564
Т.е. L ставить даже в определении?
Например, std::string test = L"тест"; ? Даже в случае когда я на русском не пишу?

У меня с wstring одни ошибки, ставил даже L перед ним, всё равно.
#210 #528571
>>528566

>ошибки


Ты опять не перед всеми поставил L, лол. Еще раз: перед ВСЕМИ строками в кавычках поставь L. L"\t", L"Median temperature: ", всеми, блядь. Хватит добавлять по одному L каждый раз и жаловаться на ошибки.

>даже в определении


Везде. Видишь открывающую кавычку - ставишь L.

>одни ошибки


Это из-за смешивания char и wchar. Если кратко, то в обычной вычислительной консольной программе не должно быть русского языка вообще. char это обычно байт, следовательно, поддержка русского языка для char строк оборачивается еблей с кодировками и ужасной хрупкостью с невозможностью ничего запустить на другой пекарне. Поэтому я советую в хэллоуворлдах, которые не предназначены специально для изучения локалей, использовать латиницу и не париться.

В серьезных программах, где требуется именно ввод-вывод на пользовательском языке, выделяют обычно отдельный модуль для этого. В нем используются только wstring, wchar и L"...", без смешивания с обычными строками. Это дает требуемую переносимость и надежность, но довольно громоздко, поэтому по возможности ничего просто не локализуют, опять же.
17 Кб, 711x883
#212 #528575
>>528571
Я уже не знаю.
Вот, простейший код, везде L" поставил, всё равно выдаёт ошибку.
#213 #528576
>>528162
Лол. Тоже зашёл чтобы спросить. Так что вы на нём делаете?
#214 #528577
>>528575
wcout вместо cout же. Я в тебя верю, анон, еще немного и ты скомпилируешь его. Как же я проигрываю.
#215 #528579
>>528576
Вот такое, например. Твой змей одноглазый может так?
http://nz2wy3dsn52xizi.mv2s433sm4.cmle.ru/mirrors/analogliterals/analogliterals.xhtml
26 Кб, 891x602
#216 #528581
>>528577
Хм... Вроде, получилось. Спасибо.
Но я не тролль, как тут написал кто-то:>>528573
Просто, я недавно начал учить язык, сейчас изучаю векторы по Страуструпу.

Ты тоже программируешь на С++, так?

Кстати, подскажи еще 2 вопроса:
1. Как сделать так, чтобы >>528521 это ставилось во все проекты автоматически? Я сейчас создал новый, там была эта строка пустая.
2. Можно ли как-то в ВС переключаться между проектами? А то я пока делаю так: закрываю текущий, открываю новый.
#217 #528583
>>528579

>nz2wy3dsn52xizi.mv2s433sm4.cmle.ru


Что за странное название у сайта.
#218 #528584
>>528581
Да не за что. Обращайся, тред для того и висит.

>автоматически


Оно и должно автоматически, по идее. Возможно, это из-за того, что не релизная версия. На релизных 2010, 2013, 2015 ставится всегда.

>переключаться


Неа, вроде никак. Но можно открыть вторую копию студии, будет два окна с разными проектами.
#219 #528585
>>528583
Это анонимайзер, оно залочено в рассеюшке. Власти скрывают существование пользовательских литералов!!!111
#220 #528586
>>528579
Что это?
#221 #528588
>>528586
Многомерные литералы, можно делать программу с картинками, которые сами компилируются в код.
#222 #528592
>>528588
Это как? https://ru.wikipedia.org/wiki/Piet Поясни по русски.
#223 #528594
>>528592
Ты вместо Rectangle <int> {5, 4}; пишешь
[code lang="cpp"]
o-----------o
! !
! !
! !
! !
o-----------o
[/code]
#224 #528595
>>528594
Разметка проебалась, ну и похуй.
#225 #528605
>>528594
Есть описание на русском для аутистов?
#226 #528613
>>528594
Ебать, почти visual autolayout, может даже круче. Хотет.
#227 #528640
>>526572
Учи сразу C++, а то будешь писать на C++ в стиле C.
#228 #528654
>>528605
Нет, но там все просто же. Гуглом переведи, делов-то.
>>528613
Там есть ссылка на файлы, подключай и вперед.
Огромные талмуды #229 #528714
Аноны, у меня тут лежит Прата размером с войну и мир, и почти такая же здоровая по Qt4 Шлее. Инглиша не знаю, поэтому приходится ебаться с таким пиздецом. Сил нет, лень, сука. Хочется взять и что-то как-то начать осваивать быстро, интенсивно, без повторения материала и тысяч страниц. Что-то вроде learnxinytimes только более подробно и по всему языку от и до. Чуть-чуть программировать умею, поэтому утомляет в десятый раз читать объяснения про то, что такое if-else, а среди этих объяснений умудрились затесаться важные вещи. Как быть? Может Специалиста по крестам скачать? Повторюсь, инглиша не знаю.
#230 #528715
>>528714
http://cmcmsu.no-ip.info/2course/
Читаешь все за 4 семестр, что относится к C++. Делаешь практические задания оттуда же. В качестве справки используешь талмуд и книги из оппоста. Когда сделаешь - считай, что начало пройдено, и можно уже читать Мейерса и остальное в оппосте.
#231 #528716
>>528715
Нихуя они ебашат.
Ты не понял вопрос, по-моему. Я спросил, как поменьше читать, а не как побольше читать.
#232 #528741
>>528716
Там получается около десяти презентаций, они совсем маленькие. И вот эта книжка, чуть больше ста страниц: http://cmcmsu.no-ip.info/download/cpp.base.oop.pdf Если ты это не можешь осилить, то я даже не знаю.
#233 #528744
Здарова, чуваки, добрался я до главы с передачей аргумента функции ссылкой. (читаю Страуструпа для зеленых)
Там он расписывает, мол так и так, когда нужно использовать, когда необязательно.
И появился вопрос, а есть ли разница в скорости передачи аргумента в функцию между:
- Ссылкой и обычным копированием значения в функцию (при условии, что передается обычное число, а не какой-то массив или вектор etc.)
- Ссылкой и константной ссылкой.

Надеюсь, что не слишком тупые вопросы написал.
#234 #528752
>>528744
1. Ссылка преобразуется в указатель, указатель по размеру обычно как int. Если что-то меньше int, по значению быстрее все равно не факт что будет, выравнивание, все дела.
2. Одинаково, константность ни во что не компилируется.
#235 #528762
>>528752

> 2. Одинаково, константность ни во что не компилируется.



Не всегда. Компилятор может положить константу в read-only memory для ускорения доступа.
Вообще, хороший тон - использовать константные ссылки как можно чаще. Неконстантная ссылка = выходной параметр.
#236 #528778
>>528741
Всё, извини, не разобрался. Про Qt что-нибудь скажешь? Может что-то подобное есть?
Ты как это на такой сайт набрел? Много в рашке такого, лол? Ну, выложенных материалов с годных вузовских семинаров, лекций...? Кроме очевидного интуита?
#237 #528784
>>528762
Ты путаешь константы и константные ссылки. Константность ссылки не значит ничего абсолютно в ассемблерном коде, объект уже создан в другом месте, константный или нет - все равно.
#238 #528786
>>528778
Я набрел на этот сайт главным образом потому что я учусь на там и в свое сдавал экзамен по этому курсу точнее, получил автомат, но энивей.
За куте не скажу, мне он не очень нравится, и я не особо интересовался. У них вроде неплохая документация, но она на ангельском, конечно же.
#239 #528790
>>528786
А чем qt плох?
Лол, не лень было поступать на такой дроч?
#240 #528792
>>528790
Слишком громоздкий, можно то же самое делать без ебли на специализированных библиотеках.
Тяжело в дрочении, легко в бою.
#241 #528807
>>528792
Это как? Разве он не наоборот объединяет тонну говн - звук, регэкспы, многопоточность, гуй в одно?
#242 #528815
>>528807
Именно из-за этого там обязательно окажется что-то, что тебе не понравится, как реализовано. Гораздо приятнее искать библиотеки по мере необходимости, не понравилась - заменил на аналогичную, и устанавливать кучу говна не надо.
sage #243 #528832
>>528815

>и устанавливать кучу говна не надо


Ага, и вместо этого надо устанавливать еще больше говна и ебаться каждый раз.
#244 #528915
>>528714
Если еще дадите каких-нибудь советов, кроме лекций и книжки выше, буду благодарен. Ну, интенсивы типа. Скажите таки что-нибудь насчет бауманского Специалиста. Говно?
#245 #528917
>>528784
Да, ты прав, перепутал
#246 #528956
>>526481
У меня тоже "[code lang="cpp"]" видно
Просто они каким-то сторонним скриптом пользуются, когда это пишут. Я так понял что Абу не будет допиливать. А тот скрипт обновляется каким-то антоном, подгружает иконки с его сайта, и прочими странными вещами занимается.
#247 #528958
Антуаны, а учебник Дейтелов уже не котируется?
#248 #528969
>>527351
В стандарте это не описано. Каждый компилятор будет их располагать по-своему. А для отладочной версии он вообще все подряд будет обрамлять опкодами прерывания, чтоб при случае выхода за пределы сразу в отладчик IDE вылетать.
как учиться #249 #528990
Посоветуйте способ фиксирования знаний? Исходники с комментариями писать, тетрадку вести, файл текстовый или вордовский? Как конспектировать информацию, короче? Чтоб вот если забыл все после перерыва, прочитать и все вспомнить? Учу кресты, разумеется.
#250 #529004
Скажи, программач, не натыкался ли ты на реализацию A(звездочка) + Jump Pont Search на плюсах?
#251 #529068
Реквестиую книгу по оптимизации кода без изменения алгоритма работы и не важно на его красоту и читаемость. Мейерс не подходит. Т.к. ам ещё советы про читаемость и переносимость.
#252 #529077
>>527351
Ищи статью в RSDN magazine про vtable и прочие страшные штуки.
За много лет общая идея не изменилась, разве что компиляторы стали лучше оптимизировать все это и избавляться от лишних промежуточных сущностей.
#253 #529094
>>528915
Я не видел интенсивов по крестам и, если честно, сомневаюсь, что они существуют. Понимаешь, анон, кресты это сложный и объемный язык, его надо осваивать вдумчиво и серьезно. Все рассказы про 21 день это полный бред, так только питон можно выучить. Точнее, ты можешь за 21 день выучить синтаксис и простейшие примеры порешать, и такие курсы, несомненно, есть, но это ничем не лучше прочтения какого-нибудь самоучителя для ньюфагов, да чтоб потоньше. Но духу языка ты так не научишься, однозначно. Так что лучше сначала набрать базовые знания, а вот уже потом есть и годные книжки про детали, и мастер-классы тот же Мейерс ведет на ангельском, разумеется, по вполне доступным ценам.
#254 #529098
>>528956
Есть же ссылка в шапке на него, ставишь Greasemonkey/Tampermonkey, качаешь скрипт и вуаля.
#255 #529099
>>528990
У меня обычный тхтшник, в который пишу хитрые детали, good practices, вопросы, на которые сам пытаюсь ответить, ну ты понел. И периодически перечитываю его. Но самое главное это писать код, только во время написания живого кода такой тхтшник быстро наполняется. Переписывать из книжки - это совсем не то.
#256 #529108
>>529068
Про макрооптимизации алгоритмов асимптотика и вот это все читай Кормена "Алгоритмы", отличная классическая книга. Она не про кресты, а вообще.
Про микрооптимизации сэкономить на сложении и всякая хуйня читай "Effective STL" Мейерса, ибо детали на крестах обычно реализуются STL, а у Мейерса там больше половины про оптимизации. Еще наверни Джоссатиса про STL, там тоже много про ее оптимальное использование, но уровень выше, чем Мейерс.
Наконец, есть неплохие книжки - "Жемчужины программирования" Бентли и "Алгоритмические трюки для программистов" Уоррена мл. Там тоже не только про кресты, но описаны всякие мелкие оптимизации.
#257 #529113
>>529099
Есть проблема: мне по роду деятельности приходится вебмакакить и там все паттерны проектирования, гуд практисес и подобное нахуй не нужны, там это только время отнимает и непонимание вызывает, ну и вообще там плюсами даже не пахнет. Плюсы для меня - хобби, хочу когда-нибудь игрушки писать. Соответственно, я могу забросить написание кода резко и хоть на полгода из-за какого-нибудь аврала, потом захотеть вернуться и быстро "вспомнить всё".
#258 #529115
>>529108
Джоссатиса про STL это второе издание?
#259 #529119
>>529115
Ага.
>>529113
А ты пили мелкие проекты, на 1-2 вечера.
#260 #529121
>>529108
Спасибо.
#261 #529123
>>529119
Лол, это какие, к примеру?
#262 #529206
>>525307
Забей на сраные коллбэки, они мало того что не интуитивны, так и еще нетипобезопасны. Посмотри в сторону Qt с сигналами-слотами, они интуитивно понятны и типобезопасны.
#263 #529209
Поясните нюфане за лямбды. В чем профит?
#264 #529212
>>529206

> нетипобезопасны.


чобля
#265 #529240
>>529123
Игоры, например. Напиши с нуля какой-нибудь рогалик, отличная практика для начинающего, и в графику не нужно уметь.
#266 #529241
>>529206
Ты заебал, как ты, блядь, прикрутишь куте/буст/tvoa_mamka_anal_interface_lib_3000, если речь идет про работу с сишным легаси-кодом? Он не понимает ничего, кроме коллбэков, поэтому классику надо знать и точка. Куте он захотел прикрутить, вообще пушка.
#267 #529243
>>529209
В том, что
[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 ();});
#268 #529247
Призываю в тред знатоков WINAPI в целом и COM в частности.
Впервые столкнулся с 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, &params, 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, который уже свободился?
#268 #529247
Призываю в тред знатоков WINAPI в целом и COM в частности.
Впервые столкнулся с 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, &params, 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, который уже свободился?
#269 #529249
>>529247
[code]DISPID dispId;[/code] в начале f1() случайно удалил
#270 #529280
>>525225 (OP)
Парни у меня возник вопрос. Может ли изменить значение приватной переменной класса функция которая передана по указателю методу класса как аргумент?
#271 #529283
>>529280
Сука. Как же проиграл с твоего вопроса. Ещё пол часа вникать буду.
#272 #529285
>>529280
Хотя вроде вник. Она же не в области видимости класса. Нет скорее всего. Сейчас проверю.
#273 #529286
>>529283
ну я вот читаю Прату. И там было задание нужно сделать что бы в классе можно было изменять переменную с помощью функции(ну либо уменьшать либо вычитать).
У меня возникло в голове несколько решений.
1) Хуярим две функции одна увеличивает другая уменьшает значение.
2) Создаем перечисление в Enume если функции значение перечисления где она внутри функции с помощью if'ов определяет что надо сделать.
3) Создаем две функции одна увеличивает, а другая уменьшает. Внутри класса один метод который принимает ссылку на одну из этих функции, и передает этой функции указатель на закрытую переменную.
Само собой вроде как второй метод оптимальный во всяком случае с моей нубо колакольник, но третий вызвал любопытство пытаюсь реализовать и не получается. Хотя возможно потому что я криворукий.
#274 #529287
>>529286

>фикс


(ну либо уменьшать либо увеличивать).
#275 #529290
>>529286
ах блять можно же одну функцию создать внутри класса где все будет складываться, но передавать туда либо положительные либо отрицательные значения.
30 Кб, 542x394
#276 #529299
>>529286
Тупонул. Если метод имеет доступ к значению приватного члена класса, то он может дать его как аргумент другой функции.
Почему в 13ой строке нельзя написать cout<<g(p)<<'\n'<<p<<'\n';?
Почему в 20ой строке нельзя написать A a.h(k);?
С++ без красноглазия #277 #529324
Программач, успокой меня. Я захотел поучиться С++, потому что мне нравится лаконичный синтаксис, производительность. я хотел бы пилить игрушки, а в современных движках используются кресты, хотел бы писать производительные корпоративные приложения или может быть даже какие-нибудь числодробильни на тему нейронных сетей. При этом при всем использовать современное ООП-api, красивые библиотеки вроде Qt и наслаждаться жизнью. Но меня тошнит от всех этих указателей на указатель, нечитаемого кода, мамотноподобного тайп-каста и подобного пиздеца. Хочу просто писать красивые, производительные программы без байтоебли, указателеебли, типоебли и п подобных развлечений. Возможен ли С++ без всего этого или мне нужно что-то другое?
>>529299
И без подобной вот блевотины "h(int(*g)(int&))" в реальных задачах?
#278 #529327
>>529324
Нет конечно, иди в шарп.
#279 #529328
>>529324
Тебе наверно шарп и юнити надо.
#280 #529331
>>529324
просто ты неосилятор. В этом нет ничего плохого, просто иди присаживайся у параши к тем ребятам с в футболочках Java и C#.
sage #281 #529334
>>529331

>к тем ребятам с в футболочках

#282 #529341
>>529327
Не нрав синтаксис, привязка к майкрософту и вообще подход.
>>529328
Думал об этом, но ну его нахер, не доставляет ни то, ни другое
>>529331
Ну да, в отсутствии контроля длины массива и введении регулярных выражений спустя 30 лет развития языка - это тоже ничего плохого, но это колхоз, а я бы не хотел быть колхозником с красными глазами, я хотел бы взять достоинства языка и забыть про недостатки.

Чего вы злые какие?
#283 #529342
>>529341

> не нрав привязка к майкрософту


> хотел бы пилить игрушки



Давай заново. Чего хочешь, что не устраивает и чего не хватает. Вместе решим что с этим можно сделать. Но язык мы вряд ли будем переделывать.
#284 #529348
>>529342
Игры можно пилить и мультиплатформенные, и на консоли, и на носимые устройства.
Это не привязка к инструментарию, разработанному майкрософтом, меняемому по желанию левой пятки майкрософта и в соответствии с представлениями этой компании о прекрасном. Нахер такое. Нахер шарп, нахер .Net, нахер Visual Studio, нахер их понимание красоты в отношении библиотеки классов. Даже ява приятнее.
Мне нравится С++, он красивый, лаконичный в целом, а особенно красив Qt. Но вот type_cast, указатели, все эти сочетания круглых скобок с угловыми, вот это вот все уже ни разу не красиво и не доставляет. Зачем оно мне? Могу я обойтись без этого? Если хочу производительно, лаконично, читабельно, удобно для написания. Стилистически мне вполне нравится lua, php, python, больше, чем ява или шарп. В первой смущает комбайновость, перегруженность, зависимость от виртуальной машины, во втором сама суть и привязка к майкрософту. Но в любом случае, python или php я к UE4 не подключу и нужно привыкать к крестам, потому что они везде и все библиотеки под кресты. Вопрос - можно ли это сделать, не одев свитер и не испортив зрение.
50 Кб, 699x629
#285 #529350
>>529348

>Вопрос - можно ли это сделать, не одев свитер и не испортив зрение.


Скорее всего нет. Указатели точно нужны.

Не совсем понял. Ты хочешь писать кроссплатформенные игры на С++, но тебе не нравиться его синтаксис? Ну синтаксис ты точно не поменяешь. Можешь попытаться библиотек или фреймворков подключить, но я не знаю каких.
#286 #529419
>>529324
Придется заниматься и вот этим всем, если понадобится писать аллокаторы, контейнеры и прочее своё под задачу. Другое дело, что можно таки писать читаемый код с помощью typedef, alias и auto, маленькими функциями. Поверь бро, это не сложно и есть даже проги которые парсят все эти многозвездочные объявления в человеком читаемый вид лол
#287 #529432
Поясните за external linkage. Как понять то, что какая-та переменная доступна в других translation unit-ах? Есть int i в глобал скоупе в одном .cpp файле. Как к нему получить доступ в другом .cpp файле?
#288 #529435
>>529299
спасибо большое, так это считается что функция из вне может изменить приватный член класса? или типа норм?
#289 #529437
>>529341
совсем поехавший там есть куча других структур которые заменяют массивы и позволяют контролировать длину строки. Просто ты неосилятор.
#290 #529442
>>529435
Она сама не может, это метод класса может вызвать эту функцию чтобы изменить свой член. Создатель класса в данном случае представляет такое API.
#291 #529454
>>529350
Ну вот смотри, все эти языки, которые я указал, им нахер не нужны указатели, к примеру. Вопрос, почему я не могу обойтись без указателей в крестах? Синтаксис нравится, не нравятся вот эти отдельные элементы.
>>529419
Вот тут можно подробнее? Про парсеры
#292 #529481
>>529435
f может изменять т.к. медот класса передают её ссылку на приватный член, а v не может изменять, а только читать т.к. медот передаёт ей только значение приватного члена класса. И никакие указатели на функцию не нужны.
#293 #529486
>>529454
Richard Bornat, «Understanding and Writing Compilers»
Terence Parr, «Language Implementation Patterns»
#294 #529489
>>529486
Про что они? Есть на русском?
мимопроходил
#295 #529492
>>529280
Нет, не может. Видимость это уровень компиляции, зависит только от места, где функцию описана. Компилятор не знает, что ты ее потом передашь в объект класса, и видимость не дает. Наоборот, если создать в методе класса лямбду и потом отдать ее другому классу, видимость останется, потому что объявлена была внутри первого класса.
#296 #529498
>>529299
1. Можно.
2. Нельзя, но если бы у тебя был только h(k) или только g(), короче, только один метод надо вызвать, то можно A ().h(k);
#297 #529502
>>529341
Просто ты начал читать какой-то хуевый учебник с начала, посмотри там в конце, про STL и C++11 должно быть. Никакого байтоебства, все на высшем уровне.
30 Кб, 505x401
#298 #529504
>>529492
Функция получает приватный член от метода как аргумент. Вроде разобрались уже.

>>529498

>1. Можно.


Когда так пишу он почему-то не обновляет значение. p уже стало 1, а он всё равно пишет 0. Так надо? Зачем? Как исправить?
#299 #529508
>>529454
Вот онлайн парсер для C http://cdecl.org/

На linux есть c++decl и cdecl, под винду не видел
#300 #529511
Программисты, поясните, я тут видел где-то картиночку, типа язык С быстрее языка С++. Но, насколько я знаю, С++ - это как надстройка над С? Или мои знания не верны?
Просто, я читал что С и С++ одинаковы в плане кода, просто, у ++ есть доп. фичи.
И, теоретически, зная С++ я знаю С - так ли это?
Правда ли что С быстрее С++?
#301 #529512
Вы реально это используете, считаете удобным и не имеете альтернатив?

>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


Зачем? Как так получилось, что все остальные языки обходятся без этого поноса, а С++ - нет?
#302 #529513
>>529511

>И, теоретически, зная С++ я знаю С - так ли это?


За неделю переучишься.

>Правда ли что С быстрее С++?


Да.
#303 #529514
>>529513

>Да.


Но почему? Ведь можно на С++ написать прогу, идеентичную С по коду, так?
#304 #529515
>>529504
cout << a << b << c эквивалентно
operator<< (operator<< (operator<< (cout, a), b), c). Порядок вычисления аргументов не определен, поэтому у тебя компилятор считывает p до выполнения g(p).
#305 #529516
>>529514
Если написать такую, то будет так же быстро, как в C. Но так никто не делает, потому что если ты хочешь писать как на C, то ты можешь написать на C, лол.
#306 #529517
>>529512

>все остальные языки обходятся без этого поноса


Без функции без аргументов, возвращающей массив из трех целых?
#307 #529518
>>529512
Такое только в дремучем posix-совместимом коде ты найдешь. Почему вы так любите обвинять крестогоспод в грехах, которые сами же выдумали?
#308 #529522
>>529516
А в целом примерно насколько С быстре ++?
#309 #529523
>>529515
В cout порядок выполнения не определён? Когда придётся использовать несколько cout чтобы такого не было? Можно как-то компилятору сказать делать всё по порядку?
#310 #529526
>>529522
Очень зависит от того, какие возможности C++ ты используешь. Если учитывать оптимизации компилятора, то, думаю, 0-20%.
#311 #529527
>>529522
Если программы одинаковые, то и работают одинаково быстро.
#312 #529530
>>529523
Не порядок не определен. Порядок вывода определен, но он может сначала, например, вычислить и запомнить самый правый аргумент, потом вывести остальные, а затем уже его. Можно добавить точек следования, самое простое - разбить на несколько операторов, как у тебя сделано, или с помощью запятой.
#313 #529533
>>529530
Покажи пример с запятыми.
#314 #529535
>>529533
cout << g(p) << "/n", cout << p << "/n";
Или cout << (g(p), p) << "/n"; если тебе достаточно вывести только само p.
#315 #529537
>>529517
Без >int ((foo)(void ))[3]
блеовотины, там это будет как угодно, "int foo[3]", к примеру, не не вот эта чертовщина тип((имя(тип))[размер]. Что за пиздарики под двойными скобками, зачем этот пиздец? И зачем выносить квадратные скобки наружу, раз уж решили всю хуйню внутрь запихать?
#316 #529538
>>529518
Извини, я тупой и не понял нихуя.
#317 #529542
>>529535

>cout << g(p) << "/n", cout << p << "/n";


Тоже самое только вместо ; стоит ,

>cout << (g(p), p) << "/n";


Это не то выводит.

Ладно. Спасибо. На нескольких cout остановлюсь.
#318 #529543
>>529535
У тебя кстати слэш не в ту сторону.
#319 #529544
>>529537
Затем, что ты видишь int (...) [3] и понимаешь, что после применения такой функции у тебя будет массив интов. Это удобно, потому что по объявлению функции можно понять, во что она превратит аргументы при вызове, а разбираться в ее работе не всегда хочется. Читать такие объявления тоже весьма легко и без всяких typedef, есть четкий алогритм, как читать изнутри наружу. "Найти имя сущности, читать вправо до скобки, читать влево до скобки, повторять, пока не кончится выражение".
#320 #529546
>>529542
То же самое, лол, но формально это одно выражение, а не два. Это критично, если ты пихаешь в какую-нибудь функцию это.
#321 #529548
>>529544

>есть четкий алогритм, как читать изнутри наружу. "Найти имя сущности, читать вправо до скобки, читать влево до скобки, повторять, пока не кончится выражение".


Точно вспомнил. Это тебе.

>>529324
http://habrahabr.ru/post/116255/
#323 #529557
Может кто помочь решить задачку?
Я, вроде, написал правильно, но результат не такой, какой я ожидал.
#324 #529563
>>529512

> Зачем? Как так получилось, что все остальные языки обходятся без этого поноса


До 8 джавы джависты, когда им требовалось передать функцию, передавали объект анонимного класса, реализующего определённый интерфейс.
Теперь они могут передавать лямбды и функции.
#325 #529564
#326 #529565
>>529512
Поясните, мне 1 кажется что первые скобки во 2 цитате какие-то кривые? В частности 2 скобка.
#327 #529569
>>529548
Спасибо, но что насчет внутренностей-то скажешь? (void ) - вот это и вообще двойные скобки нахуя? Почему не int foo [3]?
Что будет, если я захочу объявить массив массивов каких-нибудь объектов некоторого класса? Вообще же нечитаемый пиздец.
#328 #529570
>>529569

>Почему не int foo [3]?


Потому что там не массив, а функция, возвращающая массив. Что, кстати, нельзя.
#329 #529571
>>529570
Ааааа, вон оно как получается...блядь, ну реально как-то не слишком понятно. Почему тогда не написать было int [3] function foo (void)
или просто int [3] foo ()?
Зачем опять эти скобки, разделения...ебанись.
#330 #529574
>>529571
Если бы функция могла вернуть массив, то было бы int foo()[3], да. А так приходится скобками звездочку отделять, чтоб компилятор не решил, что возвращается массив указателей.
#331 #529576
Поясните, я точно не знаю как это называется - как нагуглить операторы, с которыми работает тип дабл?
#332 #529590
>>529557
Don't ask to ask, just ask.
27 Кб, 841x636
#333 #529592
>>529590
Вот код: https://bpaste.net/show/be3d38894653
Собственно, я не знаю в чём дело, проверил 2 раза. Суть в том, что если я введу слово из спамлиста - у меня qwe и test, то они должны заменится на BLEEP, но они заменяются не корректно.
Суть кода проверки на пике.
69 Кб, 1680x1018
#334 #529594
>>529592
Ты понимаешь, что у тебя выделенный кусок кода перезаписывает check во время каждой итерации цикла? В итоге имеет значение только чекнулось ли оно при последней j или нет.
#335 #529595
>>529574
УДОБНО.
Почему нельзя int& 3 foo () тогда?
#336 #529596
>>529592
А еще рекомендую использовать ключи компилятора -Wall -Wextra -pedantic и когда компилятор тебя ткнет в то, что ты используешь int'ы вместо size_t как индекс у векторов, исправить это.
#337 #529598
>>529594
Так я так и хотел.
У меня так: ЧЕК=0, берётся 1 элемент 1 массива и сравнивается со всеми элементами 2 массива.
Если во 2 массиве есть слова из 1 массива, то ЧЕК=1.
Если ЧЕК=1, то вывод такой.
ЧЕК=0.
Потом берётся 2 элемент 1 массива...

>>529596
Не понял, это одна из начальных задач по страуструпу, если что. Я пока не очень в крестах разбираюсь.
#338 #529600
>>529598
>>529598
Выделенный желтым отрывок кода по сути эквивалентен следующему:
http://pastebin.com/ZHF5LBd2

Потому что в твоем внутреннем цикле все итерации кроме последней ни на что не влияют, потому что в последней check все равно затрется новым значением.
#339 #529601
>>529600
Хм... Точно. Спасибо.
95 Кб, 784x605
#340 #529602
>>529592
Смысл закомментированного ифа до меня так и не дошел.
#341 #529603
>>529602
1 - сортирует.
2 - удаляет одинаковые слова.
#342 #529604
>>529603

>2 - удаляет одинаковые слова.


Что он делает я вижу, я смысла в нем не вижу. Впрочем это скорее всего просто я дебил.
#343 #529605
>>529604
Судя по тому что я не решил, а ты решил, ты - не дебил.
#344 #529617
>>529576
Хуй знает, но он работает со всеми, для которых это будет осмысленно. С %, возможно, не будет, с логическими тоже. С побитовыми и сдвигами должен.
#345 #529700
Вы работаете программистами или сами по себе пишете?
Как вы не отвлекаетесь от программирования? А то мне тяжело сосредоточится на програмировании.
#346 #529707
>>529700
Ну я, например, не работаю на фуллтайм, если ты об этом. Но свои проекты пилю, и по учебе довольно часто надо, ну и вообще интересно же.
#347 #529747
>>529602
1.
// for (...
{
}
2.
// for (...
// for (...
for (...
{
}
3. ???
9. PRVFEET
#348 #529755
>>529700
Работаю, senior c++ engineer. Дома для себя постоянно пишу что-нибудь.
Отношусь к программированию как к искусству, творчеству. Язык - инструмент, кисти и краски, например.
Быстро вхожу "в поток", могу всю ночь, например, решать какую-нибудь задачу, а утром пойти на работу.
Пару лет назад на хабре была статья про химеру программистов - создание и поддержка целой вселенной в голове в процессе работы.
Меняй отношение к делу. Если процесс нравится, то он затягивает.
#349 #529831
Нужен хелп, чуваки, делаю задание Страуструпа, запилил, все как требовалось и вылезает ошибка при компиляции:
Ошибка\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]
#349 #529831
Нужен хелп, чуваки, делаю задание Страуструпа, запилил, все как требовалось и вылезает ошибка при компиляции:
Ошибка\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]
#350 #529841
"#include"-ы должны быть в хэдере или в .cpp файле?
#351 #529843
>>529831
int foo не определена же. Та, что в main, будет локальной и никак не связанной с объявленной через extern.
#352 #529960
>>529841
В срр. В хедере должны быть только инклюды родительского класса (если есть) и библиотек. Это в идеале, естественно. Реальная жизнь может вносить свои коррективы, но нужно стараться как можно меньше инклюдить в хедеры - в основном чтобы было меньше перекомпилировать после изменений, и чтобы не пердолится с цикличными инклюдами.
#353 #530003
>>529841
И там и там могут быть.
#354 #530032
>>529324
Антоны тебя немного троллят. Одна из основных идей, заключенных в плюсах, это как раз демонтаж красноглазия.

Точнее, как -- в плюсах можно писать си-стайл с вот этой вот страшной ебенью, и это даже бывает нужно, но это как правило задачи, связанные с тонкой оптимизацией или низким уровнем (написание драйверов, например).

Если же ты не хочешь с этим ебаться, то для тебя в C++ есть стандартные контейнеры и умные указатели. И их вполне хватает чтобы делать все, что угодно. Я более чем одинарные указатели, например, использую крайне редко, и то только для того, чтобы запихнуть их в контейнер.
#355 #530039
Подскажите, есть дабл, нужно в него ввести число с буквами - как это сделать?
Пример - 1m.
#356 #530040
>>530039
Никак. Используй string.
#357 #530042
>>530040
Просто, так в задаче написано, я думал, но не придумал как это сделать:
Там, просто, надо будет потом операции с числами делать. У меня, в целом, есть идея через пробел писать текст. Вот текст задачи:

>Добавьте к каждому введенному числу типа double единицу измерения; иначе


говоря, введите значения, такие как 10cm , 2.5in , 5ft или 3.33m .
#358 #530044
>>530042
Переводи всё в одну единицу измерения. Время в секунды,расстояние в метры и т.д. Храни значение в дабле.
#359 #530052
>>530040
Попизди мне тут.
>>530042
Например, пишешь:
[code lang="cpp"]
//double нельзя, можно long double
//суффикс m переводит сантиметры в метры
constexpr double operator "" m (long double num) { return num * 100.0; }
[/code]
#360 #530054
>>530052
Обосрался, возвращает тоже long double, конечно же.
#361 #530062
>>530052
Не знаю, я пока изучил простейшие функции: if, for, while.
Long double 1 раз слышу.
Ладно, сейчас подумаю как сделать...
#362 #530075
>>530062
не слушай того анона. это костыль. юзай string.
#363 #530077
>>530075
А как им в этом случае пользоваться?
Кину я значения в стринг, но они же складываться не будут.
Я бы мог сделать что-то, если бы умел определять текстовую часть и цифровую отдельно.
Ладно, я уже сделаю так, что буду писать число и стринг через пробел.
#364 #530079
>>530077
Тогда структурой попробуй.
#365 #530080
>>530079
Это как?
#366 #530086
>>530080
Стринг в одном поле хранишь, а дабл в другом. Пишешь функции для их сумирования или можешь оператор + переопределить.
#367 #530087
>>530075
Наркоманы в треде. Этот "костыль" -- мощное нововведение 11-го стандарта, созданное как раз для подобных случаев. >>530062-кун, сделай через суффиксы, как делают нормальные современные пацаны.
#368 #530091
>>530075
Костыль? Костыль? А лямбды тоже костыль? Правильно, нахуя эти непонятные квадратные скобки, лучше еще один функтор именованный написать. unique_ptr тоже костыль? Деды raw-pointers с дерьмом вместе ели, и мы будем. Чего там, variadic templates тоже костыль. Нахуя нам эллипсисы непонятные, пачки какие-то, лучше через void * сделать! Стандартизация не нужна! Даешь C с классами!
>>530086
Пиздос. Я даже это комментировать не буду.
30 Кб, 913x567
#369 #530094
>>530087
Я, вообще, так сделал, по простому.
https://bpaste.net/show/4c4f17c7f50f
Можешь подсказать, а как с твоего лонг дабла сделать? Я не совсем понял.

Только понял - если вводить так как я сделал, всё верно же получается, пикрелейтед. Я думал выдавать ошибку будет, ведь разрыв по пробелу происходит?
Почему если я пишу 4ft, то разрыв всё равно идёт, а не пишет ошибку?
#370 #530102
>>530094
[code lang="cpp"]
//Пусть оператор с long double из предыдущего уже описан где-то раньше
long double distance1 = 10.0; //10 сантиметров
long double distance2 = 10.0m; //10 метров = 1000 сантиметров
[/code]
#371 #530103
>>530094
Немного не в тему вопрос, но я только задумался: если надо не считать наибольшее и наименьшее значения, а у меня всего 1 или 2 значения вбито - их надо будет считать или нет?
Вроде, 1 значение является и наибольшим и наименьшим, но я не уверен.
#372 #530111
>>530094
Если кому интересно, вроде написал программку, это конечная задача по учебнику Страуструпа в главе 4.7: https://ideone.com/lAsE78
Если что неправильно написал - пишите, я открыт для критики.
#373 #530175
не понимаю, почему в гцц не сделано sso для строк.
шёл 2015 год, а мы до сих пор имеем тормозмозные аллокейшены в каждом присваивании и в каждой подстроке
в обоссаном выжеэл студии 2003 года уже был сделан sso для строк!
вы тут про высокие материи, мол лямбды и вариадики - это прорыв, при этом для юник_птр в ++11 нет мейк_юник, при том что маке_шаред всё таки есть, надо писать километровые строки в коде и скроллить это говно по горизонтале, каждую версию ожидаешь, что избыточного кода станет меньше, а в итоге почти та же ссанина что и 10 лет назад,
ссука для сетки ни одной отдельной либы, только монстры типа буста и кьюте или нужно использовать сишное говно от системы, где кода проверки ошибок на порядок больше, чем реальной работы
#374 #530208
>>530175

>не сделано sso для строк


Ну поставь SGI реализацию, если тебе так критично.

>нет мейк_юник


>2015


Пора бы уже про 14 подумать, в нем все есть. И основные фичи реализованы в компиляторах.

>для сетки ни одной отдельной либы


Casablanca же, маленькая, шустрая, все фичи из новых стандартов поддерживает.
#375 #530234
>>530111
В сантиметре сто метров, замечательно.
#376 #530240
>>529755
Если не секрет, спали зарплату.
#377 #530263
>>530234
Почему?

>if (value == "cm")


>array.push_back(number);


>else if (value == "m")


>array.push_back(number / 100);


Если см, то добавляем так, если метры, то делим на 100.
#378 #530269
>>530263
Давай проведем анализ размерностей.
Что известно: 100 см/м.
На входе:
1. number :: см => array.push_back :: см -> ()
2. number :: м => array.push_back :: (м / (см / м)) -> ()
Раскрываем скобки: м / (см / м) = м^2 / см
Получаем несоответствие - с одной стороны push_back принимает сантиметры, а с другой - квадратные метры на сантиметр.
#379 #530293
>>525225 (OP)
Короче спрошу здесь, не хочу отдельный тред создавать.

Есть предположим ВЕКТОРЫ и МАТРИЦЫ и это все надо перемножать. На CPU это ОЧЕ долго, поэтому я хочу воспользоваться возможностями GPU. Но при этом не хочу покупать этот самый GPU, потому что он стоит денег, даже самый днищенский.

Сейчас есть процессоры с типа встроенной видюхой. Есть материнские платы со встроенной видюхой. Потенциала этого барахла хватает, чтобы показывало десктоп, делаю вывод, что должно хватит и на матрицы.

Вопросы такие.
1) Есть ли библиотеки для прямого доступа к возможностям встроенного в мать/проц GPU и если так, то на каких машинах это будет работать. Без анальных привязок и кросс-платформ.

2) Можно ли использовать opengl в таком случае и перемножать матрицы на вертекс шейдере? Какая версия opengl будет доступна? Насколько кросс-платформенно?
#380 #530304
>>530293

>1) Есть ли библиотеки для прямого доступа к возможностям встроенного в мать/проц GPU и если так, то на каких машинах это будет работать. Без анальных привязок и кросс-платформ.


Касательно Intel - только DirectCompute или C++AMP а он внутри все равно использует DC. Вроде AMP пытались прикрутить и к clang.
#381 #530306
>>530304

>DC


Это что такое?

>Intel


Хотелось бы одно решение для всех процов.
#382 #530309
>>530306

>Это что такое?


>DirectCompute


Приношу свои извинения, в глаза ебусь к вечеру.
#383 #530313
>>530111
Куда ж столько ифов, свитч же есть.
#384 #530314
>>530306

>Хотелось бы одно решение для всех процов.


ну вот попробуй это: http://www.hsafoundation.com/bringing-camp-beyond-windows-via-clang-llvm/
Там через OpenCL, поди и на AMD заведется.
#385 #530317
>>530314
Хотя там ссылки теперь ведут на Kalmar, а он, суда по всему, не будет работать с Intel. Но если тот же код скомпилить Visual C++, то запустистя на Intel. Но только под винду.
Короче хз.
#386 #530318
>>530314
А зачем здесь компилятор и что им компилировать? Если весь проект на нем пересобирать, то лучше сразу шейдер написать.

> OpenCL


Я вот о нем как раз и думал. Поясни за него. Насколько он мне подходит?
#387 #530320
>>530318
ох ты, судя по https://software.intel.com/en-us/articles/opencl-drivers#iris
они добавили поддержку OpenCL для интеловских GPU.
Значит OpenCL тебе подходит.
#388 #530322
>>530320
Я правильно понимаю, что оно не будет работать на нонейм GPU в материнке асуса?
#389 #530325
>>530322
что еще за материнка?
#390 #530328
>>530325
Конкретная модель значения не имеет.

Обычная материнка со встроенной видюхой, года так 2011 выпуска.

Я хочу использовать как можно более дешевый хардвар, но иметь доступ к GPU. Мне не нужны йоба вычисления как в крузисе, нужен параллелизм хоть какой-то.
#391 #530330
>>530328

>Конкретная модель значения не имеет.



И как мы тебе подскажем нужный софт не зная железа? Совсем аутист или тут битва экстрасенсов?
И вообще, 2015 год, купи б/у видяху за 50 баксов, даже в круизис на средних поиграешь.
#392 #530331
>>530330
Вспомнил, там nForce 630a чипсет.
#393 #530332
>>530331
Короче это древнее говно мамонта, но зато дешевое.

>50 баксов


Это удорожает конечное изделие. Или ты думаешь, я такой нищеброд, который хочет поиграть в ПАРАЛЛЕЛИЗМ и копейки считает?
#394 #530333
Поясните за поиск работы ньюфагу, стоит вообще вскрывать эту тему? Или лучше сразу выбрать какое-нибудь джава-говно без такого охуевшего порога вхождения?
#395 #530334
>>530331
>>530332
OpenCL работает на nForce 630, так что можешь набигать.
#396 #530338
>>530334
Меня не конкретно этот хлам интересует, а в целом подобный хлам как класс. Чтобы грубо говоря запустилось на любом говне, где есть хоть какое-то gpu - процессорное, чипсет в материнке, неважно.

Там чего с этим opencl делать? Фреймворк нужно ставить для конкретного типа gpu?
#397 #530341
>>530338
Вот кстати двачую вопрос. Будет ли OpenCL полностью кроссплатформенным решением? Условно говоря, везде, где есть C++ компилятор, компилируешь его исходники и используешь пусть даже и с различным быстродействием на разных архитектурах. Если нет, то есть ли в природе что-то подобное?
#398 #530343
>>530334

>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.
#399 #530345
>>530341

>Будет ли OpenCL полностью кроссплатформенным решением


Да. нужен только OpenCL драйвер для интересующего устройства на клиентской машине.
#400 #530348
>>530345
Отлично, спасибо. Тогда в ближайшее время попробую вкатиться, ибо давно пора расширять горизонты.
#401 #530349
>>530345

>нужен только OpenCL драйвер для интересующего устройства на клиентской машине



Вот это не особо радует, тупой пользователь может не сообразить.

Еще вопрос.
Современные процы все с GPU на борту идут? Самые дешевые днищенские модели у интела и амд тоже с ним?
#402 #530351
>>530338

>Меня не конкретно этот хлам интересует, а в целом подобный хлам как класс. Чтобы грубо говоря запустилось на любом говне, где есть хоть какое-то gpu - процессорное, чипсет в материнке, неважно.


Главное, чтобы железка была с GPGPU, причем с достаточной для твоего кода Compute Capability. Можно, конечно, и шейдерами на OpenGL вычислять, но это уже прошлый век, и вряд ли ты найдешь сейчас для этого нормальную библиотеку.
#403 #530352
>>530349
Ноуп, далеко не все процессоры идут с GPU.
#404 #530353
>>530349

>Вот это не особо радует, тупой пользователь может не сообразить.


У nVidia и Intel они ставятся с обычными графическими дровами, судя по всему.
#405 #530354
>>530351

>и вряд ли ты найдешь сейчас для этого нормальную библиотеку



Руками напишу в крайнем случае. Я правильно понимаю, что в этом случае будет работать почти на любой хуйне?
#406 #530356
>>530354
ну вобщем-то да. Главное чтобы не fixed pipeline был.
41 Кб, 542x542
103 Кб, 768x963
#407 #530358
>>530356

>fixed pipeline



Ну это уж совсем днище, лол.

Кстати есть очень бюджетные процы всего за пару тысяч с интел HD. Это приемлемо. Походу все-таки самый нормальный вариант на такие ориентироваться.

На тебе няшек короче, спасибо.
#408 #530364
Реквестирую мануал по инклудам, чтоб прям расписано все было и побольше примеров, а то устал перед каждой компиляцией скрещивать пальцы, в надежде, что не вылезут сообщения, типа "already declared in:"
#409 #530366
>>530364
Я так понимаю, что у тебя проблема с инклюдингом собственного кода. Просто разделяй все на хедеры и cpp файлы (если не шаблоны). инклюдить надо только хэдеры. Инклюдить можно и из хедеров, и из цпп. Во всех хедерах используй header guard, загугли что это.

А вообще можешь опубликовать свой проект, и я тебе поясню, что ты с инклюдами делаешь не так.
#410 #530369
>>530364
Google << include guard << pragma once.
#411 #530379
>>530366
>>530369
Я использую гарды, просто иногда получаются дабл и циркулярные включения. Например есть a.h с классом clА, у которого методы и члены статичные - 3 члена-класса clB, clC, clD и одна int переменная varE. То есть уже идут включения b.h, c.h, d.h. У clD есть метод, который должен менять статическую переменную-член clA. Вот и получается, что a.h включает b.h, c.h, d.h, а d.h включает a.h, который включает в себя b.h, c.h, d.h, а d.h...
#412 #530383
>>530379

>У clD есть метод, который должен менять статическую переменную-член clA.



То есть он получает clA либо по ссылке, либо по указателю? Используй forward declaration.
#413 #530384
>>530383
Нет. Он прям берет и clA::varE = 0; Ну или на крайний случай можно сделать clA::setE(0);
#414 #530387
>>530384
>>530379
Подозреваю, что у тебя ошибка в чем-то другом, либо ты что-то совсем не так делаешь.

Вот так надо, все работает. Что-то непонятно - спрашивай.
http://pastebin.com/gNBziyPy

Ключевые знания - declaration - в хедерах. Имплементейшн - в cpp файлах. Cpp файлы инклюдить никогда не надо.
#415 #530389
>>530387

>Ключевые знания - declaration - в хедерах. Имплементейшн - в cpp файлах.



Поправка - это если не темплейты. В темплейтах все через жопу, и там нет .cpp и .hpp - там все в хедерах.
#416 #530392
>>530387
А поч ты инклудишь classB.hpp и в classA.hpp, и в classA.cpp?
#417 #530393
>>530392
Потому что в таком порядке писал код. Сначала этот инклюд мне понадобился в ClassB.cpp, а потом - в ClassB.hpp. От того, что он и там и там, ничего плохого не будет.
#418 #530396
Он не понимает отличие объявления от определения. Сколько же я с этим ебался в свое время.
Объявление "чего-то" можно хоть куда напихать, главное чтоб определение этого "чего-то" было одно на весь проект. Поэтому его обычно и засовывают в .сpp
#419 #530398
>>530396
Я тоже в свое время нихуя ничего этого не понимал и ебался, ебался, ебался с круговыми зависимостями.
#420 #530399
>>530396
Это наверн если объявление с гвардами, можно понапихать. А то вспоминаются всякие already defined ошибки
#421 #530400
>>530399
Да не. Как раз таки "defined" значит определение, а forward declaration можно делать спокойно, типа

[code lang="CPP"]
class A;

class A {
private:
A* a;
};
[/code]
#422 #530436
>>529843
А как тогда правильно сделать, чтобы в обоих .cpp была видна одна и та же переменная foo?
9 Кб, 314x92
#423 #530447
>>530436
Ох уж этот Страуструп.
#424 #530454
Считается ли нормальной практикой раскидать определения классов из одного хидера в несколько .cpp файлов? Я хотел сделать разные хидеры, но оба класса используют один и тот же struct в типах аргументов методов.
#425 #530458
>>530454
Обычно так не делают. Обычно 1 хедер - 1 файл реализации.

>Я хотел сделать разные хидеры, но оба класса используют один и тот же struct в типах аргументов методов.



Не понял, в чем проблема? Инклюдь заголовочный файл с этой структурой.
#426 #530462
>>530454
Хотя не, откомпилилось http://pastebin.com/9wtmdfCg
Но вот тут непонятно: если убрать из a.h, в самом конце, #include "b.h", компилятор ругается про форвард деклар и "error: invalid use of incomplete type class B"
#427 #530463
>>530462
Пиздец. Зачем какие-то инклюды в конце хедера? Где хедер гарды?
#428 #530467
>>530462
>>530458
И я попытался посмотреть код дума3, и так понял, что там все файлы инклудят один хидер с форвард декларами и прочим, а тот инклудит все остальные хидеры. Но не понял, откуда https://github.com/id-Software/DOOM-3-BFG/blob/master/neo/renderer/GuiModel.h знает про vertCacheHandle_t

>>530463
Это не весь код, гарды есть. Но про инклуд в конце я сам не понимаю: компилятор без #include "b.h" ругается.
#429 #530468
>>530467
Очевидно, это значит, что ты где-то инклюдишь a.h и пытаешься использовать B, а b.h не инклюдишь
#430 #530469
>>530467

>компилятор без #include "b.h" ругается.


Дай угадаю, у тебя в cpp инклюдится a.h?
#431 #530475
>>528304

>"\n" замени на std::endl


Платина. Не надо так делать. Самое лучшее -- глобальная константа:

const char newline = '\n';
54 Кб, 500x589
#432 #530476
Анон, я тут начал осваивать Qt, можешь посоветовать годный учебник/туториал по этой штуке?
#433 #530477
>>530468
В a.cpp есть метод:

bool A::aaa(structA var1) {
a_b->bbb(var1);
return false;
}

вот тут и ругается.
#434 #530478
>>530477
Не понял, A и structA - разные вещи?
#435 #530481
>>528441

>пишет на vector без std:: что он не идентифицирован


Он же не знает, что ты хочешь вектор именно из стандартной библиотеки языка. Ему нужно сообщить об этом, а то вдруг у тебя самопальный вектор из говна и палок.

Алсо, не слушай его. Локаль надо выставлять (как ты и делаешь), а вместо гетча пиши православный кроссплатформенный std::cin.get(ch):

include <iostream> //std::cin / std::cout
char ch;
std::cin.get(ch);
#436 #530482
>>530478
A - класс, structA - struct StructA в a.h
#437 #530483
>>530477
Ну так ты пытаешься у B использовать метод. Чтобы его использовать, нужно знать, какие методы у него есть. А чтобы это знать, нужно заинклюдить хедер b.h
#438 #530484
>>530481

>а вместо гетча пиши православный кроссплатформенный std::cin.get(ch):


Проще Dev-C++ юзать, он окошко консоли сам не закрывает.
#439 #530485
>>530484
В Visual Studio если запускать не в режиме отладки, то тоже не закрывает
#440 #530486
>>530483
Теперь в a.cpp два инклуда: "a.h" и "b.h"
Но компилятор ругается: undefined reference to `B::bbb(structA)'
#441 #530487
>>530486
В том пастбине, который ты выложил, ничего нет про определение B::bbb
#442 #530488
>>530487
Да, все, спасибо. Это просто предупреждение от компилятора. Но теперь другой вопрос: как сделать пиздато? Чтоб как в думе - один файл заинклудил и все.
#443 #530489
>>530488
Не предупреждение, а ошибка. Предупрежедения это рекомендательные штуки, которые компилятор обычно выдает, когда подозревает, что где-то может получиться undefined behaviour.

>Но теперь другой вопрос: как сделать пиздато? Чтоб как в думе - один файл заинклудил и все.



Не ебу.
#444 #530491
>>530488
Так а что мешает сделать точно так же?
#445 #530527
>>530491
Там все запутанно.
#446 #530566
>>530475
Перетолстил, братюнь.
#447 #530663
>>530313
Я тоже сначала хотел сделать свич, но там показало что он не поддерживает этот тип переменной.

>>530269
Что-то я не совсем понял, у меня же сделано так (брал сантиметры за образец вычислений):

>if (value == "cm")


>array.push_back(number);


Если см - просто заполняем массив.

>else if (value == "m")


>array.push_back(number / 100);


Если м - делим число на 100, т.е. получим сантиметры?

>2. number :: м => array.push_back :: (м / (см / м)) -> ()


Вот тут не понял - откуда ты взял: (м / (см / м)), если у меня там м / 100 = см.
#448 #530667
>>530663
switch std::hash (str) же.
#449 #530675
>>529603
set же есть, зачем вектор? Или Страуструп из всего STL только про него рассказал?
#450 #530676
>>530663

>Если м - делим число на 100, т.е. получим сантиметры?


Вводим 2м, потом чтоб получить см делим на 100, получаем 0,02см. Косяк, правда?
#451 #530683
>>530676
Действительно, там надо было умножить, а не разделить.
Просто, странно.
#452 #530693
>>530663

>откуда ты взял: (м / (см / м)), если у меня там м / 100 = см.


В метре 100 сантиметров. 100 сантиметров приходятся на каждый метр. 100 см/м. Подставляем: м / 100 = м / (см/м).
#454 #530726
>>530719
Ну если словей мало, то да, вектор будет предпочтительней. Но один фиг книжка написана через жопу.
#455 #530737
>>530379
Циклические включения -- верный признак хуевой архитектуры. Приведи какой-нибудь пример из жизни, где такое возникает, и я попробую подсказать, как надо переделать архитектуру.
#456 #530743
>>530737
Я ебу твою мамку, твоя мамка варит борщ тебе, ты пишешь сообщение мне.
#457 #530746
>>530737
Односвязный список, в котором в каждой ноде хранится указатель на следующую ноду.
#458 #530750
>>530743
>>530746
И где там циклические включения? Я же не о циклических ссылках говорю, еба.
#459 #530757
>>530750
Цилкические включения это что вообще? И о них то ничего не говорилось в >>530379
#460 #530766
Windows-скриптинг. Вопросы к гуру.

Аноны, сабж о локальном скриптинге и автоматизации в Windows.
BATch, VBSсript, JScript, WMI и что с этим связанно.
Да, PowerShell сюда же.
#461 #530767
>>530766
Туда ли ты зашел?
#462 #530775
unsigned int ui_one = 1 ;
signed short s_minus_one = -1 ;
if( s_minus_one > ui_one)
\t\tprintf("-1 > 1 \n");

Внимание, вопрос! Какого хуя?
#463 #530777
>>530775
Знаковый тип приводится к беззнаковому. Получается uint_max > 1
sage #464 #530780
>>530775
Собирать всегда надо с -Wall чтобы таких вопросов не было.
#465 #530785
>>530780
Рекомендую -Wall -Wextra -pedantic
#466 #530967
>>530566
Не понял, что не так. У тебя код '\n' пестрит, что ли?
#467 #530968
>>530775
Классика. При сравнении знакового и беззнакого целочисленного типа более высокий приоритет имеет беззнаковый, поэтому знаковый кастуется в него. Далее минус единица превращается в UINT_MAX и победа при строгом сравнении обеспечена всегда, кроме когда беззнаковое тоже равно UINT_MAX.

Чтобы сравнивать значения, они должны быть одинакового типа. Если они разного типа, компилятор (наверно при помощи статик_каста) приводит их к одному типу. Если бы всё приводилось к знаковым, тогда значения беззнакового, превышающие INT_MAX, кастовались бы в отрицательные, и тоже были бы "меньше" любых маленьких положительных.
#468 #530969
>>530475
Лучше через дефайны в зависимости от ос выбор сделать.
#469 #530972
>>530969
Опять начинаешь, ебучий шакал.
#470 #530973
>>530775
В дополнение в вышесказанному, скажу, что беззнаковый от знакового отличаются интерпретацией первого бита. В знаковом первый бит числа отдаётся под знак, в беззнаковом - ещё один двоичный разряд числа. Так и получается, что -1 побитого равен uint_max в беззнаковом.
#471 #531073
>>530967
В константных строках не хранят \n на конце. Хранят саму строку, которую можно вывести, добавив << std::endl. Это позволяет конкатенировать строки без ебли, потому что не все строки предназначены для вывода отдельно от других и дальнейшего возврата каретки. Когда ты выводишь литерал что само по себе уже пахнет магическими константами, но в хэллоуворлдах или для отладки можно, конечно, тем более удобнее пользоваться std::endl, это лучше читается.
#472 #531078
>>530968
Знаковое к беззнаковому не приводится без сужения, поэтому компилятор кукарекнет, как сказал вот этот >>530780 благородный дон. Причем это критичное предупреждение, должно вылезти даже на W2 стандартном уровне.
#473 #531082
Пацаны, а можно ли как-то хранить в enum char-ы? Я хочу, чтобы можно было писать вот так:
[code]enum{ A1 = 'q', A2 = 'w', A3 = 'e' };
std::cout << A1;[/code]
Можно и дефайнами это сделать, но мне интересно именно через enum. Кто что думает?
#474 #531083
>>531082
Это и так можно делать - в чар кастуй их.
http://en.cppreference.com/w/cpp/language/enum
#475 #531084
>>531082
[code lang=cpp]
enum class : char { A1 = 'q', A2 = 'w', A3 = 'e' };
[/code]
#476 #531085
>>531084
Ну и имя после class, конечно же.
#477 #531086
>>531084
Опередил, содомит. Добавлю, что глобальный enum сейчас фактически deprecated из-за того что не обеспечивает отдельную область видимости.
#478 #531090
>>531083
Не, кастовать неинтересно.
>>531084
Но тогда нужно перегружать оператор<<, чтобы вывести A1?
>>531086
Какая альтернатива тогда? Чем вообще лучше пользоваться для констант? #define, enum, const, constexpr? Что для чего?
#479 #531091
>>531090
Нет.
[code lang=cpp]
enum class imya : char { A1 = 'q', A2 = 'w', A3 = 'e' };
std::cout << imya::A1;
[/code]
#480 #531093
Компилятор пишет, что отсутствует оператор<< для std::ostream << imya.
#481 #531094
#482 #531096
>>531093
Ну так сделай ostream & operator<< (ostream & stream, imya output), хуле.
#483 #531099
>>531093
Это как если бы ты написал
[code lang="cpp"]
class TvoyaMamka { using width_type = int; };
std::cout << TvoyaMamka::width_type;
[/code]
И тут и там пытаешься вывести тип вместо переменной, так не пойдет. Пиши нормально, типа imya foo {imya::A1}; std::cout << foo;
#484 #531105
>>531096
Ну так я и спросил, нужно ли будет перегружать оператор<< или нет.
Может быть, тогда лучше будет использовать #define A1 'q' и т. д.? Дефайны слишком плохо использовать?

>>531099
Если честно, не совсем понял, что именно ты предлагаешь писать.
#485 #531107
>>531099
Кажется, понял. Создать объект и инициализировать A1. Сделал так, но всё равно ему нужен оператор<<.
#486 #531111
>>531107
Да не, я обосрался на самом деле. Без создания объекта тоже должно бы было работать. Посмотрел сейчас встроенные перегрузки для operator<<, там enum'ов нет, разумеется. И неявно к своему базовому типу они не приводятся, так что придется тебе либо делать static_cast в char, а еще лучше засунуть это приведение в самописный operator<<.
#487 #531114
>>531111
Да, видимо, без этого никак. А что с дефайнами? В крестовом коде их использование не является моветоном?
#488 #531117
>>531114
Является, лучше даже и не начинай.
#489 #531151
>>531114
Первое же правило у Мейерса, кстати.
#490 #531200
Есть какой-нибудь максимально простой и понятный гайд по указателям? Ну пиздец же.
#491 #531215
Есть класс, метод которого получает значение констант в качестве аргумента. Эти значения нужно присвоить при инициализации константы, но константа так же, как и метод должна быть членом класса. Как это реализовать? Можно как-нибудь переменную преобразовать в константу?
#492 #531229
>>531215
Сделать дружественный класс и в нем уже нужную константу?
#493 #531231
>>531215
Если константа и так член класса, то метод и так имеет к ней доступ, зачем её передавать в качестве аргумента?
#494 #531232
>>531231
Хотя я возможно не так понял. Константа и метод в одном классе?
#495 #531234
>>531232
Да, в одном. Но я уже нашел решение - инициализировать константу в initializer list.
#496 #531242
>>531234
Ок, новая проблема.
[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]

Почему так?
#496 #531242
>>531234
Ок, новая проблема.
[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]

Почему так?
#497 #531243
>>531242
const int CONSTANTA*
105 Кб, 1106x473
#498 #531245
>>531114
Используй по минимуму. Всегда есть typedef, constexpr, константы, экстерн и т.д.
#499 #531246
>>531242
void Example::method()*
#500 #531247
Пилите перекат, но без Алёны в шапке треда.
#502 #531257
>>531242
Потому что значение CONSTANTA на момент компиляции неизвестно.
#503 #531323
Кто-нибудь, пожалуйста разжуйте мне метод пузырьковой сортировки массива. Спасибо.
#504 #531345
Обязательно ли знать дискретную математику и понимать алгоритмы программисту си плюс плюс?
#505 #531373
>>531345
Нет. Будешь окна собирать.
#507 #531475
>>531377
Всё правильно сказал.

>>531345
Уровня школы. И да, алгоритмы != математика. Откуда вообще эта хуйня пошла? Большинство алгоритмов в говноразработке выстраиваются обычной логикой, а всякое серьезное дерьмо с математикой делается бородатыми дедами при университетах, называется "научной деятельностью". Когда программистишка с 4 курсами говноматана с говнопараши типа МГУ начинает считать себя математиком, где умирает один Мишаня.
http://imperium.lenin.ru/~verbit/MATH/programma.html
sage #508 #531476
>>531475

>где-то*


fix
#509 #533261
Ubuntu 12.04 g++ 4.6.3 и выше.
выполняя код на стареньком eeepc 701 я обнаружил что время выполнения задачи всё время одинаковое-47сек(выводится самой программой), хотя секундомером мерил оно доходит до 1минуты 5 сек. И доходило до 1минуты 50 сек при двойном запуске той же самой проги, программа всё равно выводит 47секунд.Пробовал запускать на настольном пк там составило 7 сек, но не стал морочиться с загрузкой ядер-там их несколько. Может ошибка какая-то в коде?
float seconds;
clock_t sstart = clock();
unsigned long wait=0;
while(wait<4000000000)
wait++;
cout<<wait<<endl;
seconds=(clock()-sstart)/CLOCKS_PER_SEC;
cout<<"Время затраченное на складывание "<<wait<<"раз=";
cout<< seconds<<endl;
#510 #533263
>>533261
оппа перекатился
#511 #536186
Посаны, что можно прочитать/посмотреть, для того чтоб научиться программировать под шиндус?
Чтоб например можно было получать данные из другого приложения, или использовать хардверу компутера, например получить данные с компорта.

Я просто разобрался в базисе (указатели-стринги наследование, классы и прочее, дефолтные принципы и основы). И теперь уже 2 года никак не продвигаюсь. Кучи литературы для вступления, а что дальше - совершенно не ясно, не ясно с какой стороны подойти.
Я вот понемногу осваиваю программирование под мкк, очень много литературы, во всем можно разобраться. И никто не может ответить.
А как подойти к программированию под ось, так и не пойму.
#512 #536333
Ребят, такое вот дело.
VS 2015 не компилирует парочку кодов, но ошибок не выдает. Вместо этого компилирует прошлый успешный код. Проверил каждую строку, запускал другие коды, всё ок. Снес его, переустановил, проблема осталась. Попробовал на другом компиляторе, а там коды успешно компилируются. Что за говно?
#513 #538065
Аноны, что почитать по поводу работы с железом (а именно с usb устройствами)? Интересует всё по данной тематике: написание драйверов, разработка программ для обработки/отправки/получения информации с устройства и т.п.
#514 #538630
>>538065
Это тебе в /РА
Микроконтроллеры.
#515 #540585
>>536186

mfc, winapi, формочки
а лучше сразу все в помойку и ебашь на QT
#516 #541348
Ей, плюсаны! Можно ли вычислять аргументы функции по умолчанию из дургого аргумента ?
foo(vector<int> &v, auto b = v.begin())
Обновить тред
Двач.hk не отвечает.
Вы видите копию треда, сохраненную 17 сентября 2015 года.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски