Это копия, сохраненная 22 мая 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый - https://2ch.hk/pr/res/947007.html (М)
Легаси
А то ты WEB-GUI под крестами собрался писать, кловн. Ничто не мешает использовать кресты для бэкенда и яваскрипт для фронтенда (где ему и самое место), другое дело, что на крестах это будет огромный велосипед (еще и неизвестно какой), вместо использования уже обкатанных java или asp.net.
Каждый язык занимает свою нишу.
Работающего в фейсбуке Кармака заставили использовать фейсбучное поделие. Ну ок, чо.
Пока что временем проверено только то, что он говно.
4 слова:
ios, android, PS, XBOX.
На всех этих платформах Раста просто нет. С++ на них чувствует себя превосходно.
Javascript нет места нигде. С одной стороны новое поколение гуманитариев, которые рвутся в кодинг и не могут осилить ничего кроме JS и пытаюстся написать на нём небо и аллаха, с другой стороны программисты, которые годами пытаются выйти за грань реальности в попытках оптимизировать интерпретаторы этого говна, и ничего хорошего из этого всего не выходит.
Но он свою нишу занял ведь и конкурентов у него нет, насколько я понимаю (или я слишком отстал от жизни). Опять же, навряд ли от него будут оказываться, по крайней мере, в ближайшем будущем, хоть он кому-то и не нравится. Кроме того, чтобы найти замену JS, его необходимо конкретно распиарить и перетащить опять же на него сообщество разработчиков/говнокодеров/пользователей и прочей шелупони, что также требует большой работы.
Тот же Go, наверно, никому в хуй бы не уперся, если бы в свое время google не стала его пропихивать куда ни лень. Ту же самую науку провернула Microsoft со своим C#, только раньше.
А у всех отростков или языков, которые внезапно появляются, и так же быстро умирают, без должной поддержки будущего нет, несмотря на то, какие бы пиздатые концепции в них не были заложены или с какой простотой и эффективностью реализовывались бы программы на них. Они так и будут игрушкой для хипстеров и прочих рукоблудов.
>Но он свою нишу занял ведь и конкурентов у него нет
Да, к сожалению так сложилось. Но это не повод перетаскивать это говно во все сферы.
> ui на js
> или какой нибудь луа, питон и пр.
Как вообще совместить в одной программе 2 языка?
Ну дернуть удаленный метод чтобы он вернул мне строку huipizda это я еще могу понять. Но как отрисовать интерфейс написанный на другом языке нет.
На первых двух есть и прекрасно живёт. На остальных — не в курсе, но вроде как у них жи закрытый сдк, хз короч.
Дернуть из другого языка функцию отрисовки и закинуть адреса своих ф-й обработчиков гуя, в чём проблема-то?
это ты прекрасно живешь в своем манямирке, а на Расте надо будет постоянно биндинги пердолить (или брать хрен знает насколько проверенные на стороне) и трахаться со сборкой.
Есть генераторы биндингов (это настолько сложная хуйня, что она должна быть проаерена, кек, ты прям жявамакакен только и делаешь что фреймворки скрепляешь друг с другом), а про еблю со сборкой в плюсотреде слышать даже не смешно.
Писал программу под opengl (sdl) на маке, там в конфигурационный файл для qmake вписал:
INCLUDEPATH += /Library/Frameworks/SDL2.framework/Headers
А сейчас переношу на линукс, и непонятно какой путь включать.
pkg-config
спрашивай у менеджера пакетов или гугли sdl2 + название твоего дистрибутива. еще можно find / | grep SDL2 -i
Образно говоря, есть
enum numbers {
one;
two};
Я вызываю функцию из другого класса которая делает return one;
Как вызывающий класс понимает что это? Надо и в нём делать такой же enum?
Ёбаный даун, при чём тут вообще докер?
Лучше заткнись
Ахуенная шуточка. Самое весёлое что все, кроме спермокомпилера поддерживают как минимум один основной базовый набор команд и используют гнутый стиль CLI.
>>962393
Описать стандартом правила манглинга, стандартное соглашение о вызовах и прочую хуйню. Модель памяти же стандартизировали как-то.
> все, кроме спермокомпилера
gcc, clang и icc. Остальные не поддерживают.
>Описать стандартом правила манглинга
Зачем?
> стандартное соглашение о вызовах
И что делать на ARM, если стандартизуют, что первый аргумент передаётся в RDX?
> Модель памяти же стандартизировали
Для абстрактной машины.
Это так значит шутка что ли?
Это он на твоей x86/x86-64 машине в 32 битное значение устанавливается, потому что его доставать оттуда проще будет. Ничего не мешает тебе объявить enum с заданным размером значения (цэ 11):
http://en.cppreference.com/w/cpp/language/enum
>gcc, clang и icc. Остальные не поддерживают.
Прибавь к ним msvc - и получишь все живые компиляторы, у остальных распространение на уровне хачкеля (если не учитывать всякую закрытую залупу для соснолек прочего, хотя мне кажется там сплошные форки гцц как и в мире мк).
>Зачем?
Потому что закрытый софт и регулярное обновление компиляторов - это анальная боль. Да, для с точки зрения программиста конечно тупая ситуация, но бизнесу похуй.
>И что делать на ARM, если стандартизуют, что первый аргумент передаётся в RDX?
а) Класть хуй на стандарт;
б) Стандартизировать на распространенные архитектуры отдельно (их всего-то грубо говоря 3-4 штуки).
>Для абстрактной машины.
Учитывая сколько говна лилось и сколько ее пилили в той же жаве, кажется мне, что она тоже говно, хорошо что мне не приходилось с ней работать, лол.
Ну как сказать.
Я вот сегодня послушал челика, который рассказывал что был на вчерашнем ивенте яндекса, и в 17-м стандарте вместо 128 и 256-битных интов как в гцц будут просто автоматически растущие в ^2 инты, а так же классы с апкастом в компайлтайме при переполнении разрядной сетки и прочего, а так же в constexpr будет свой std::vector и у меня возникло ощущение, что клоуны в коммитете сидят.
А че там самое главное, когда эти пидоры введут статическую рефлексию, мне уж очень интересна эта тема, потому что уже использование protobuf'а и прочих, без вранья, костылей, доебало, когда можно было бы применять свои типы с ленивой загрузкой, COW и прочими ништяками.
> мне уж очень интересна эта тема
Да всем блеать интересна.
Но долбоёбы возятся с какими-то модулями.
Лет через 10. А ты пока держись там, наслаждайся новыми интами и оператором <=>, всего доброго и хорошего настроения.
>>962436
Зато фс в стд завезли, радуйся барской щедрости!
Ну пока генераторы схем есть итак неплохо. В принципе, думаю под себя для работы наковырять один небольшой, чтобы можно было определять пользовательские типы, да вот только все это костыли, как ни крути, хочется нативной поддержки от языка таких трюков.
>> <=>
Че ето такои? Это пришло на замену триграфам?
Это хуитка чтобы заставить компилятор сгенерировать дефолтные <, = и > за тебя. Хз правда нахуя, но видимо надо.
Это вообще реализуемо?
Попытался пойти напрямик -
QObject::connect: Cannot connect (null)::pressedButton() to (null)::receiveKey()
Не только. Возможно, менеджеры пакетов на плюсы завезут или хотя бы можно будет как в жабе подключать либы (или около того). Профит все получат и сразу.
Просто берёшь и соединяешь.
Я надеюсь на лучшее.
Я слыхал VS2017 научилась в неабсолютные пути. Это правда или спермомирок продолжает героически сопротивляться прогрессу?
В не-абсолютные пути точно умели в 2010 студии. Раньше - не знаю. Так что не какай жиденько, а делай уроки, завтра в школу. Расскажешь всем как ты круто линукс устанавливаешь.
Спермоблядь обиделась за наезд на её любимый спермокостыль и пошла грудью вперёд в атаку.
Я даже не знаю, как ответить на эту убогую попытку "траленка". Подрастешь - может поубавится юношеского максимализма.
Спермоблядь ещё страдает эйджизмом.
В бусте точно что-то есть, я не знаю как это искать.
Схема
QEventLoop name;
printf("LOOP")
name.exec();
Работает только 1 раз. Как выводить Printf раз в некотрое время?
мейн: https://pastebin.com/gA0411vF
заголовочный: https://pastebin.com/pNvcCRJ3
файл с матрицей: https://pastebin.com/dj6q7R8u
правильный ответ:
X1 := 4
X2 := 0
X3 := -1
моя проблема скорее всего находится в функции zeydel, которую я скопипастил с википедии, однако я мог там что-то накосячить(но я проверял). Помогите исправить пожалуйста программу.
я разобрался: вышел за пределы массива - умер
Ну так в крестах ничего сложного нет, по сути, а с приходом c++11 (или сторонних либ еще ранее), тебе даже не нужно ебать всем мозги по поводу автоматического высвобождения ресурсов, потому что для этих дел есть unique_ptr и shared_ptr.
Миша, иди нахуй отсюда.
Нашел. IsDebuggerPresent().
Давай начинай свою песню про бесплатность юников, дружочек. Сразу с бенчмарками и ассемблерными листингами, по-хорошему.
У меня был такой чувак на прошлой работе, все хуярил обычными указателями, память у него текла пиздец, зато БЫСТРО (ну, он так думал, профайлер он не запускал ниразу). И еще он в 93ьем написал свою уебищную STL и до сих пор ее использует. Это не ты случаем?
https://godbolt.org/g/96YQfA
https://godbolt.org/g/IUiWmk
Три с половиной ассемблерные инструкции мне не очень жалко потратить на гарантированное отсутсвие утечки.
или Энтони... нипомню
Спасибо.
Я кстати обдумал чего же я хочу от этой библиотеки и понял, что правильнее будет самому реализовать дерево.
Это крайне узкоспециализированное применение многопоточности
>>963261
А теперь немножечко более живой пример, с парой хуиток которые компилятор не может просто взять и выкинуть (я конечно понимаю, что местным похуй, и самое главное статичные данные известные на этапе компиляции обернуть в смартпоинтер, но всё же попробую достучаться):
http://godbolt.org/g/MYKEIl
http://godbolt.org/g/DdfGm4
Разница по количеству инструкций всего-то в... 2 раза.
>И еще он в 93ьем написал свою уебищную STL и до сих пор ее использует. Это не ты случаем?
Не, братан, я вообще STL в рот ебал. Хотя в чём-то с этим стариком солидарен — лучше уж свой костыль, в действиях которого хотя бы можно быть уверенным и который спокойно будет рефакторится и отлаживаться без ебли в сральник.
Ловите поехавшего, он на пушах экономит. Пуш занимает 1 цикл, как и add. ОДИН БЛЯТЬ ЦИКЛ.
У меня 15 лет назад компьютер триллион циклов в секунду выполнял и не парился.
Когда твоя залупа в кэш пролезать перестанет — расскажешь, нахуя вообще подобные настолько низкоуровенные языки.
Вот серьёзно — в твоей ситуации видимо можно сразу на го хуячить, там сборщик почти без задержек, чо бы и нет-то?
Если колл стек твоего приложения не вмещается в l3 кеш - ты занимаешься каким-то пиздецом (еще и с нестандартными настройками кнопилятора). Если это компулсори мисс, то и ты и я будем ждать 300 циклов в любом случае пока твоя и моя залупы загрузятся из памяти.
> он в 93ьем написал свою уебищную STL и до сих пор ее использует.
Все правильно сделал. В любой более-менее нормальной конторе пользуются собственной библиотекой шаблонов.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string s = "word";
string t = s + s[s.size() -1] == 's' ? "" : "S";
}
Наверни скобок
http://en.cppreference.com/w/cpp/language/operator_precedence?ref=theblueish.com/web
>Все правильно сделал. В любой более-менее нормальной конторе пользуются собственной библиотекой шаблонов.
Вся суть крестов: нахуй нам нормальная стандартная библиотека, мы лучше будем велосипеды делать.
>Разница по количеству инструкций всего-то в... 2 раза.
С unique_ptr 22 инструкции
C голым указателем 18
22/18 = 11/9 = 1.(2)
Даже близко не в 2 раза.
Или ты, дебил, в случае unique_ptr с 25-й по 47-ю строки тоже считал?
>Разница по количеству инструкций всего-то в... 2 раза.
Как оказалось, разница даже не в 1.25 раза и это при том, что код с unique_ptr не течёт при эксепшенах.
Приведи немножечко более живой пример, где экспепшены могут быть и гарантируй то же отсутствие утечек для голого указателя с помощью try-catch блоков. После этого попробуем посчитать инструкции, ха-ха.
10 лет назад то?
Где и какие?
Уже есть такое предложение. Остается только ждать. Я лично думаю, что хотя бы дебаггер для MSVC было бы неплохо заиметь для начала, но с другой стороны у меня треть кода в проектах красная.
Ну сделай тогда другой сервер. Не обязательно же веб. Запили брокер, прокси или еще что.
Писать
__attribute__ ((visibility ("default")))
и
__attribute__ ((dllexport))
перед каждым классом или перед публичными методами тоже?
И вот ещё в догонку вопрос, как в cmake сделать подпапку как цель сборки? То есть когда пишешь
make test
cmake запускает
subdirs(tests/)
tests/test_executable
В tests/ лежит другой CMakeLists.txt, который собирает test_executable
Сейчас я просто написал subdirs(tests/) и тесты собираются вместе с основным проектом, это нехорошо
http://www.boost.org/doc/libs/1_62_0/libs/config/doc/html/boost_config/boost_macro_reference.html
BOOST_SYMBOL_EXPORT
"Connection to proxy closed prematurely" -- Socks5Proxy
>std::__cxx11::basic_string
В новых версиях GCC выхлоп темплейтов стал ещё грязнее, теперь так всегда будет?
ШтО?
Вот так сойдёт?
Энтони Уильямс
Параллельное программирование на С++ в действии
https://www.ozon.ru/context/detail/id/135511867/
{
Или единственный вариант это только загонять его в область видимости?
}
Обьект на стэке умирает по выходу из стэке.
Т.е. да, уебанские фигурные скобки, и ничего больше. Возможно, разделить куски кода на лямбды и их дергать, что, практически, тоже самое
С лямбдами это будет смотреться еще паршивее, ИМХО.
Идиот, это удаление объекта на куче а не удаление локального объекта.
А смысл, если место на стэке всё равно не освободится. Ты хочешь постоянно создавать и удалять объект в одной области видимости? Или освободить ресурс?
Не гуглится потому, что некорректный вопрос. Что ты имеешь ввиду под локальным объектом?
То, что имеет смысл "удалять", на стеке не хранят.
Гугл говорит, что это может быть:
"Использование ассемблера для оптимизации программ на С++", Юрий Магда, 2004
Точно не это. Не помню, на каком языке была книга, но это был raw pdf, не скан. Излагалось все живо, не академично.
>>962004
>>961975
>>961931
>>961924
>>961919
>>961912
>>961905
Все до одного в глаза ебётесь. Сейчас я enhance эту картинку для вас, уебанов.
> "Мусолить" не означает "сочинить ABI".
Не сочинять, а чтобы у каждого был свой ABI?
> обязать всех авторов ОС делать ABI.
Да их и обязывать не надо, они сделали каждый свой ABI. Короче, проблемы нет.
>Схема
>QEventLoop name;
>printf("LOOP")
>name.exec();
>
>Работает только 1 раз.
Какое же ты уёбище... С какого хуя она должна работать больше одного раза? printf ты куда сунул?
>С какого хуя она должна работать больше одного раза?
Ну луп это же типа goto. name.exec() делает переходит к QEventLoop name.
>Ну луп это же типа goto.
Пальцем в жопу.
>name.exec() делает переходит к QEventLoop name.
Блядь, я не засну сегодня.
>не стандартизировали.
https://www.google.ru/search?q=itanium+c+++abi
https://www.google.ru/search?q=sysv+abi
>Пальцем в жопу.
Пальцем в жопу это не луп. Вот если рот к жопе пришить, может луп получиться.
Но вообще goto назад это луп.
> Блядь, я не засну сегодня.
Что не так?
>Что не так?
Никакой код в C++ не может перейти куда-то без слов for while goto if или вызова функции или longjmp или чего-то из этого в макро.
Хех, кодить, не почитав доки или хотя бы не имея примеры.
Сейчас работаю в мелкой конторе без юнит-тестов и нормального цикла тестирования вообще, без проработки архитектуры и всякого такого прочего.
План - поработать годик в конторе, где все это есть и набраться опыта.
Кто-нибудь там работал, есть что рассказать?
Ихихихи, ну ты и лалка.
QEventLoop занимается тем, что продолжает выполнение запланированных событий (которые были вызваны QueuedConnection или BlockingQueuedConnection способом), при этом, если его завершить, то сначала завершится обработчик активного события, а потом продолжится выполнение твоего кода после QEventLoop::exec()
прыщеблядок, плс
Это говно занимает большую часть рынка пользователей ноутбуков и пекарен, так что твоему работодателю это говно вполне может быть интересно.
Есть много библиотек без открытого кода и скомпилированных одним компилятором. Ты не сможешь использовать их из другого компилятора.
Когда из основного потока вызываются методы класса, они ведь в другом потоке будут выполняться?
Когда-то работал с тредами в Qt, сейчас уже всё забыл
Ты хочешь ActiveObject.
Возьмут, почти наверняка.
Есть пара вакансий, по которым я полностью прохожу по обязательным условиям и по большинству дополнительных.
Ну и объективно я не особо говнокодер, способен закодить что-нибудь на бумажке, архитектуру гибкую набросать, в алгоритмах разбираюсь и даже в общение могу.
Вопрос же всё-таки не о том, возьмут ли меня, а в том, стоит ли туда идти?
У них вакансии открыты годами, оптимистичный ты наш совсем-не-говнокодер, но сходи, с тебя не убудет) А вообще сейчас как-то много сионистов из транзаса бегает по собеседованиям.
http://ideone.com/Eu11FI
>Как быть с декструктором объекта данные которого перемещены через std::move()?
Перемещение должно оставлять объект в пригодном для разрушения виде.
> Везде хранить поле bool is_moved
Обычно это не нужно.
move, в основном, нужен для двиганья указателей. Просто в обьекте откуда муваешь, ставишь указатель на nullptr, и все ок
>move, в основном, нужен для двиганья указателей. Просто в обьекте откуда муваешь, ставишь указатель на nullptr, и все ок
Блять, один нюфаг который хочет дебильной хуйни, второй либо тоже нюфаг либо просто дебил.
move() только то и делает, что свапает указатель с нулптром (но стандартом это не оговаривается, как минимум в одной из версий гцц указатель просто копировался — ведь п-перформанс жи, так что надо смотреть в конкретной реализации std), данные он вообще никак не трогает.
Мой ответ касается в первую очередь того ответа, но и твой вопрос покрывает — просто проверяй свой указатель в деструкторе перед удалением. Ну или просто иди нахуй
ты зарабатываешь деньги, программируя на C++?
Или все проекты VC++ в VS хуячатся напрямую в машинный код и для запуска никакие .net'ы не нужны?
Ну вот GCC был на С написан, а потом его переписали, насколько знаю весь, возникли проблемы с бутстрапом и стандартами.
Все порешалось, но теперь компилятор собирается хуй знает сколько, выжирая кучу места на диске.
Это же простая утилита по сути.
Ебать у вас курятник там. Попробуй clang-ом статически собрать. Запусти в песочнице без нихуя.
Это поможет:
http://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom
Ответ на вопрос где-то в конце, но почитать всё равно не помешает.
У меня не получается, компилятор так пытается кастовать один тип в другой
Компилятор выдаёт ворнинг если убрать std::move, а так ему норм, по идее всё правильно работает
Так нельзя делать. У тебя после выхода из функции объекты рипаются. Всё это работает только потому, что у тебя данных реальных нет.
Ладно, пришло время окончательно закопать идею с полиморфизмом на стеке
Я хотед сделать оператор, например [], чтобы можно было вытаскивать переменные через префикс
scalar = perl["$var"]
array = perl["@var"]
Когда доделаю весь функционал придётся всю работу с переменными переделать на указатели, на стеке слишком много ограничений
потому что не тайпсейф ни разу.
Чому тогда не сделать все функции констэкспр, авось попадёт подсчёт в компиляцию?
Вероятно, ты не сможешь завести программу, если везде повесишь. Ну и если вдруг тебе придётся в этом случае убрать constexpr, следом упадут связанные функции.
Привет, аноны. Не знаю, туда пишу или нет. В общем, хочу вкатиться во фриланс. Чего умею - писать коды на c++ для определенных целей, занимаюсь этим постоянно года 2 или 3 по работе. Чего хреново умею - шарить в оптимизациях, всяких утечках памяти и прочей программистской кухне сам по образованию не программист, на работе использую C++ только как костыль для решения конкретных небольших задач, прогами этими пользуюсь в основном только я, иногда коллеги, которые прогать умеют еще хуже, чем я. . В общем, как такие днища навыки применять, чтобы помимо основной работы можно было наварить около 10 рублей, работая раз в неделю? С чего начать?
*10 тысяч рублей в месяц
Просто если сейчас я могу сделать
perl.getScalar("my_variable").setValue("huita")
придётся писать
Scalar ж var = perl.getScalar("my_variable")
var->setValue("huita");
delete var
(при том что Scalar содержит указатель на Си данные, которые продолжат жить в куче)
ёбаный стыд...
Как-то занимался играми, там из-за наличия основного цикла и событий легко подчищать умершие объекты, а тут нихуя, бери и пиши сборщик говна с нуля
Грубо говоря
class Scalar
{
InternalScalar ж ptr;
...куча методов...
} ;
class Array
{
InternalArray ж ptr;
...куча методов...
} ;
Учитывая что они хранят всего лишь указатель и не контролируют его (этим занимается интерпретатор с подсчётом ссылок), логично размещать все объекты на стеке
Но без наследования от общего предка с приведением типов туда-сюда архитектура слишком ограниченная, придётся возвращать new Scalar из функций
libfmt
статический полиморфизм реализуется через шаблоны..
ad hoc полиморфизм посредством перегрузки функций..
алсо, можешь расшарить свой код - я могу помочь..
>shared_ptr ебани
Из фабрик принято возвращать unique_ptr, кагбэ говоря "лайфтайм этого объекта полностью под твоим контролем"
Ну можно запилить ссылку и её уже закастить.
Да и вообще, так ли уже тебе нужны 2 класса? В контексте того, что ты нам показывал - это изврат. А что там тебе в реале нужно, ты ещё особо не показал.
Задача - аналог liblua, достаточно быстрый для использования в играх
Основная проблема - прямой вызов С++ функций внутри eval() и require(). Пришлось сделать XS модуль, через который можно в рантайме создать функции в main:: или другом пакете и из них вызывать С++ коллбеки. Вызов получается не прямой, зато есть полный контроль над стеком, то есть в созданной функции можно свободно принимать и возвращать массивы
Может тебе известен другой способ? Я весь интернет перерыл в поисках
Код может залью через пару дней, сначала надо определиться с моделью хранения указателей на переменные, чтобы избавиться от вот этого пиздеца (везде должно быть Variable)
Вот ещё как внутри работает и yoba-оператор[], в который благодаря полиморфизму через префиксы можно вместить все остальные методы
Спасибо, сохранил.
Я тут ожидал больше архитектурно-концептуальных ответов, а тут один неосилятор доказывает другому как с его точки зрения STD работает правильно.
Пили перекат.
Програмчую, фабрике владеть этим указателем большого смысла далее нет.
Но геморой может быть с уникальным указателем на куче, случайно можно проебать, если реально где-то в разных местах используется.
Тут точнее говорить - либо фабрика должна отдавать шаред ибо таков замысел - фабрика шаредпоинтеров, или же очень внимательно следить за циклом жизни в скопе.
Так оно и интересно.
Нахуй мне тут про стандарты читать и спорить о их реализациях, когда это справочная информация.
Реально в работе возникет огромное множество архитектурных вопросов и вопросов дизайна.
Поразбирай парашу, написанную с их применением.
В десятках часах, разыщи же ту строчку кода, которая сука меняет состояние этого объета.
Убедись, что другая строчка кода в двух папках левее в другом cpp перезатирает состояние объетка, и от этого все работает хуй пойми с какой предсказуемостью..
А потом возвращайся, и дай нам ответ на этот вопрос.
P.S. гне константные лобальные синглтоны - тоже зло.
Так, хорошо. Но как быть с теми случаями, когда доступ к какой-нибудь хуйне нужен часто и из очень разных классов например в какой-нибудь QStatusBar сообщения всякие передавать?. И где о таком вообще можно почитать что-нибудь?
Если не понятно, что я хотел сказать, могу постараться поподробнее объяснить
Я бы наследовал от CanChangeStatusBar а там уже внутри методов пускай конфликты разрузиваются
Создаешь интерфейс IStatusBar.
У него метод IStatusBar::addMessage(const std::string& message) = 0;
Твой статус бар реализует этот интерфейс.
Передавай этот указатель туда, где нужно его использовать по иерархии композиции.
В том и суть, что хороший дизайн требует передачи такой штуки только туда, куда по логике нужно его передавать.
А плохой - куча вложенных друг в друга обхектов, каждый из которых тащит указатель на это. НО даже это лучше глобаьного объекта.
Другой пример - интерфейс доступа к настройкам.
Казалось бы, настройки приложения реально глобальные. И делай их глобальными. И да, можно, если каждая сущность хранит их в своей секции. Но как только кто-то начинает менять настройки другой, чужой сущности - тут начинается херня, и делать так не стоит.
Это такой Java-way стиль.
Qt например предлагает хороший инструмент сигналов и слотов (обертка над указателями на методы), при помощи них тоже можно хорошо разрешить ситуацию.
Если честно, то я не совсем понял, а чем это лучше. Ведь точно также все эти классы будут тащить указатель на мой statusBar. И точно так же я буду разгребать это говно
В твоем случае используй то, что лучше вписывается в общую архитектуру.
Если нигде не использовал интерфейсы - то не используй.
Если везде тащил указатели - используй указатели.
Если синглтоны - то синглтон.
Решение должно быть обосновано как-то и гармонично. Ты обосновал - часто требуется доступ из разных мест, за гармоничность тебе решать.
И в твоем случае, обезательно передавай в метод - кто послал сообщение, иначе не разгребешь.
Пускай код засран, зато всё чистенько на стеке
А вот так получается выглядят сигнатуры всех моих шаблонных методов. Каждый вариант пишется вручную, там всё равно разные си-функции дёргаются везде
Завтра займусь реализацией
Днищефриланса на плюсах нет.
int WinAPI winMain(int argc, char* _args){}
?
Где можно почитать об этих квалификаторах или как там мать их?
http://stackoverflow.com/questions/14913243/netbeans-7-2-shows-unable-to-resolve-identifier-although-build-is-successful
Охуеть, сколько лет уже это говно не фиксят.
С-бог
Ну а что значит после типа возвращаемого значения и перед именем функции этот __stdcall?
Какое-то очередное нарушение стандарта языка в исполнении MS, можешь в службу поддержки написать.
Long ago, in a distant past, когда вызов функции был чуть более, чем обычным goto с сохранением адреса возврата, надо было придумать, как передавать туда параметры и как получать результат. И разные люди придумали и использовали разные способы - кто в стеке, кто в регистрах, а кто вообще в памяти. Так что вызывая какую-либо неизвестную функцию, она вполне могла невозбранно затереть твои регистры, не предупредив. Стало быть нужно помечать, какая функция как работает с параметрами, так и появились конвенции о вызове.
Поставил нормальную IDE Eclipse, теперь всё собирается. Странно, всегда щитал нетбинс годнотой, по крайней мере в проектах на php и js оно меня ещё так не подводило
Просто Visual Studio на моем железе 90% времени будет висеть в Not Responding
Тогда qtcreator твой выбор, эклипс на джаве написан и вряд ли летать будет
Чет тоскливо. Плохо себе представляю, как можно получать удовольсвтие от кодинга на тормозной машине. Может купить старенький Сэнди-бридж на авито тысяч за 10?
А с ним новую мать, бп, под новую мать ещё обновлять оперативку и кулера.
Я конешно не тот анон, но тут половина вкатывальщиков — студенты и школьники из мухосраней, для них это проблема.
У меня Ivy Bridge, что вроде бы даже новее чем Сэнди. Ты уверен что на б/у говне за 10к студия будет идти лучше, чем на игравом ноутбуке за 60к?
Ну не таскать же системный блок в универ...
У меня у самого айвик, студия летает. Хз
Твоя проблема в том, что программировать надо головой, а не IDE.
Студийные макаки обмажутся своими гигабайтными тормозными монстрами и потом не могут высрать ни строчки кода без них.
Нашёл это http://ideone.com/BJAaKM , но оно не работает с std::string и насчёт безопасности есть сомнения
Можно ли использовать запись std::vector {5}, чтобы создать вектор из пяти пустых элементов, как в случае std::vector(5)? Но создается вектор с одним элементом - пятеркой, видимо из-за конструктора, принимающего initializer_list.
Можно ли добиться такого поведения со фигурными скобочками? Хочу использовать такую инициализацию везде вместо обычных скобок.
И ещё это https://gist.github.com/en4bz/f07ef13706c3ae3a4fb2 , работает со всеми типами на шаблонах, но нельзя использовать символ % если он не заменяется на строку.
Друг, сейчас не каменный век
Нету в репе дебиана.
Ссылка на гист хорошая, туда бы только конструкию \% добавить и всё что нужно будет в одном хедере.
Ловите вимоёба.
Ох лол. ИЛИТА в треде. Прости, я сейчас пойду удалю студию, и винду даже удалю. Поставлю LOONIX без иксов даже, и буду в виме пердолиться. Ведь результирующий продукт и скорость разработки не важны. Важно, что ты ИЛИТА и пердолишься в ВИМЕ
Не забудь мышку выкинуть
Я тоже так думал, пока меня не пересадили со студии. Красноглазая залупа и хваленый ДЖЕТБРЕЙНС даже близко не валялись. А что там в виме - мне даже страшно представить.
Владелец квантового кластера? Если запихнуть вим мегабайты VimScript через плагины и довести фунционал до сносной IDE, он будет работать медленее студии.
всё уже написано
там е консольный чатик
http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html
Gedit тоже выкинь и поставь Geany, с виду то же самое но настраивается круто, по скорости работы уделавает всех включая Gedit.
там есть регистрации и комнатки? Можно еще операторов чатика реализовать.
Вим это обыкновенный текстовй редактор. А вот что такое есть в студии, чего нет в продуктах от джетбраинс?
qt creator, atom, kdevelop, gnome builder, sublime text, emacs, vim.
Это неполный список легковесных и быстрых сред разработки. А ты иди скачай еще один апдейт студии на 5 гигабайт.
Можешь свое говно засрать себе обратно.
Да, среди перечисленных он самый тормозной.
Но все равно выигрывает на фоне говна на джаве, моментально отжирающего всю память и студии, которая весит 10 гигабайт и устанавливается два часа.
Ебать ты бешенный. Что-то мне подсказывает, что даже с шаблончиками эта хренотень будет работать так себе, если честно.
Хотя не, для специализированных типов будет нормально.
Со stringstream просто костыль чтобы что-нибудь вернуть, если кому надо пускай определяет stringstream::operator>> для своего типа
>при объявлении статического массива, его размером должна являться числовая константа, а не переменная. В большинстве случаев, целесообразно выделять определенное количество памяти для массива, значение которого изначально неизвестно.
Но я все равно не вхуяриваю, для чего это надо. Если сказано, что должна быть константа, но почему бы после получения размера массива от пользователя просто не использовать ту переменную. гуглил - нихуя.
И что за некий указатель p_darr?
Что тебя смутило? Я действительно не знаю. Гугл мне толком ничего не выдал по этому запросу
>Если сказано, что должна быть константа, но почему бы после получения размера массива от пользователя просто не использовать ту переменную.
Потому что константа, определяющая размер массива, должна быть известна на этапе конпеляции. Очевидно, что статический массив находится прямо в экзешнике, и поэтому ресайзить его там не вариант. А динамический создаётся в рантайме в куче, которую выделяет для процесса ОС, а в куче выделяй/удаляй - не хочу
Тому что константы должны быть вычислимы в момент компиляции программы. Виталик вводит свою циферку после компиляции программы -> константа не вычислима.
Размер статического массива должен быть константой потому что иначе компилятор вообще не ебет сколько ему памяти выделять на следующий стек фрейм в противном случае.
Динамический массив выделяется на куче, а на стеке выглядит как один указатель (размер которого известен компилятору)
Если нужно небольших размеров динамический массив только на время выполнения функции, можешь воспользоваться функцией alloca или _alloca (одно и то же, по сути, только названия разные для разных компиляторов). Если нет - то тогда new[SIZE] и освободить не забудь при помощи delete[]. А еще лучше используй std::vector.
>>965556
Так, подождите. Как я понял, то получается, что статический массив создается в памяти, которая уже используется для открытия программы, а динамический использует свободную память, которая есть в комплюктерне, так?
>>965560
В том то и дело, что пока надо разобраться с new и delete.
Повторю вопрос - что за указатель p_darr?
https://ru.wikipedia.org/wiki/Стек_вызовов
>указатель p_darr
Это и есть твой массив
OP* p_darr = new OP[100];
Как сделать ParamT шаблоном, при том что ReturnT указан явно?
Я так понял нужно что-то вроде
template<class ReturnT, template<class ParamT> >
но как это сделать не ясно, на SO везде сраные template<class> Containter, а не отдельные методы
Таакблятьнахуй, я совсем запутался.
Вот кусок кода
int main()
{
int num;
cout<<"Vvedite kolichestvo elementov massiva\n";
cin>>num;
int p_darr = new int[num];
for(int i=0;i<num;i++)
{
p_darr=i;
cout<<"i = "<<i+1<<" p_darr = "<<p_darr<<endl;
system("pause");
}
delete [] p_darr;
system("pause");
return 0;
}
И ты мне пишешь OP p_darr = new OP[100];
К чему мне блять обращаться? К p_darr как у меня или к OP[100]?
>>965580
Я уже понял это
function template partial specialization is not allowed
Не знаю насчёт ответа, но можно полистать это:
http://en.cppreference.com/w/cpp/language/template_argument_deduction
http://ideone.com/yW83GW
Посмотри здесь. Только на идеоне он не работает, запусти, например, на http://cpp.sh
APIENTRY определен как WINAPI. А знаете, что скрывается под WINAPI? Конечно же __stdcall, что там еще можно использовать? Это же очевидно - назвать синее красным, красное зеленым, а зеленое - синим.
Ты слишком маленький, не поймёшь. Но дам подсказку - те значения дефайнов, которые тебе показывает IDE, это значения которые были вычислены по твоему компилятору, его версии, версии ОС, наличию разных библиотек и т.д. На самом деле там большие деревья условий (IFDEF, IFNDEF), которые определяют именно тот набор дефайнов, которые ты сейчас видишь. А typedef для большей ясности, так ещё с Си повелось
Где ты в винапи С++ нашел?
Потому что в 1970-ых годах Ричи придумал язык С. В нем был препроцессор. За 40 лет ничего лучше С для системного программирования не придумали. На С же и написали WINAPI.
А с++ тут только при том, что он частично обратно совместим с С и из него можно вызывать сишный код.
Это не С++, это API винды на чистом си.
>программировать под ШИНДОСВ
>удивляться, откуда за щекой член
Иди батхёрть в свой двор, заебал.
Еще одна илита в треде. Я так и представляю прыщавого толстого подростка, который зашел в класс, его все проигнорили, он решил хоть как-то привлечь к себе внимание, и сказал "Я под линуксом сижу". Жаль, что Ерохины продолжили обсуждать, как они вчера клеили тянок, а бабы еще больше отвернулись от этого недоразумения.
Если прекратишь мыслить категориями илиты, Ерохиных, тянок и пр. и перестанешь походить на типичного школьника из /b/, то можешь остаться.
Скажи это рарзработчикам компиляторов и компьнити практически всех языков кроме С#
ifstream infile( "alice_emma" );
Пишет, что нет конструктора с *char
В то же время в интернете много подобных примеров. Если загнать имя файлы в пременную стринг, а потом
ifstream infile( "alice_emma" );
то это все равно не помогает.
Сомнительное утверждение
Подключен, иначе откуда берутся все эти функции указанные компилятором. А вот замена помогла, но только при
g++ -std=c++11
А вот с gcc не хочет
https://clbin.com/WG4MW1.png
gcc по умолчанию не линкует стандартную библиотеку C++ да и вообще, это компилятор СИ, а не крестов
Ой, это я по привычке видимо
как неудобно получилось, интересно почему у меня столько кода другого работало
А чем там линуксогоспода нынче компилируют, а то я чет подзабыл. g++ или как там? g++ -std=c++11 мне не нравится.
тебе абсолютно везде потребуются доп настрйки, как только ты начнешь писать что-то сложнее хелло-ворлдов.
Спасибо, кстати, в некоторых местах читал, что iostream есть в fstream, но видимо меня обманули. Я прав?
У меня сейчас хелоуворлд. но приму во внимание и начну курить такие штуки.
Потому что все окна - это API и библиотеки. Используй самые лучшие библеотеки и не выёбывайся.
Они самые хуёвые, то что я хочу реализовать на них не возможно, даже костыли не городятся.
Спасибо, уже написал.
Бери голый OpenGL или обётку SFML/SDL
Я как-то делал всякие кнопки и чекбоксы для игры на SFML, это просто но писать очень много кода нужно.
Берешь любую либу, пишешь zaebashit_okno(okno_name); и рисуешь внутри опенглом что хочется.
>Двач, подскажи, как создавать gui окна? В смысле не используя какие-либо наборы виджетов и api.
WinAPI гугли
Уже нагуглил и xlib и winapi. Ну всё! Начинается сборка моего кросплатформенного велосипеда!
Открываешь файл и там iostream юзаешь, пишешь, читаешь.
>>965752
>2017
>OpenGL
Ну плес.
>>965747
Бери исходники fltk и переписывай на Wayland Display Server Protocol + Vulkan API.
Хелловорлд будет меньше 4 кб, а сама либа работает быстро.
>-Ofast
Это уже блоат и некоректные вычисления могут быть.
Самая мякотка -O1 ультимейт решение без трейдоффа, но производительность может быть ниже чем -O2
Есть, -march=native говорит делать ассемблерный код полностью под данный процессор, со всеми SSE, AVX2 и так далее.
Но зато кол-во строк для вывода одного треугольника возросло в 5 раз.
Да и видеокарты почти не поддерживают. Нафиг делать программу, которая запустится у 2% целевой аудитории? Программа должна запускаться как можно больше где.
Я о том, что без -Ofast не будет автовекторизации (для fp-чисел), а в чём там перемалывать числа без векторизации — в XMM или в YMM — какая к чёрту разница?
> Полностью вытеснил опенгл
Проиграл с этого школьника, что-нибудь кроме дотки и тестовой игры его поддерживает? Кто-нибудт спешит на нём разрабатывать игры? На сколько производительность лучше? На 10%? 1000 строк чтобы нарисовать квадрат? Vulkan это не нужная параша.
Разве что в твоём манямирке.
>в 5 раз
Не в 5 раз это во-первых, во-вторых это делается один единый раз при написании своей либы. Вулкан не имеет оверхедов, опенгл много чего выполняет под капотом в ущерб производительности.
>Как можно больше где
Для этого его и сделали, теперь не надо пердолиься с версиями OpenGL, OpenGLES, теперь у нас единое API которое работает на всех платформах.
API поддерживается даже на древних встройках интела, не знаю о чем ты там говоришь.
Ofast это не только автовекторизация, и кстати а разве она в O2 не включена?
Там еще несколько сложных алгоритмов оптимизации кода, которые могут сделать код большим и медленным, поэтому надо отдельной опцией указать быстрые вычисления -ffast-math если не ошибаюсь.
На нем квейк переписали, на вулкан уже разработаны движки и портируются существующие, так что вылезай из манямирка.
> Ofast это не только автовекторизация, и кстати а разве она в O2 не включена?
Для векторизации fp обычно нужна ассоциативность, которая без -ffast-math не предполагается.
13 игр, проиграл
https://en.wikipedia.org/wiki/List_of_games_with_Vulkan_support
Достаточно того что нужно написать 1000 строк кода для того чтобы нарисовать квадрат, это уже делает его не нужной парашей.
Спасибо, Капитан К.О.
> Работать не хочешь
Если бы ты знал как сложно делать игры на чистом API, то ты бы не пиздел такой хуйни. И на OpenGL делать игры это достаточно серьёзный жизненный шаг, а что там на Vulkan будет я и не представляю.
Заметь что почти все они на разных движках. Тоесть разработка игры на вулкане уже не отличается от разработки на опенгл, это пока что только игр относится, в скором будующем и все графические либы на него перекатят.
> 50 строк кода на OpenGL
> 1000 строк кода на Vulkan
> разработка игры на вулкане уже не отличается от разработки на опенгл
Проиграл
>опенгл много чего выполняет под капотом в ущерб производительности.
Ты точно про core профиль?
>API поддерживается даже на древних встройках интела, не знаю о чем ты там говоришь.
А у меня почему-то другая инфа, всегда думал, что он поддерживается только на самых свежих картах, и то если поставить дополнительные дрова для вулкана.
На вулкане не игры делаются а либы, а на либах движки.
Ты путаешь разработку игры и движка, мань.
Блядь блядь блядь блядь блядь блядь блядь, почему нельзя выбрать перегруженный метод без мазохизма?
by value
Или я не правильно понял принцип работы WaitForMultipleObjects ? Объясните, пожалуйста.
Совсем дебил?
Даун.
Передавать по ссылке и юзать семантику переноса, std::move(list), чтобы ресурсы на куче не копировались.
Хотелка.
Это ты std::move предлагаешь к std::initializer_list применять?! Разупорись.
Какой компилятор посоветуете?
ибо я так тред почитал и понял, что многие - шлак
О
И заодно литературу какую почитать было бы неплохо
Как тебя не бить, когда ты несешь какую-то отбитую чушь, и потом говоришь - ОЙ Я НЕ ЧИТАЛ ОБЬЯСНИТЕ МНЕ. Иди блядь и читай.
ClassName::FuncName()
Почему нельзя сразу определять тело функций? Какой профит с описания лишь сигнатур? Типа чтобы точки входа в функцию рядом располагались, и по ним можно было бы прыгать по указателю?
vim — лутший конпелятор.
Почитай как работает препроцессор и как происходит линковка
Чтобы ты не лез куда попало. Видишь интерфейс - им и пользуйся.
Ну и, естественно, ускорение времени компиляции, потому что разным юнитам трансляции придется делать одно и то же, если все подряд хуячить в хэдере.
Алсо, платформенно-зависимые куски приходится дефайнить (хотя это один из самых хуевых вариантов написания кросс-платформенной библиотеки), и тогда у тебя будет все засрано, как в WINAPI (ох уж эти уебанские описания COM интерфейсов и перехватчиков, фу блять, как вспомню только)
>дефайнить ... это один из самых хуевых вариантов написания кросс-платформенной библиотеки
Ты хотела написать "дефайнить — это единственный существующий метод написания кросс-платформенной библиотеки", Манюня.
Таки нет. Почитай про wrapper facade, им заворачивают платформенно-зависимый код. Зацепив к одному заголовочнику , например, несколько вариантов исходников (которые выбираются во время сборки) можно избавиться от этого говна. Ну и про PIMPL не забывай, это, конечно же , лишний оверхед, но для кросс платформенности нормально.
А если функции в хедере void или возвращают указатели, можно инклудить все зависимости в cpp, а хедер будет чистый и не потянет зависимости выше по иерархии инклудов
МСДН тебе тут штоле?
Системой сборки блять. Что ты за человек то. Это гораздо лучше, чем городить блядские дефайны где ни попадь, а к слову, я даже знаю одного человека, которые дефайнил целые функции, потому что считал, что так быстрее будет.
>Системой сборки блять. Что ты за человек то.
Которая написана на C(++) и где были использованы эти кроссплатформенные дефайны.
Ну или платформа определяется запуском препроцессора над файлом с ifdef-ами и проверкой, какие куски этого файла выжили.
Конфиг конфигом, я тебе про платформенно-зависимый код говорю. Тот д же мьютекс под разными осями будет иметь в итоге один общий интерфейс, в то время как логика создания/захвата и т.д. может различаться. Проще и чище вынести код для каждой платформы в отдельный сорец и там пилить логику, но уже без дефайнов, чем ковыряться в куче говна. Об этом речь. А система сборки для того и нужна, чтобы этот мусор разгрести.
>Конфиг конфигом, я тебе про платформенно-зависимый код говорю.
Я понял, петушочек, что ты хочешь сказать. Я говорю о том же.
Объясняю ещё раз. В твоей системе сборки ты проверяешь текущую платформу каким-нибудь так
if($platform==OSX)
srcs+=(mutex/impl/osx.cpp);
endif
(это псевдокодкод условной системы сборки).
Только вот значение $platform:
1) Определяется при сборке этой системы сборки с помощью тех же дефайнов.
2) Определяется при запуске системы сборки выполнением каких-нибудь скриптов, которые вызывают препроцессор и опять же смотрят, какие переменные в нём предопределены.
Не совсем понятно зачем наследоваться. Можно же
template<class PtrT>
using Ptr = std::shared_ptr<PtrT>;
Быть может я и не прав, но вроде как локальные объекты move не возвращают
кто-нить знающий, поясните, прав я или нет
или нет
Отлично, значит я хоть что-то знаю
Так можно писать
Ptr<A> = Ptr<B>(new B)
вместо
shared_ptr<A> = dynamic_pointer_cast<A>(shared_ptr<B>(new B))
Это троллинг? Мой вопрос и заключался в том, как сохранить дерево, при помощи какого алгоритма. Синтаксические вопросы дело последние.
Вот есть дерево. Я его рекурсивно обхожу. Что дальше? Что я должен записать в файл?
https://isocpp.org/files/papers/p0636r0.html
Для маленьких деревьев: рекурсивный, блядь.
Для больших деревьев: обход дерева с поворотом ссылок в обратную сторону.
Декларацию function() throw(X) убрали?
Помню как-то написал throw(A, B), и спустя время где-то внутри дочерних вызовов внутри этой функции выкидывалось С, и это исключение невозможно было поймать, как будто его кидает main. Долго пытался понять что происходит вообще.
Эта хрень требует указывать абсолютно все исключения которые могут возникнуть, поэтому убрали видимо.
Мозг себе сейчас сломаю тем, чтобы хоть как-то тебе помочь, но так, чтобы ты ещё и сам подумал головой.
https://paste.ee/p/SWHj8
operator>> напиши сам.
То есть приведите примеры где C++ необходим.
Примеры где с++ необходим — абсолютно все случаи, кроме написания драйверов.
>То есть приведите примеры где C++ необходим.
Таких примеров нет, оба языка Тьюринг-полные.
Просто на C++ ты напишешь код короче и безопаснее, и сделаешь это быстрее.
Блять, что за такая тупорылая постановка вопроса "где необходим"?
Привет, крестовики. Я тут задумался недавно, а зачем вообще C++ и почему не пишут все на haskell.
То есть приведите примеры где C++ необходим.
>Вот есть дерево. Я его рекурсивно обхожу. Что дальше? Что я должен записать в файл?
Последовательно обхода, наркоман.
Ты, прежде чем такие вопросы задавать, указывай возраст, мол студент первого курса. Итд.
И пробуй хоть гуглом воспользоваться.
Это пример прекрасного и мощного кода. Такого кода больше нет, одно хипстерство и пидорство. Его можно сравнить с огромным, брутальным промышленным комплексом. А WinAPI, кстати - лучшая в мире библиотека для каких-либо языков программирования. Ибо она умеет всё.
> что мне кажется как то надуманно и не особо важно
> но в то же время по const'ам аж главы в книгах пишут
Так может потому они и важны раз пишут целые главы?
В том то и дело, я хочу узнать, не скрывается ли за const что нибудь еще, кроме как помощь не забыть и не проебать значение переменной.
Почитай, например, про константные функции классов.
Скажи мне, друг, а ты проводил тесты? Сравнивал производительность одной и той же программы, написанной с использованием OpenGL и с использованием Vulkan?
Или ты просто прочитал где-то, что Vulkan - это модно, молодёжно, будут бабы давать, и OpenGL уже не нужен? Знаешь ли ты о синхронизации и о том, как с не бороться? О том, как вручную управлять ресурсами? Сможешь ли ты хотя бы написать на вулкане программу, которая будет по производительности хотя бы такая же, как аналогичная на OpenGL?
auto x = new Yoba
x~call()
Чтобы у тебя не возникало каши при желании просмотреть список методов класса, не путаясь в реализациях.
Да хотя бы тот же RAII.
Лучше бы назвали Pukan
> API поддерживается даже на древних встройках интела, не знаю о чем ты там говоришь.
Чушь собачья.
Нвидия, например, напиздела с поддержкой.
https://devtalk.nvidia.com/default/topic/917161/vulkan/fermi-support-/post/4810640/#4810640
Декремент ноги.
>> 1) Определяется при сборке этой системы сборки с помощью тех же дефайнов.
Каким хуем ты приплел исходники из кода к парсеру системы сборки?!
>> 2) Определяется при запуске системы сборки выполнением каких-нибудь скриптов, которые вызывают препроцессор и опять же смотрят, какие переменные в нём предопределены.
Это ты так привык, но это не обязательно. Хотя с использованием какого-то конфига так проще всего, потому что и с этим зхэдером, по факту, ты работаешь только вскользь.
Двачую !
Погодите, погодите. Это крестовик-затейник сейчас траллет сишника строками? До чего мир докатился, блять.
Посмотрите, долбоёб-сишник считает, что у него в языке отличные строки.
На, почитай, не позорься: http://russian.joelonsoftware.com/Articles/BacktoBasics.html
У меня есть два байта данных (uint16_t, quint16). Оригинально они задумывались содержать беззнаковое целое. Как можно представить эти данные во float (забросить их в least significant bytes) и signed int? Главное, чтобы результат имел то же бинарное представление, что и оригинальное число.
Это какой-то очередной posanskiy_cast?
долбоеб строки это просто байты в памяти, а по твоей ссылке какойто индус несет хуйню
memcpy
>Не знать Джоэла
Если бы ты почитал повнимательнее, ты бы понял, что строки - гораздо более сложная вещь, чем просто байты в памяти.
Использовал бы стандартный, но там какая-то еботня с NDEBUG, который надо отслеживать в чужих хедерах
И ещё нельзя написать return assert(x)
эээ, __LINE__ ?
что там сложного? длина не указана? городить структуру и хранить со строкой? твой джоэл крудошлеп и раздул проблему на пустом месте
>Да здания - это же просто нагромождения арматурин с цементом, что там может быть сложного?
Когда ты сделаешь структуру и будешь хранить её вместе со строкой (кстати, так делать нельзя, ведь структура - это часть реализации, значит, в хедере ей не место), то у тебя получится тот же самый C++. Только вымученный, со странными названиями функций и без неймспейсов.
>union type punning
Сработало. Спасибо, анончик.
memcpy - это очень мощно, но тоже должно работать
Мне хотелось бы обходить его рекурсивно, чтобы уменьшить размер выходного файла. Студент 2 курса. Алсо в гугле только бинарные деревья видел.
При последовательном обходе в выходной файл придется записывать полный путь каждой ветки
Вершина/вершина2уровня1
Вершина/вершина2уровня2/вершина3уровня1
Вершина/вершина2уровня2/вершина3уровня2
А вот при рекурсивном
Вершина(Вершина2уровня1/Вершина2уровня2(ТУТ ЕЩЕ ДВЕ ВЕРШИНЫ МНЕ ЛЕНЬ))
Тред не читай, сразу отвечай.
Я теоретик, мне насрать на конкретные цифры, это 1.
Я говорил, про выходной файл, а не исполняемый.
>Вершина/вершина 2ого уровня-1ая
>Вершина/вершина 2-ого уровня2-ая/вершина3-его уровня1-ая
>Вершина/вершина2уровня2/вершина3уровня2
пожалуйста :3
Можно и без рекурсии такое построение сделать. Тебе нужен поиск в глубину (я так понимаю, ты его используешь).
Ну так-то я и не знаю, что сказать. Если ты просто будешь выводить во время обхода номера вершин в строку, то получишь практически тоже самое, что хотел. Тут надо только мозг включить и расставить скобок и слешей, где надо.
Ну вот, скобки и слеши. То есть у меня в файле будет каждая вершина упоминаться ровно один раз. Именно о таком алгоритме я и спрашивал. Алсо я придумал его еще до того, как написал сюда, потом решил, что он несработает из-за синтаксиса, а через 20 миут понял, что все ок. Т.е. я около суток морочу всем здесь голову.
По теории графов и алгоритмам наверни вводный курс. Будь ты хоть макакой, всё равно пригодится.
а я бы не тащил работу со строками в реализацию языка. в любом случае, джоэл сосет
Я уже прошел и теорию графов(предмет назывался наглядная геометрия и топология) и теорию деревьев (авл, красночерные и прочие кошерные вещи), введение в мат логику и теорию алгоритмов тоже было. Все изученное использую. Меня просто переклинило.
Научись тогда гуглить чтоли. И не загоняйся.
Эй, шарпист. Нормальные пацаны юзают auto
I need Help, аноны!
Как воспроизвести вот это условие: дважды вычислить значение выражения, используя функции, возвращающие void и не void
На примере этого кода: http://rgho.st/private/6pWf8Nz4L/4f7016b7ba8c1a06444ae6ff71440156
Пытался вкурить за сам void - нихуя
>кстати, так делать нельзя, ведь структура - это часть реализации, значит, в хедере ей не место
Твои обезьяньи java-привычки тут не работают, макакич.
>Кому вообще пришло в голову инкриментировать bool?
На реддите чел плакался, что ему придется кучу кода пидорасить из-за этого. Из рахи, судя по нику.
size_t count = 0, l = sub.length();
for (size_t offset = str.find(sub); offset != std::string::npos; offset = str.find(sub, offset + l))
{
++count;
}
Джава - абсолютнейшее говно с точки зрения отделения интерфейса от реализации. Вся документация обычно в исходниках - если нужна инфа, нужно вручную читать исходники. Функции объявляются и на месте реализовываются, в итоге исходный код превращается в кашу.
Я понимаю, для студента вроде тебя нормально держать в хедере таборы цыган, которые создают мешанину, уязвимости и никогда не пригодятся пользователю, но человек со вкусом такого делать не будет.
>>966844
А этого и нет в реализации языка. Плюсовый std::string - лишь часть стандартной библиотеки, ты волен не использовать его. Можешь взять любой васянский типа CString или QString и даже написать свою версию.
А из статьи ты так ничего и не понял.
template<typename T>
void yoba(vector<T> xx)
не принимает initializer_list?
Если добавить функцию
template<typename T>
void yoba(initializer_list<T> xx) {
yoba(vector<T>(xx);
}
то работает
ищи по cppthread
Вот есть у меня структура. Я вызываю функцию и хочу чтобы эта функция возращала ссылку на такую структуру, зосданную внутри этой функции, причем чтобы этот объект потом не исчезал.
Сейчас компилятор не ругается на такой код[code]
structure Al
{int cogolikl;};
Al Yoba(int n)
{
Al Cus = new Al;
(Cus).n = 1499;
return Cus
}
[/code]
Значение полученное функцией использую как ссылку.
Можно это сделать как-нибудь красивее и приятнее?
Почему указатель то висячий? Я же через нью создавал. И не хотелось бы для такой простой штуки прибегать к стль.
Да, про делит помню
Это что, нужно писать специализации для каждого возможного char[N]? Почему вторая функция не ловит строку?
Всё правильно натыкал?
Ладно, тогда хорошо.
У тебя ОС семёрка, судя по всему? Я просто насчёт SDK не уверен. Пакет для графических инструментов 8.1 - это немного не то. У меня на десятке стоит Windows 10 SDK (10.0.10586.0). А вот для Win7 я пункта что-то не вижу.
Да, если что, отладчик графики и профилировщик GPU в Windows 7 работать полноценно не будет. Он ещё в VS2013 не работал нормально на семёрке.
И да, отметь MSBuild.
s = b"asdfg"
compressed = bz2.compress(s)
Да, семёрка. Уже в тренде были вопросы по поводу СДК для 8.1 - вроде говорили, что для 7ки подходит.
Я тогда и 8.1 SDK тоже пну
Графические инструменты убери, они не нужны. Все либы есть в обычном SDK.
>Я понимаю, для студента вроде тебя нормально держать в хедере таборы цыган, которые создают мешанину, уязвимости и никогда не пригодятся пользователю, но человек со вкусом такого делать не будет.
Да-да, java-дебил, при реализации строк нужно обязательно применить pimpl-idiom, а строки создавать только фабрикой.
Там с автоматическим выводом параметра шаблона что-то не то. В обоих твоих случаях помогает явное указание, типа test<const char *>("test");
__FUNCTION__ вроде не все компиляторы поддерживают, в отличие от __LINE__, __FILE__
Никакой еботни с ndebug нет, просто он отключает ассерты. Если наоборот хочешь включить то просто пишешь #ifndef nbebug #undef ndebug #endif
Алсо, мне нравится такой ассерт:
#define asserted ? (void*)0 : fprintf(stderr, "Assertation failed.")
x != NULL asserted;
Дегенерат-студент вспомнил термины из лекций полугодовалой давности и решил, что это то, о чём я говорю. Ну ладно, со временем ты поймёшь, что значит не показывать пользователю то, что ему не нужно.
>Это что, нужно писать специализации для каждого возможного char[N]?
Нет. http://ideone.com/Plv64x
>>967121
> Почему так никто не делает?
Так все делают.
>>967136
> ба-бах
Держи банан.
Если конструктор присваивает пару указателей и не исполняет кода, неплохо бы его инлайнить чтобы копирование объектов было похоже на инициализацию структуры, без вызова функции конструктора
>>967132
Ни разу не видел чтобы конструкторы писали в хедере
>Ни разу не видел чтобы конструкторы писали в хедере
Дивись, хлопець https://github.com/llvm-mirror/libcxx/blob/607e0c71ec4f7fd377ad3f6c47b08dbe89f66eaa/include/vector#L1063
Знаешь, это твоё дело. Если ты не умеешь делать то, что ты пишешь, опрятным и юзабельным, то это целиком твои проблемы. Просто когда у тебя возникнет вопрос, а почему это никто не хочет пользоваться тем, что ты создал, вспомни мои слова.
Я бы взял то, что тащит не особо много кода за собой, уже написан какой-то функционал для работы инициализация и всё такое, есть документация/туторы.
Сам спросил - сам ответил. Чтобы работал initializer_list, должен быть известен тип initialiser_list. Конструкторов может быть несколько. То есть, разумеется, можно добавить в стандарт исключение для объектов с одним определённым конструктором, но это противоречит идеологии продажи оружия для уничтожения ноги.
Может и подойдет, я не знаю, поэтому и спрашиваю.
У меня есть класс, у каждого экземпляра должен быть свой скрипт на Lua. Есть события, которые вызывают определенные методы. Эти методы должны вызывать соответствующие колбэки в Lua. И наоборот, вызов определенных функций в Lua, должен вызывать методы в классе.
Мне нужно то, что позволит это сделать проще всего.
string B = strtok(A, "~");
или
string B = strtok(A.c_str(), "~");
но во-первых мой g++ отказывается такое есть из-за проблемы с конст чар, а во-вторых видел мнение, что это сишный код, а мы пишем на плюсах, поэтому стоит избегать такого.
Методы find() и substr() класса std::string в помощь.
>Гугли
А как ты думаешь, как я нашёл именно этот способ и почему спрашиваю, нет ли ещё? Может потому что везде этот способ предлагают.
Суффиксные массивы/деревья не в счёт, заебёшься с их быстрой реализацией.
>Есть ли способ подсчёта вхождений подстроки в строку быстрее чем тот, который везде дают в качестве стандартного?
Это зависит от того, какой алгоритм испльзован в std::string::find. Самый быстрый - Кнутта-Морриса-Пратта, ЕМНИП.
Олсо, std::find неоптимален для пересекающихся вхождений: в тех случаях, в которых КМП-поиск пропускает символы, std::find этого не сделает, так как ты вызываешь его много раз, а не один.
Точнее: неоптимален для самонепересекающегося запроса.
Пример: строка 123412341234
Запрос: строка 1234
КМП-поиск сравнит каждый символ 1 раз, а тот алгоритм, который ты нашёл, сравнит все символы кроме "1" два раза.
Препроцессинг КМП-поиска можно приколхозить к std::string::find и будет тот же КМП-поиск.
Ну почему не даёт. Во-первых, можно хранить внутренние функции в .c, а не в .h. Во-вторых, в случае со строкой можно делать так: вместо char использовать void, в первых байтах хранить информацию-заголовок, а в оставшихся - данные. Для обработки написать кучу разных функций, знающих, как работать с таким форматом. Что, собственно, и делается в C++, только без костылей.
Вообще, языку Си не хватает только strong typedefs и неймспейсов для безопасности.
>Во-первых, можно хранить внутренние функции в .c, а не в .h.
Это крестотред. Декларации всех методов должны быть в заголовке - фиг бы с ними, с функциями.
Не могу понять, почему нужен pvoid для строки. Что мешает затайпдефить структуру? Чем структура отличается от указателя? Ведь и то, и другое - метаинформация.
Это было к вопросу о том, как нормально реализовать строку в С, т.к. pchar - слишком медленный вариант (читай Джоэла выше).
Проблема структуры "указатель - длина" в том, что длину строки, по-хорошему, нельзя оставлять открытой для изменения. Это небезопасно, это путает пользователя и это вызывает вопросы вида "А что будет, если я сделаю strStruct.size = 100500; CopyStr(strStruct, strStruct2);?". Более того, некоторые так и будут делать.
Задокументировать всё, конечно, можно, но гораздо лучше, если таких вопросов не будет возникать in the first place.
А, и ещё. Положив size открытым полем в структуру, ты больше не сможешь переименовать его или сильно изменить. Потому что тогда у пользователей всё сломается. А спрятав реализацию, ты спокойно можешь менять там что угодно, главное, чтобы открытый API сохранял свою работоспособность.
Спасибо за подсказку. Только я ннп, как я должен находить "разделитель, который не должен нигде более встречаться", он же "любой символ, не входящий в алфавит".
>Проблема структуры "указатель - длина" в том, что длину строки, по-хорошему, нельзя оставлять открытой для изменения.
Приватный size, публичный геттер. Но в сях с этим хуже, да.
>"А что будет, если я сделаю strStruct.size = 100500; CopyStr(strStruct, strStruct2);?". Более того, некоторые так и будут делать.
Эти ошибки можно делать и без этого. Не надо беспокоиться о безопасности, которой нет.
>ты больше не сможешь переименовать его
>или сильно изменить
Зачем? Почему нельзя в объявлении класса оставить только сигнатуру? Зачем мне вообще менять метод size() для элементарной структуры? Каким образом изменение метода вычисления size может сломать программу?
Это нужно только для того, чтобы остановить поиск. string.find останавливает поиск сама с учётом сохранённой длины строки, и в своём цикле ты не должен пытаться заскочить за конец строки. Во всех учебниках написан алгоритм для строки неизвестной длины.
Какого ляда нету lower_bound с выбором компаратора? По стандарту должно быть, где оно? Точнее, почему оно с двумя подчёркиваниями?
>>967422
Нужно больше инлайнов, лол.
Попробуй запилить весь поиск без использований std::string::find(). Я не советчик, впрочем: просто сказал про КМП.
Олсо, это 5.4.0. В 6.3.0 то же самое.
https://github.com/gcc-mirror/gcc/blob/4b5e15daff8b54440e3fda451c318ad31e532fab/libstdc++-v3/include/bits/stl_algobase.h
Я о сях говорил, у крестов таких проблем нет.
>Зачем? Почему нельзя в объявлении класса оставить только сигнатуру? Зачем мне вообще менять метод size() для элементарной структуры?
Опять же, в сях не может быть метода size(). Может быть только функция GetSize(MyString* str) или публичный, открытый для всех член структуры. От последнего варианта нужно бежать как от огня.
>Каким образом изменение метода вычисления size может сломать программу?
Если это плюсовый метод, то, опять же, никак. Если это публичный член структуры в Си, то вот тебе сценарий:
Изначально хранилась пара "Указатель - длина". Для нужд других функций её поменяли на "Указатель на начало - указатель на конец". Всё, поля size у структуры больше нет. У пользователей всё поломалось.
Поэтому хранить сложные объекты в чистом Си в виде структур абсолютно некорректно. Поэтому и вариант с pvoid - единственный нормальный.
Ну вообще мне 4 функции пришлось добавить, поэтому спросил
Искомая строчка в пределах 20 символов. Строка в которой ведётся поиск - десятки кб.
>>967436
>Нужно больше инлайнов
Сложна, сложна
>без использований std::string::find()
Ну так я и попробовал через КМП. Вышло слишком медленно.
>Проблема структуры "указатель - длина" в том, что длину строки, по-хорошему, нельзя оставлять открытой для изменения.
>>967380
>А, и ещё. Положив size открытым полем в структуру, ты больше не сможешь переименовать его или сильно изменить.
Java-макака перечитала букварей по о-о-пе а-ля Бради Гуч и теперь с умным видом поучает всех банальностям.
>Почему
>
>template<typename T>
>void yoba(vector<T> xx)
>
>не принимает initializer_list?
Потому что шаблон vector<T> не может заматчить initializer_list<T>.
Если ты думал, что тут выстрелит конструктор вектора, принимающий initializer_list и произойдёт implicit conversion, то ты жестоко ошибался. Это происходит при overload resolution, который происходит в более поздней фазе компиляции, чем инстанциация темплейтов.
а) Имею (упрощенно):
static struct {
Trigger trigger;
} ctrls[] = {
{
Trigger(HOLD_CYCLES, CRIT_TEMPERATURE_C),
},
{
Trigger(HOLD_CYCLES, CRIT_TEMPERATURE_C)
}};
По стандарту, должны вызываться копи-конструкторы, с помощью которых экземпляры триггеров попадут в массив? А исходные объекты создаются где, в стеке? Все сразу первым делом, и потом копируются, или создался-скопировался каждый по очереди? Мне важно, потому что стек ппц маленький. И еще любопытно: вот эти временные объекты - они rvalue? Для них будет вызыван move-конструктор вместо copy, или нет и не будет?
2) Дальше по тексту будет что-то вроде
for (auto &ctrl : ctrls) {}. В данном случае будет ли какая-нибудь разница между for (auto &&ctrl : ctrls) и for (auto &ctrl : ctrls)? Если здесь не будет, то где будет? Не предлагайте писать for (const auto &ctrl : ctrls), у меня там вызывается фкункция, изменяющая состояние объекта.
Ну напиши что-нибудь простое и проверь, как это на самом деле работает. У меня не вызывался конструктор копирования. Возможно, что я не так задачу понял или не шарю.
http://ideone.com/KDH1h2
>разница между for (auto &&ctrl : ctrls) и for (auto &ctrl : ctrls)
Ну для rvalue ссылок будет конструктор перемещения использоваться, так что я бы не стал этим баловаться в цикле.
>Ну для rvalue ссылок будет конструктор перемещения использоваться
В смысле, можно закорраптить элементы в структуре данных.
>Ну для rvalue ссылок будет конструктор перемещения использоваться, так что я бы не стал этим баловаться в цикле.
Действительно, херню сморозил.
(auto &&ctrl : ctrls) == (Trigger &ctrl : ctrls)
Судя по комментариям из кода отсюда:
http://en.cppreference.com/w/cpp/language/range-for
Для интов это элементарно: return b-a. А для флоатов?
>>967447
>Если это плюсовый метод, то, опять же, никак. Если это публичный член структуры в Си, то вот тебе сценарий:
В C безопасности нет, зачем эта осторожность? Разве что для успеха ловли багов.
>Изначально хранилась пара "Указатель - длина". Для нужд других функций её поменяли на "Указатель на начало - указатель на конец". Всё, поля size у структуры больше нет. У пользователей всё поломалось.
Не-а, не катит. Откуда у пользователей взялась старая версия? Сериализация должа быть с версионированием, если ты собираешься менять класструктуру.
>>967436
>Какого ляда нету lower_bound с выбором компаратора? По стандарту должно быть, где оно? Точнее, почему оно с двумя подчёркиваниями?
Сам спросил, сам отвечаю: задефайнено в другом месте. Креактор не подхыватывает почему-то.
>Новый вопрос: как мне из отрицательного float, 0.0f и положительного float сделать -чото, 0 и +чото соответственно?
>
>Для интов это элементарно: return b-a. А для флоатов?
Чё?
Мне нужна функция, которая возвращает int меньше 0, равный нулю или больше 0 при a<b, a==b и a>2 соответственно.
Могу закодить в лоб, но хочется что-то покрасивее.
Вот да, это я тоже видел (комментарии), а не понимаю, как так. Где-то в стандарте описывается, что ли, как именно auto&& разворачивается?
Вот тут описано довольно просто, но не знаю, поможет ли тебе:
http://stackoverflow.com/questions/29859796/c-auto-vs-auto
Вот это может помочь.
http://stackoverflow.com/questions/27141390/fast-compare-ieee-float-greater-than-zero-by-cheating
>В C безопасности нет, зачем эта осторожность? Разве что для успеха ловли багов.
Вариант с pvoid вполне более безопасен, чем открытая структура. Средненькая безопасность лучше плохой.
>Не-а, не катит. Откуда у пользователей взялась старая версия? Сериализация должа быть с версионированием, если ты собираешься менять класструктуру.
Ну пользовались они два года старой версией. Использовали либу у себя в проекте. А после обновления все места, где либа использовалась, перестали работать. Нехорошо как-то.
>Ну пользовались они два года старой версией. Использовали либу у себя в проекте. А после обновления все места, где либа использовалась, перестали работать. Нехорошо как-то.
С хера ли они перестали работать? size больше не возвращает size? sizeof(yoba) не использовали?
Не могу понять источник проблемы.
>>967564
Помогло, но тут я понял, что Compare-функции в стандарте хотят другое.
Спасибо, няша. Там все достаточно хорошо разжевано.
Как можно элегантно вынести i за скобки? То есть, сделать так, чтобы имя переменной было упомянуто 1 раз.
Ну можно, но это не для всех:
http://stackoverflow.com/questions/15088900/neatest-way-to-loop-over-a-range-of-integers
Не макрос, а макро. Как это будет выглядеть? for(i,huy,zalupa,operator++)?
Есть вариант с range-forом и лямбдами, но он громоздкий же.
И вот ещё упомянутые сударем >>967633 макросы.
http://stackoverflow.com/questions/24392000/c-define-a-for-loop-macro
Раньше:
for(int i = 0; i < myStr.size; i++)
{
myStr.str = 'a';
}
И всё собирается.
Сейчас:
for(int i = 0; i < myStr.size; i++)
{
myStr.str = 'a';
}
Выдаст ошибку ""size" is not an element of MyString".
Потому что MyString раньше имела такой вид:
struct MyString
{
PCHAR str;
size_t size;
}
А теперь такой:
struct MyString
{
PCHAR strBegin;
PCHAR strEnd;
}
Раньше:
for(int i = 0; i < myStr.size; i++)
{
myStr.str = 'a';
}
И всё собирается.
Сейчас:
for(int i = 0; i < myStr.size; i++)
{
myStr.str = 'a';
}
Выдаст ошибку ""size" is not an element of MyString".
Потому что MyString раньше имела такой вид:
struct MyString
{
PCHAR str;
size_t size;
}
А теперь такой:
struct MyString
{
PCHAR strBegin;
PCHAR strEnd;
}
Ну так поломается всё.
А вот было бы спрятано всё от пользователя в PVOID с непрозрачными API-функциями, такого не случилось бы.
Ну какие фабрики и прокси? Опять ты вылез? Ты хоть осознаёшь, что ебля с байтами в PVOID не имеет ничего общего с ООП-паттернами?
Я тебе привёл конкретный (заметь, самый конкретный) пример проблемы, которая иначе не решается. А ты начинаешь кидаться говном и кричать.
Например
template<class A, class B>
void yoba()
{
std::map[A, B]
std::unordered_map[A, B]
std::vector[A, B]
}
Или например
enum Type { AB = 0, BA = 1};
template<class T1, class T2>
void yoba()
{
// 0 если T1 = A, T2 = B
// 1 если T1 = B, T2 = A
Type id = magic<T1, T2>
}
Зачем, когда обычный заголовок в PVOID (заметь, кроме сей и ассемблера, так нигде не решают проблемы) подойдёт?
Тут указан пример для одного типа http://en.cppreference.com/w/cpp/types/type_index
А как скомбинировать типы не знаешь?
Насколько я понял, вот это исполняется в рантайме
unordered_map<size_t, string> container;
container[typeid(A).hash_code() + typeid(B).hash_code()] = "AB"
container[typeid(B).hash_code() + typeid(A).hash_code()] = "BA"
хотелось бы так же в компилтайме
callbacks.set<ReturnT, ParamT>("name", [] (ParamT x) -> ReturnT {})
и
ReturnT result = callbacks.get<ReturnT, ParamT>("name")(param)
Иначе единственный выход писать
setCallback_Scalar_Array()
и
getCallback_Scalar_Array()
потому что std::function<T1(T2)> не кастуется ни во что другое
Бля, опять проблемы http://ideone.com/6oLAjz
function<void(...)> и function<...(void)> не работают даже при перегрузке функции, а шаблоны где T = void это вообще отдельная история
Для таких вещей нельзя написать UML-диаграмму, опять ты несёшь бред не по теме. Нету в UML соответствующих конструкций.
Это возможно только с pvoid.
Вот ты прикалываешься, а ведь на деле это гораздо безопасноснее. И заметь - никакая ява не нужна.
Подожди, я сейчас напишу минимально юзабельную либу для строк на чистом Си, заценишь.
хедера, фикс.
>чому main файл всегда без хежера?
Зачем? В идеале в main ничего не должно быть кроме точки входа в программу и может обработки текстовых аргументов.
>Что будет если я сам добавлю его?
У тебя будет main с хидером.
>Это возможно только с pvoid.
Теперь понял. Спасибо за объяснение.
Будем надеяться на то, что модули подъедут.
И часто ты пишешь программы, единственным результатом которой может быть поедание процессорного времени и возврат результата в виде экзит-кода?
>>968141
Где почитать про это?
Есть вектор a, положим - std::vector<int> a = {1,4,8,8};
Мне нужно как в дишечке - снять с него слайс, т.е. получить еще вектор который сделан по данным старого вектора.
Т.е. там бы я сделал int[] a = [1,4,8,8]; int[] b = a[1..$]. Тут делал std::vector<int> b(++std::begin(a), std::end(a));
Только вот я глянул на data() - и как выяснилось, эта проблядь второй вектор скопировала, а не просто указалась на данные первого.
Как это сделать? Ну т.е. чтобы второй подмассив показывал на данные первого, т.е. без копирования? Я пробовал ставить const - думал этой хуйне нужны гарантии что я там нихуя не поменяю - ей по барабану.
В языках без сборки мусора такое сложно сделать. А конкретно с вектором нельзя, потому что вектор управляет памятью в которой хранятся его элементы. Ебись с итераторами.
Тебе придётся хранить в исходном векторе указатели или ссылки. Если ты будешь хранить в одном векторе данные, а в другом ссылки, то эти ссылки наебнутся при ближайшем перестроении исходного вектора.
> то эти ссылки наебнутся при ближайшем перестроении исходного вектора.
По условиям задачи этот вектор и вовсе константный, (ну почти, после инициализации и сортировки), все его слайсы никогда не переживут его самого, и на момент когда они создаются - и он сам, и они - никогда ничего внутри менять не будут, кроме как сужаться.
Я думал, что или есть способ заставить вектор так сделать, или что в stl есть какая-нибудь обертка над парой итераторов.
Если не брезгуешь бустом, посмотри на это:
http://www.boost.org/doc/libs/1_62_0/libs/fusion/doc/html/fusion/view.html
Ещё в стандарте есть std::slice, но это очень узкая реализация.
Ну, документация там довольно неплохая. Если тебе понадобиться что-то конкретное сделать, шансы найти почти готовую реализацию в доках высокие. Ну если тебе просто нужно выучить до уровня "Qt на кончиках пальцев", то есть книги, но что-то конкретное я не могу подсказать.
Кроме этого, миллион статей в интернете и различные попенсурс проекты но это не точно
mylib.h:
#include <clib.h>
...
main.cpp:
#include "mylib.h"
#include "clear.h"
Макросов очень много. Кому они понадобятся - может не подключать clear.h
Закинуть ещё десяток колбеков и можно игру написать
Для распаралеливания кода в одном потоке можно использовать корутины, в с++11 кажется что-то в этом роде добавили в стандарт (std::future), или это только для тредов, не помню
template<class T1 <class T2>>
void yoba(T1<T2> container)
Если не ошибаюсь, дальше вызываешь begin и end
>Есть ли в stl какой-нибудь единый тип итератора?
Если у объекта есть некоторый набор свойств, и он наследник инстанса темплейта iterator, он называется итератором.
http://www.cplusplus.com/reference/iterator/
Чтобы сделать функцию, принимающую итератор, нужно функцию занести в темплейт. Функций станет много (по одной на каждый набор аргументов темплейта), но ты этого не заметишь, если будешь использовать угадывание аргументов темплейта.
Если это метод: ошибка компиляции, так как аргументов быть не должно.
Если это функция - перегружает оператор ++ для интов.
Ан, нет, переопределять встроенные операторы низзя.
http://ideone.com/58WIn9
Так что это может быть только метод, и метод operator++ не может принимать аргументы.
Постфиксный инкремент.
std::thread
Правильно ли я понимаю, что вот это вот try-catch, это типа эволюционировавшее сишное
If (foo() == -1)
{
// проверить значение errno и действовать дальше исходя из него
}
// все хорошо, работаем дальше
Я нашёл такие декларации:
Iterator& operator++();
Iterator& operator--();
Iterator operator++(int);
Iterator operator--(int);
Да только ещё исключение это полноценный класс в который можно при выбрасывании засунуть любую информацию и чуток логики для взаимодействия с ней. Обрабатывается не на месте а где-то выше по стеку вызовов. Когда кидаешь исключение посреди функции обычно приходится ломать голову как освободить ресурсы и вообще выйти из этой жопы чтобы приложение продолжило работу когда эта функция снова будет вызвана после обработки исключения, которая обычно происходит где-то далеко и не имеетпрямого доступа к тому с чем эта функция работает.
Подскажите пожалуйста ньюфагу где я обосрался: шахматная доска, хочу пройтись по диагоналям н-точки и поменять значения, для этого ищу 1 - начало левой диагонали, 2 - начало правой диагонали.
Где ты их нашёл? Я только въезжаю в кресты, и если ты хочешь моего участия, мне нужно больше данных.
http://stackoverflow.com/questions/3846296/how-to-overload-the-operator-in-two-different-ways-for-postfix-a-and-prefix - аааааааа какой мудак додумался до (int).
Можешь почитать "Дизайн и эволюция С++". Там сам Страуструп поясняет почему да как сделано.
Хочу менять значение диагоналей от н-точки. То есть везде где стрелочки (кроме точки-фигуры) должны поменяться значения (двухмерный массив).
https://pastebin.com/zKsCUdsg
Итак, после некоторой стабильной работы (пара десятков запусков с отладкой, например), fn() начинает валиться. Я стал копаться из-за чего это, дело оказалось в том, что не смотря на то, что c указывает на валидную область память и читается (при этом и ичтается его атрибут _element), результат же выполняемой функции c->getElement() возвращает указатель на область памяти по адресу 0x00000001. Что за хуйня?! Ничего касательно этого кода не меняется абсолютно, что может быть причиной такого поведения?
Первое, что приходит на ум - ты объект класса на стеке создаёшь. После выхода из createSomeClass() объект утилизируется. Это единственное, что приходит на ум с таким количеством информации.
В том то и дело, что все в куче. По сути, getElement возвращает только указатель, который уже хранится в объекте. Через GDB я читаю все поля объекта нормально, но вот после вызова getElement возвращается какая-то хуйня, не смотря на то, что память вроде как нормальная.
Единственное, что помогает это перекомпилировать все с нуля, но это пиздец идиотия, я считаю.
Минут по 5 собирается и каждый раз в отладку... А как с релизом делать, там же никак и не поконтроллировать, просто упадет и все.
После нее возвращается нормальный адрес, а не 0x00000001. При том, что ничего не меняется. Я вообще нихуя не могу понять... может на оперативку стоит сетовать теперь.
Ну так она возвращается потом через некоторое время. Может действительно стоит забить на это, но я думаю, как бы это не вылезло все в риалтайме.
Попробуй что-то такое. Просто самое тупое, что в голову пришло (в вольфраме массивы с 1 начинаются, так что небольшие корректировки нужны) кеке.
Ниет.
Undefined behaviour, блядь.
>>969369
>В том то и дело, что все в куче.
_element в куче?
Отдели функцию от остального кода и вызывай её в цикле. Олсо, возвращать указатель на приватную переменную в геттере - долбоебизм.
Они там охуеть какие приватные. Я этот заголовочник не менял, хотя почему-то у меня подозрения по поводу публичности полей. С другой стороны, ни friend-классов ни аксессоров нет.
https://pastebin.com/YYG4Teix
Нам не интересен твой говнокод, нам нравится помогать людям. Если ты не можешь поделиться программой, которая ТОЧНО падает после длительного выполнения - забей и забудь.
Олсо, если проблема в памяти, то с большой вероятностью у тебя должен регулярно падать браузер - у меня мемтест ничего не находил, зато падали Опера, Хром, ФФ и ошибки в Prime95/LinX были.
>> которая ТОЧНО падает после длительного выполнения
Она даже не в многопоточке. Эта хуйня вылезает при отладке и вылезши единожды остается навсегда до следующего полного ребилда. И я бы избавился от этого места, но у меня часть физики завязана на этом.
>> Олсо, если проблема в памяти, то с большой вероятностью у тебя должен регулярно падать браузер - у меня мемтест ничего не находил, зато падали Опера, Хром, ФФ и ошибки в Prime95/LinX были.
В том то и дело, что нет.
хитёр
но я про литературу
начал "С++ для начинающих"
стоит ли продолжать, ибо там Dev-C++ использую зазорно ли?
Если прочитал и все осознал - начинай майерса читать.
Про Dev-C++ я не понял, но если ты сам это используешь - выброси, и поставь студию
Куда делся ОП-стихописец?
Спроси в /s/.
Последние пару недель по вечерам казуально вкатываюсь в плюсы, пописывая небольшую игру на SDL, так чисто для себя for fun.
В самом SDL нет ничего, кроме биндингов к битмаповым текстурам OpenGL, так что движок по сути я пишу сам. Так вот я упёрся сейчас в необходимость некоего "Tween Manager'а", который бы мог управлять изменением во времени свойств моих объектов, например изменить координату 'x' некоторого спрайта на +50 пикселей за 5 секунд с интерполированием по синусоиде, чтобы было плавно.
Проблема только в статической типизации, есть например свойство "прозрачность" с типом unsigned char (от 0 до 255), есть координаты в int, угол наклона в float... Пока единственное, и возможно очень тупое решение, которое пришло мне в голову, это писать всю логику твинера на (void*) и кастовать к нужному типу внутри, что-то на подобии:
MySprite★ player = new MySprite();
player.x = 150;
player.y = 300;
int newX = 200;
// переместить спрайт по х из положения 150 в 200 за 5 секунд
TweenManager -> tween ( &(player.x), 'int', &(newX), 5000, TWEEN_EASE::SIN);
void tween (void★ targetValuePointer, const char★ valueType, void★ tweenToValue, uint32 milliseconds, TWEEN_EASE ease);
Но это скорее хак, нежели правильное решение, да ещё и для целевого значения нужно выделять переменную, чтобы передавать её адрес. Не самый лучший способ в общем. А кучу врапперов для врапперов для свойств писать так не хочется...
Кому-то может показаться, что здесь идеально подойдут шаблоны, но на самом деле нет, потому что твины будут храниться в векторе, а тип свойств нужно определять в рантайме, чтобы можно было, к примеру, загрузить из файла-скрипта кастомную сцену с твинами.
Ну я бы в этом случае упоролся виртуальными функциями. Или это какой-то закрытый класс из либы?
Гуд. Я вижу тут 2 выхода:
1. Создаёшь базовый абстрактный класс с виртуальной функцией tween. Потом у дочерних классов реализуешь как надо каждый.
2. (неочень способ) Делать, как ты хотел. Для этого существует dynamic_cast.
ECS не поможет?
ещё о чем хотел спросить
вот есть такое приложение на ведромб и ios "SoloLearn"
Там всё подробно объяснено
Замещает ли оно книгу "С++ для чайников"?
- итераторы начала и конца заведомо относятся к разным объектам
- имя, которое является частью стандарта языка, переопределяется в одной из либ/заголовков (при using namespace std).
Такие есть? Или пока что это только статические анализаторы умеют?
скачиваешь ллвм и пишешь чекер для статик аналайзера(если там такого еще нет)
>Хочу, чтобы компилятор предупреждал меня о том, что:
>- имя, которое является частью стандарта языка, переопределяется в одной из либ/заголовков
Что в этом плохого? Чтобы он орал на определения swap, begin, end, operator<< и пр. подобное для твоих типов?
Лучше книги ничего нет
Запилил Рабина-Карпа для множества образцов, работает в десятки, если не сотни, раз быстрее. Даже хэш считать не пришлось, unordered_set само всё делает.
>swap,
Move constructor, метод.
>begin, end, operator<<
Методы.
Мне нужно точно знать, что я использую именно родной шаблон, родную функцию, а не определённую где-то случайно.
Для этого ввели неймспейсы. А заставлять компилятор выполнять работу статического анализатора врядли кто-то станет.
Друг мой, ты поехавший? Где ты там увидел вопрос? Ты всего лишь жаловался, что не можешь что-то придумать.
Анончик, выручай.
Ап
Это копия, сохраненная 22 мая 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.