Это копия, сохраненная 26 сентября 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Песенка - https://youtu.be/5EHPETP8lZ8
Прошлый - https://2ch.hk/pr/res/1036675.html (М)
пришел таки к успеху! (но на стрижку до сих пор жопит)
а ножки можно?
Ну что ребят, запилим что нибудь годное? Может свой БолженОS или компилятор машинного кода?
Опять какой-то петух высрал кириллическую С в заголовок.
>>1045343
>- Стабильного ABI
Бинарнопетух подъехал. Нахуй надо? Есть ещё один язык, кроме ассемблера и псевдоассемблера, у которого это есть?
>>1045350
Надо разделить всю программу на достаточно маленькие для тебя части и везде чекать наличие ошибки. Другого способа получить строго defined-поведение программы нет. Посему у std::thread нету никакого terminate.
>>1045369
Ты путаешь ретурн-значение с аварийным завершением.
>>1045513
>компилятор машинного кода?
У меня тут идея. Надо провести битву самодельных компиляторов для x86, тестируется:
- производительность собранных экзешников в разных задачах
- производительность экзешников, собранных другими компиляторами-участниками и транслированных в ассемблер.
каково блядь, кому только это надо?
> битву самодельных компиляторов для x86
Я только за анон, какие сроки выполнения, условия?
Если найдутся еще желающие, чтобы участников было хотя бы 3-4 то можно провести.
Я пошутил, конечно, так как создание компилятора (с нуля?) - огромный труд. Просто спетросянил в ответ на петросянство.
Чёлкой сможешь хлеб отрезать?
Ну, я думаю где-то год минимум. Может полтора. Если компилить скажем сишку или питон. Если кресты - то я ебал его нога и идет оно нахуй.
https://ideone.com/NzK90p
точно также, как x[2] = 2[x] = 8 в данном случае
Какое-то странное поведение, если в производном классе создать поле с дефолтным значением и добавить в распечатке в e() его, то static_cast<derived&>(bRef).e() здесь он всегда вместо значения будет 0 пропечатывать.
e() - невиртуальный метод. Компилятор просто взял и подставил вызов функции, без шароебли по vtable.
Давай с виртуальной попробуй.
А с нулями тебе просто повезло на пустую память по смещении от адреса указателя на объект
Может, Схему? Парсить S-выражения может школьник, стандарт малюсенький, а оптимизировать можно дохрена.
Скажи мне, как устроены объекты в крестах? Я так понимаю, ссылки на виртуальные методы лежат прямо в объекте? Как они отделены от данных? Почему бы просто не носить в объекте ссылку на тип?
В vtable лежит ссылка на typeinfo. А если тип не полиморфный то typeinfo статически определяется на этапе компиляции. Больше, собственно, ничего характеризующего тип не лежит. Да и это опционально и отключабельно в компиляторе.
Нет, я имею в виду, что все ссылки на методы класса могли бы лежатьтв одном месте, например, а не таскаться длинной бородой заткаждцм объектом
Много писать, да и лень с телефона. Вот здесь с примерами и в целом можно разобраться - https://habrahabr.ru/post/51229/
Ну ок тогда.
Так и есть - vtable создаётся одна для класса, в объекте хранится лишь указатель на vtable. В конструкторе, указатель устанавливается на vtable класса, в деструктор к устанавливается в vtable родительского класса перед вызовом деструктора родителя.
Пытаюсь написать функцию, которая находит наименьшее общее кратное. Иду простым лаконичным путем (пик 1) - нихуя не работает, судя по дебаггеру, луп просто игнорируется. Но do-while(true) луп с той же логикой (пик 2) отрабатывает нормально.
Что за чертовщина? Что я делаю не так?
На сколько мне известно, смотри:
Имеется ссылка класса Base.
Потом ссылка Base кастится в ссылку derived, но участок памяти до сих пор ссылается на объект Base.
Значит теперь у нас вместо вот этого: Base & bRef = b, вот это derived& bRef = b. А имена функций и члеов начинают искаться из области видимости типа(в нашем случае bRef - у него теперь тип derived, то есть ищется функция или имя в области видимости derived). Вот почему вызвалась e.
Я тот анон, который ответил выше. Ты сам в вопросе ошибся. bRef = b, а не d.
Вот тебе как понять. Пример твоего.
while(!(true && false)) - это пример как у тебя может получиться. Чтобы работал цикл, нужно чтобы в главных скобках был true. Так как true && false рано false, то отрицание (!) превращает из false в true. Если нужно подробнее, обращайтесь.
sudo apt-get upgrade g++
> Какого хуя он вызывается, если в базовом классе его нет?
Статик каст не проверяет корректность преобразования, это в стандарте написано. Привет UB (или как там?). Используй dynamic_cast, тебе в рантайме это выплюнется.
>>1045598
ALO UB ETO TI
>>1045784
Нету у G++ такой версии, блядь (или ты про пакет из новой Убунты?).
Найди сторонний PPA репозиторий, если в официальном нет, или на крайняк сам сбилди, кроме --prefix можно вообще не заморачиваться и не указывать опции
Абсолютно все книги в шапке и еще многое другое
И чтоб стандарт от зубов отскакивал.
Как понять, что я джун? Если год назад устраивался на работу как стажер и до сих пор работаю
Олсо, специально для этого сделаны эксепшены: всё то, что ты считаешь ненадёжным, ты оборачиваешь в try-catch и ловишь, при этом перед каждым вызовом небезопасной функции твои объекты должны быть в валидном состоянии (т.е. у тебя не будет ошибок и утечек, если любая ненадёжная функция завершится). Это достигается абстрагированием.
Ты их используешь, но не до конца понимаешь этого. И я не в плохом смысле о них говорил, паттерны - они везде, как бы ты ни хотел от них избавиться. Правильный дизайн приложения обеспечивает надежность/быстродействие/модифицируемость/тестируемость/защищенность/масштабируемость/робастность/... (нужное подчеркнуть).
Некоторые местные петухи кукарекают по поводу экономии лишних байт и тактов процессора, но ты их лучше не слушай. Грамотно составленный скелет приложения (архитектура или конструкция) и правильно выбранные алгоритмы провернут на хую всю их работу над сдуванием пылинок с полированных яиц кота.
Паттерн - это вид взаимодействия между объектами. Ты чаще всего используешь ограниченный набор этих взаимодействий, то есть у тебя в голове какие-то паттены (шаблоны взаимодействия) есть. Где-то можно узнать, как они называются - почитать книгу какую-нибудь.
>всё то, что ты считаешь ненадёжным, ты оборачиваешь в try-catch
Это Java-macaque-style. В C++ есть RAII и если ты пишешь try-catch блоки, то значит ты что-то делаешь не так.
> паттерны - они везде, как бы ты ни хотел от них избавиться
Когда в руках молоток — всё вокруг кажется гвоздями.
>если ты пишешь try-catch блоки, то значит ты что-то делаешь не так
Разве RAII позволяет отказаться от try-catch
Я подумал - ты прав. Если вся иерархия объектов и функций сделана так, что вызов любой ненадёжной функции оставляет их в валидном виде - да, трайкетч для строго определённого поведения не нужен.
Если я могу обосраться из-за того, что new бросит std::bad_alloc, то как мне обойтись без try-catch?
Правильно, блядь, пусть всё к хуям тормозит, зато обдрочимся на ебучий скелет, который нахуй никому не сдался
не использовать new, но это не делает концепцию исключений менее уебищной (если мы говорим о языке на котором пишем высоконагруженные и надежные системы)
Разница в том, что константные объекты не связываются с неконстантными ссылками?
1)слишком implicit. ты не можешь просто посмотрев на код понять где и что может пойти нет так, надо смотреть документацию. Из этого проблемы аля "тут чёто какойто экспшн выпал внезапно, а мы забыли трайкетч написать". В этом плане в Rust всё сделано просто прекрасно, монады, match, просто сказка а не язык.
2) Очень сильно зависит от RAII, а RAII применимо далеко не всегда, я даже элементарно не могу в деструкторе класса File написать close(fd); потому-что при попытке записи временного буфера на диск на этом диске может закончиться место, и что делать непонятно (можно кинуть экспшн из деструктора))))))))))
Сугубо личное мнение, может кому-то эта концепция и нравится
По идее, ссылки не должны менять то, на что они ссылаются. А вот указатель может менять то, на что он ссылается.
Ссылки - для стековых объектов, указатели - для хиповых. Не константные - для выходных параметров (т.е. этот параметр изменяется в функции, см. out/ref C#), константные - для входных.
ссылки - алиасы к переменным (еще одно имя), указатель - еще один объект, который модет указывать на другой объект. мы можем биндить конст ссылку к не конст переменной но не наоборот. по конст ссылке мы не можем вызывать не конст методы, но можем их вызывать непосредственно к неконст объекту. А вообще, это с практикой приходит
Принципиальная разница одна - ссылка присваивается один раз при инициализации, и потому нельзя менять куда она ведет (без грязных трюков). В остальном разницы нет.
>как можно в двух словах объяснить разницу между указателями и ссылками
Указатель — объект, а ссылка — нет.
Зачем тебе ловить bad_alloc, посмотреть на него?
Он не дает тебе забыть о том, что что-то может пойти не так. Всё время приходится или матчить, или траить, или анврапить
>ты не можешь просто посмотрев на код понять где и что может пойти нет так, надо смотреть документацию.
Просто пиши так, чтобы код был exception-neutral.
> Из этого проблемы аля "тут чёто какойто экспшн выпал внезапно, а мы забыли трайкетч написать".
трайкетч везде писать не надо, C++ это не Java.
> Очень сильно зависит от RAII, а RAII применимо далеко не всегда, я даже элементарно не могу в деструкторе класса File написать close(fd); потому-что при попытке записи временного буфера на диск на этом диске может закончиться место, и что делать непонятно
> В этом плане в Rust всё сделано просто прекрасно
Охотно верю, что в Rust сделано прекрасно. На пике демонстрация этого «прекрасно».
https://github.com/rust-lang/rust/blob/6ccfe68076abc78392ab9e1d81b5c1a2123af657/src/libstd/sys/unix/fd.rs#L240
> при закрытии. Что дальше?
>
А дальше месэдж бокс какой нибудь, или ещё что-то, зависит от логики, лал
>>1046126
Я и не говорил что в расте охуительная стандартная библиотека особенно мне нравится момент, когда ты говоришь Vec::push({}), а он паникует)). Имел ввиду, что в расте куда больше возможностей для реализации надежных приложений, чем в С++.
Разумеется и на плюсах прекрасно работают сервера, это лишь моя точка зрения)
>А дальше месэдж бокс какой нибудь
Файл открывается/закрывается глубоко в кишках какой-то либы, которая о GUI ничего не знает (и знать не должна).
Откуда ей знать, что надо показать «месэдж бокс какой нибудь»?
Я не понимаю в чем вопрос.
Как сообщить либе что делать если файл не закрылся? Колбэки, события и тд и тп.
Или я что-то не понял?
>Колбэки
ЛОЛ! Можно перефразировать: «Из этого проблемы аля "тут чёто какая-то ошибка выпала внезапно, а мы забыли колбэк дёрнуть".»
Что насчёт асинхронности, реентерабельности и поддерживаемости такого кода?
> Или я что-то не понял?
Как писать поддерживаемый софт.
Ну так зачем ты предлагаешь архитектуру на колбэках тогда?
Связка qtCreator+Cmake+MinGW работает. Пытаюсь по аналогии запустить c LLVM. Меняю компилятор с/с++ на llvm, и он жалуется на какой-то сmake generator. Список возможных вариантов на второй картинке и ни один из них не работает и вообще ничерта не понятно что и где нужно прописать, куда что установить, чтоб оно заработало.
Что ещё за генератор такой и зачем оно нужно? Компилятор компилирует файлы, CMake говорит что и в какой последовательности этому компилятору компилировать. Разве там есть что-то ещё? Чёрт ногу сломит, что мне прочитать, что мне сделать, чтоб эта хрень стала понятнее?
>CMake говорит что и в какой последовательности этому компилятору компилировать
Вот тут-то ты и проебался. Симейк никому ничего не говорит, он просто пилит мейкфайлы за тебя. То есть симейковый мейкфайл + генератор мейкфайлов = сгенерированный мейкфайл под конкретную платформу. Дальше сам разберешься.
ЕМНИП, у LLVM для винды (?) нету make. LLVM на винду надо устанавливать вместе c MinGW, чтобы был make.
Clang есть, он к MSVC каким-то образом липнет. Я так понимаю, он и pdb файлы мелкософтовские может жрать, вот это я понимаю совместимость.
что, сучка, столкнулся с первыми реальными задачами и проблемами, отличными от "хелло ворлд" и уже заныл?
а? это, блядь, твоя работа, иди сука и копай вглубь
Разве если где-то внутри nothrow функции возникнет исключение которое мы забыли заткнуть кечем, оно не сломает свертку стека, что закрашит программу?
Clang можно использовать либо с MSVC, либо с MinGW, сам по себе clang не будет работать
Какие же спермобляди дегенераты, пиздец просто.
Ты наверное перепутал nothrow с noexcept.
nothrow можно передать как аргумент для new, например auto pVar = new (std::nothrow) Type. В случае ошибки new вернёт нулевой указатель.
Если указывать noexcept для ф-и, и внутри неё ты захочешь вызвать ф-ю, которая может бросить исключение, то компилятор должен об этом сообщить.
Нет, оно просто вызовет std::terminate и сразу завершит твою программу.
Не должен. программисту лучше знать, что вот конкретно в этих условиях оно по-любому не бросит, отвечаю. Поэтому спокойно зови что угодно, но если что - сам виноват.
Если вызывается std::terminate то никаких гарантий того, что стек будет разворачиваться в обратную сторону и будут вызываться деструкторы объектов нет, потому что это нахуй не нужно зачастую, ведь система подчистит ресурсы мертвого процесса сама. Веселуха будет, если ты кинешь исключение во время обработки другого исключения, например:
у класса a есть конструктор и деструктор, второй кидает исключение, есть также класс b, который наследуется от класса a и в конструкторе кидает исключение. Если ты поместишь объект b в область видимости try блока, то сначала вызовется конструктор а, потом вызовется конструктор b и бросит исключение. Стек начинает раскручиваться в обратную сторону, попутно вызывая деструкторы для всего, что успел инициализировать в try-блоке в порядке, обратном их появлению. И тут ... ннна нахуй ... деструктор b вызывает деструктор a и кидает еще одно исключение, вот это неожиданность. Конечно, фактически твоя программа вышла за пределы try блока и поэтому исключение перехвачено не будет, поэтому будет вызвана std::terminate со всеми вытекающими.
Так что вот поэтому не рекоммендуется кидать исключения в деструкторах, я еще ни разу не видел, чтобы так делалось.
Смотря зачем. Если из личного любопытства, то есть. Если ты надеешься, что тебе это где-то пригодится, то это вряд ли
ну, асм щас нужен реверсерам, в частности вирусным аналитикам, это не программирование, знаний надо дохуища (хотя на работе изо дня в день будешь заниматся монотонной заябывающей рутиной), платят меньше чем кодеру с++, а кодеру крестовику платят меньше чем пхп-обезяне
низкоуровневое программирование? это че? если микроконтроллены, то надо знать микроэлектронику, тоже вообще отдельный пласт знаний от программирования, знать надо опять дохуищи всего, чтобы при этом зарабатывать раза в 4 меньше все той же пхп обезяны
или низкоуровневое программирование - это драйверописание под линукс или винду? ну чтож, надо потратить 10 лет чтобы смочь написать небажной полноценный драйвер щас, и при том что подобной работы в мире все меньше и меньше, хуй куда устроишься
>при том что подобной работы в мире все меньше и меньше
Почему такой работы становится меньше?
Прежде всего не каковы причины его утверждения, а истинно ли оно вообще. Пусть тащит статистику.
На сколько я могу судить, количество железок с течением времени только растет, под каждую нужно написать софт. Да, он скорее всего будет повторяться, и процесс сведется до тривиального, но кто-то эту работу должен делать?
потому что все написано
взять тех же системщиков на линуксе
сетевой стек более-менее написали, спиздив многое из bsb-систем
файловые системы тоже довели до нормального состояния, во многом позаимствовав идеи у солярки
после того как сделали аппаратную поддержку виртуализации на x86 процах (которая уже десятки лет до этого бала на мейнфреймах), сделали и всю инфраструктуру нужную для виртуализации на линуксах, поверх этого сделали инфраструктуру нужную для построения облаков, saas и paas сервисов
безопасность доже докрутили, спиздив многое опять же у майкрософт и у коммерческих реализаций юниксовых систем
что щас остается системникам? допилились виртуализацию на уровне оперативных систем, в общем докер и все что ниже его крутиться и инфраструктуру поверх
само собой, за эти два десятка лет писались драйвера под всяхие железки и щас в принципе почти подо все уже написано
и че получается? то что системники под линукс сделали свою работу и большинство может смело послано нахуй
а оставшаяся небольшая часть будет уныло дописывать драйверки на время от времени появляющееся новое оборудование
Если ты спрашиваешь - нет.
Ты так говоришь, как будто бы все уже сделали до нас, и нам уже ничего не остается. Все равно будут придумывать новые технологии и хуевины, под которые тоже надо писать драйвера
>надо потратить 10 лет чтобы смочь написать небажной полноценный драйвер
Чему там 10 лет учиться, функции инициализации устройств наизусть выучивать?
Ну хз, сложно как то. Пару лет назад видел гайд как написать драйвер, но у меня ошибки какие то полезли, в общем не скомпелировалося.
Может скинешь какие нибудь видосы по этой теме?
те лично ты писал драйвера и не столкнулся с трудностями?
именно поэтому была влеплена сажа?
>ошибки какие то полезли, в общем не скомпелировалося
>видосы по этой теме
ой, нет
наверное не стоит тебе тратить на это время
в общем случае, нет
любая относительно новая технология имеет свой период в начале становления, когда ей нужны инженеры от которых требуется создавать, улучшать компоненты технологии, а потом уже такие специалисты не нужны становятся, когда уже технология становится зрелой, остается нужда по сути в надсмотрщиках и настройщиках
такое происходило с энергетикой, с железными дорогами, да с любой технологией
да что там, про это целые книги написаны типа "Блеск и нищета информационных технологий" Николас Карра
Сап, ищу информацию по функциям. Решил немного побольше изучить как работают функции. Такой вопрос, я правильно понимаю, что прототип функции, определение которой находится после main(), он помогает нам по адресу в момент вызова определить область памяти определения функции (исполняемого кода)? Для этого же нужны прототипы? И если да, то как я понял в данном случае будет происходить одновременно и вызов и само определение?
Сигнатура функции прототип нужна компилятору, чтобы он мог следить за передаваемыми аргументами, и возвращаемым значением. про то, где именно располагается функция думает линкер. Сигнатура функции никак не связана с её конечным адресом в бинарнике, если я правильно понял вопроса
пасиб:3
Под линукс нет
нет
Был тут один такой...
Гугли бля. Эту тему обсосали уже везде. Упоротые даже на Паскале их писали.
>>1047131
Винда нерусская, подозреваю проблема в этом.
Можно удалить конец.
Без задней мысли тащемта
Почитай про imbue для basic_ostream. Тебе нужно установить локаль в соответствии с кодировкой текущего файла.
Потомучто компиляторы ещё не до конца поддерживают 17й стандарт. filesystem будет кросплатформенной, под виндой и пингвином будет работать одинаково
Анон, как препроцессор разворачивает такие макросы #define MAX(a, b) ((a) < (b) ? (b) : (a)) и почему, например, при вызове MAX(1, 2) параметры 1 и 2 подставляются вместо a и b, а не вместо MAX?
Да.
>как препроцессор разворачивает
>#define MAX(a, b) ((a) < (b) ? (b) : (a))
Так и разворачивает. Если после этого где-то в тексте будет int t = MAX(3,100), то перед компиляцией он туда поставит int t = ((3) < (100) ? (100) : (3)). Если будет в где-то MAX(sin(1.43xx),"saa2131_asd"), то так и подставит ((sin(1.43xx) < ("saa2131_asd") ? ("saa2131_asd") : (sin(1.43xx)) и выдаст там соответствующие ошибки (а ещё будет считать синус два раза в некоторых случаях).
Не совсем понимаю, как он может подставить 1 и 2 вместо MAX, а не вместо a и b. Какой в таком случае вид должно иметь MAX(1,2) после обработки препроцессором?
Заниматься исключительно вашими должностными обязанностями и не позволять навешивать на себя чужих. Если ваша должность - Software Engineer или Senior Software Engineer, то вы должны и обязаны заниматься разработкой софта. Никакое ручное или полуавтоматизированное тестирование, никакое обучение джуниоров, никакое преподавание в вузе, никакое замещение тимлида в течение двух недель (на время которых вам, кстати, не повысят вашу почасовую ставку), никакое проведение семинаров, никакая уборка помещений, никакие погрузочно-разгрузочные работы не входят в список ваших обязанностей. Современный технический специалист не должен позволять управленцам садиться ему на шею и ездить на нем. Занимайтесь только разработкой софта, делайте свою работу хорошо, становитесь отличным техническим специалистом и безгранично развивайтесь в этом направлении.
Требовать давать вам только те задачи, на которых реально можно стремительно вырасти. Если вы - студент, то требуйте задач уровня миддла. Если вы - миддл, то требуйте задач уровня синиора. Если вы - синиор, то требуйте задач уровня архитектора. Если вы лично считаете, что в течение полугода успешно справлялись с большинством технических задач, то требуйте повышения или уходите в другую компанию на другой проект. К сожалению, у многих программистов есть предубеждение, что если они будут полгода делать задачи своего уровня, то их повысят. Нет, не повысят. Наоборот, тимлиды и менеджеры будут годами использовать вас, как совхозную лошадь, загружая монотонной посредственной работой, и вся ваша карьера превратится в вялотекущий дауншифтинг с работающей бедностью и отсутствием крупных долларовых сбережений на период зрелости и старости.
Легко менять компании, если вы почувствовали, что на текущем месте работы развитие вас как технического специалиста идет недостаточно быстро. Никогда не привязывайтесь ни к работе, ни к работодателю, ни к коллективу. Выходите из зоны комфорта раз и навсегда. Вообще не привязывайтесь ни к людям, ни к работе. Также не тратьте ваше время на женщин, особенно, если они не понимают важности ваших профессиональных интересов, тормозят ваше развитие, расхищают ваше время, внимание, деньги и прочие ресурсы или требуют от вас наличия каких-либо социальных статусов, особого положения в обществе, смены профессии, перехода на управленческие должности и так далее.
Заниматься исключительно вашими должностными обязанностями и не позволять навешивать на себя чужих. Если ваша должность - Software Engineer или Senior Software Engineer, то вы должны и обязаны заниматься разработкой софта. Никакое ручное или полуавтоматизированное тестирование, никакое обучение джуниоров, никакое преподавание в вузе, никакое замещение тимлида в течение двух недель (на время которых вам, кстати, не повысят вашу почасовую ставку), никакое проведение семинаров, никакая уборка помещений, никакие погрузочно-разгрузочные работы не входят в список ваших обязанностей. Современный технический специалист не должен позволять управленцам садиться ему на шею и ездить на нем. Занимайтесь только разработкой софта, делайте свою работу хорошо, становитесь отличным техническим специалистом и безгранично развивайтесь в этом направлении.
Требовать давать вам только те задачи, на которых реально можно стремительно вырасти. Если вы - студент, то требуйте задач уровня миддла. Если вы - миддл, то требуйте задач уровня синиора. Если вы - синиор, то требуйте задач уровня архитектора. Если вы лично считаете, что в течение полугода успешно справлялись с большинством технических задач, то требуйте повышения или уходите в другую компанию на другой проект. К сожалению, у многих программистов есть предубеждение, что если они будут полгода делать задачи своего уровня, то их повысят. Нет, не повысят. Наоборот, тимлиды и менеджеры будут годами использовать вас, как совхозную лошадь, загружая монотонной посредственной работой, и вся ваша карьера превратится в вялотекущий дауншифтинг с работающей бедностью и отсутствием крупных долларовых сбережений на период зрелости и старости.
Легко менять компании, если вы почувствовали, что на текущем месте работы развитие вас как технического специалиста идет недостаточно быстро. Никогда не привязывайтесь ни к работе, ни к работодателю, ни к коллективу. Выходите из зоны комфорта раз и навсегда. Вообще не привязывайтесь ни к людям, ни к работе. Также не тратьте ваше время на женщин, особенно, если они не понимают важности ваших профессиональных интересов, тормозят ваше развитие, расхищают ваше время, внимание, деньги и прочие ресурсы или требуют от вас наличия каких-либо социальных статусов, особого положения в обществе, смены профессии, перехода на управленческие должности и так далее.
>Профсоюзы должны объяснять программистам, что они не должны оказывать бесплатный профессиональный консалтинг на Stack Overflow.
>нужно коллективно осуждать тех, кто выкладывает на YouTube самоучители по диагностике и ремонту любых неисправностей материнских плат ноутбуков или диагностике жестких дисков, или профессиональному восстановлению данных, например
Что за бред. Пара хороших советов есть, но в основном какой-то идеалистический бред.
>Вообще не привязывайтесь ни к людям, ни к работе.
Зачем жить то тогда? Мне не интересно без этого, в таком случае мотивации не то что на какое-то "развитие вас как технического специалиста" будет не хватать...
Никак, это от пропорций литералов зависит. можешь попытаться найти квадратный шрифт для консоли
Лучше даже так, скобочками.
В аски или в расширении 8-битном есть еще полностью закрашенный треугольник и закрашенная верхняя и нижняя половины. Но один хрен, если соотношение сторон литерала не 1 к 2, квадратиков не получится.
>если соотношение сторон литерала не 1 к 2, квадратиков не получится
А ровный квадратик и не нужен. Главное, чтобы пропорции примерно совпадали, глаз это нормально воспринимает.
Я как-то монохромный видос так в консоль выводил, сносно было.
Хуйню какую-то выдумал. Новую секту мутишь?
у меня даже что-то вроде испанского стыда за человека что написал эту пасту и за человека что ее постит постоянно
+79xxxxxxxxx
79xxxxxxxxx
89xxxxxxxxx
блядь, дело не в checkedlistbox1, если что. просто нужен алгоритм
Ну, не 100к, но и не $744k. Я думаю база где-то в районе $300k-$350k. Бонус может превышать базу. Поэтому $744k (в год) вылядит реалистично как полная зарплата.
>за человека что написал эту пасту и за человека что ее постит постоянно
У меня такое странное чувство, что это один и тот же человек.
Хранить длинные номера в международном виде, международный вид подстраивается под локаль. Алгоритм для РФ:
если цифр 11 и плюса нет, то это международный формат без плюса
если цифр 11 и начинается с 8, то нутыпонел
если цифр 7, например, то хранить в таком же виде.
>>1047814
Пульнуть исходники в IDE и посмотреть на литералы/инициализации, например. Loop unrolling увеличивает размер кода, если что.
Так у меня тут важный вопрос (который попадет в топ вопросов прошлого треда):
Как узнать сколько измерений у массива?
Инби4: посмотреть в коде; а как ты инициализируешь массив?; тупой вопрос; ты наверное имел ввиду размер массива.
посмотри в объявление массива, чтобы узнать размерность ¯ \ _ (ツ) _ / ¯.
если нужна функция, то тут без шаблонов никак
а зачем тебе?
>инби4: посмотреть в коде
> без шаблонов никак
Да мне хоть методом/классом/конструктором.
Мне нужен просто понятный синтаксис/пример на крестах.
> а зачем тебе?
Задание такое стоит, значит надо (я не спорю про то что оно нужное/ненужное).
Нагуглил пока что полтора примера на mdsn но ничего не понял так как я совсем нюфаг в крестах.
Спасибо, но я не совсем понял как запихнуть массив который у меня в классе.
Можешь объяснить ньюфагу если есть время?
>я не совсем понял как запихнуть массив который у меня в классе.
Без задней мысли, как обычно.
По синтаксису в мейне.
Например есть class Klass {int *array = new int [size];}, и в main - int value.
Как в мейне правильно писать?
Реализуй свою функцию. Можешь даже рекурсией, так даже быстрее должно получиться - T(n) = Θ(n lg n)
Аноны за тебя думать что ли должны?
двачую
В чем шутка? То что я примерную сложность алгоритма написал или про рекурсию?
И то, и другое было написано серьезно.
Какая ещё сложнось алгоритма? Сколько по-вашему может быть звёзд у указателя / измерений у массива? Асимптотическая оценка подразумевает что-то охуительно большое, а не то, что измеряется пальцами одной руки в 99,99% случаев. Логарифм там откуда, блядь? n - это длина числа звёзд указателя в разрядах или само число разрядов? Какая операция является основой для определения сложности?
И самое главное - где хоть слово о шаблонном дерьме, в которое надо окунуться для того, чтобы это сделать без использования std::rank?
Спасибо анонче, выручил
Стандарт почитай.
Оказалось оно не работает с динамическим массивом.
Можно как-то создать статический массив размера существующего динамического (компилятору не нравиться неконстантное значение) (это максимум что я пока придумал) или по другому обойти эту проблему?
>подскажите что почитать
"благоволительницы" литтелла - классная книжка, в списке моих любимых будет
Тебе алгоритм надо как обойтись без rank? щяс
Он на то и статический, что размер должен быть известен на этапе компиляции. Вообще можно пощекотать себе анус с использованием alloca, но тебе с таким уровнем рановато ещё.
Можно создать копию текущего динамического массива или просто статический с длинной которой с лихвой хватит на все возможные данные и руками следить за его длинной.
могу только посочувствовать
даже высокодуховные девы коэльо щас не котируют, так чтож вы сядете в лужу упомянув при них этого автора
https://ideone.com/KkXRm6
Надо окунуться в шаблоны, и частичные специализации
>>1047954
Полная ахинея, статический массив на то и статический, что его размер известен на момент компиляции, размер динамического массива познается лишь на этапе исполнения
>длинной которой с лихвой хватит на все возможные данные и руками следить за его длинной.
>
А еще можно использовать stl, это же тред про C++
>template<class T, unsigned I>
Я тут мимопроходил мимо этих шаблонов, но это же получается, что оно этот шаблон будет разворачивать для всех возможных длин массивов, которые встречаются в коде? Брр, ну и ужасы.
>здоровая dll'ка
>и попытаться уменьшить её?
хочешь ее отправить в прошлое? на компы с 95 виндой и 300 метровым жестким диском?
ну а вообще "жирные" дллки это обычно ресурсные дллки, там куча картинок, текста и прочего что нужно экзешнику
я вообще думал что страуструп на профессорском подсосе (тыщ 50-60 в год) сидит у себя в техасском технологическом (охуенный кстати универ из нераспиареных)
а тут вон оно как, бабло зашибает :D
Это же рекурсивное инстанциирование ¯ \ _ (ツ) _ / ¯. Если привыкнуть, то нормально)
угу, говорят, что уже на следующую неделю работы в морге перестаешь чувствовать какие-либо раздражающие запахи разложения
в частности, поддерживает очень давно свой сайт на отдельном домене, не забывает его обновлять всегда
все его достижения там указаны, все расписано
stroustrup.com
такие дела
На самом деле писать и понимать такие штуки - нихуевый квест, выполнив который можно свихнуться считать себя лучше других
еще и бабло, кстати, зарабатывать умеет
на книжках можно неплохо зарабатывать - оказывается это такой "удобный" доход, книгу написал, а она постоянно издается, переиздается, допечатывается, потом у англо-саксов все нормально с электронными площадками для торговли ебуками, а это еще удобней, с цифры денежки вообще каждый месяц капают
в общем, раз написал, а деньги идут всю жизнь, тем более у него там наверное в сумме миллионные тиражи, куча бабла
потом случайно попал на влог отдной тетки (реально тетки), уже в "баба ягодка опять" возрасте перекатившейся в америку жить, дак она в видео и проговорилась - типа, что ее все хуесосят в интернете, что у ней понаписано куча неграмотных книг в мягкой обложке типа "как выйти за американца", "разговорный английский для совсем не знающих и прочее", страшные разговорники типа фраза на русском - перевод этой фразы даже не транскрипцией, а в виде "хау ду ю ду", она на это заявила, что у ней они все выложены в амазон и их, блядь, покупают, и у ней каждый месяц денежка с них, баксов 600-700 набирается, и получается что это вроде как настоящее вложение - ты тратишь время, создаешь продукт-книгу, а потом уже получаешь денежку с этого
такие дела
а у страуструпа наверное гораздо больше денег с книг выходит
Обычно место занимает debug info.
>хочешь ее отправить в прошлое? на компы с 95 виндой и 300 метровым жестким диском?
Не всякая .dll-ка влезет в 300-метровый жёсткий диск.
int N = 10;
int a = new int[N];
for (i = 0; i < N; i++)
a = 1000(1.0*rand()/RAND_MAX);
Тестировал алгоритм сортировки, и каждый сука раз при заполнении рандом в самом начале идёт ёбанная единица. Чё за хуйня?
Это ГПСЧ, тут нужно задавать seed перед началом генерации. Нубы обычно берут time() или что-то вроде такого.
Кстати говоря, у меня rand генерирует псевдорандомную последовательность длиной всего 64к (вторая строчка). Даже если будешь заполнять изображение белым шумом, будет мусор повторяющийся. Это линейный конгруэнтный метод.
В делфях используется то же самое, но на 32 бита.
https://ideone.com/qk2bZN
А у ideone rand другой, он там тоже на 32 бита.
Эндл - 4 клацка, портабельно (да я знаю про конверсии всякие), читаемо.
Слешэн - 6 клацков.
>>1047954
>Можно как-то создать статический массив размера существующего динамического
Размерность существующего динамического известна в компайлтайме, блядь. Как ты там написал это, если ты нихуя не знаешь? Кому ты пиздишь? Щас ты покажешь код, и мы все охнем.
Могу тебе класс с динамической размерностью накатать.
>>1047986
> размер динамического массива познается лишь на этапе исполнения
В том-то и дело, что поциенту нужна размерность (известная в компайлтайме). Он нас наёбывает, сейчас увидишь.
>Эндл - 4 клацка
И 9 если с std:: впереди.
> Слешэн - 6 клацков.
Откуда 6?
> портабельно
Что ты имеешь в виду?
>Откуда 6?
Два раза шифт.
>>1048819
>Что ты имеешь в виду?
На маке - \r, на винде - \r\n. Хотя, там же, вроде ,везде конверсия, так что это неважно.
>>1048876
> С расположением файла все нормально, я закинул его на рабочий стол и в командной строке же указал путь до него.
Если ты раньше с командной строкой дела не имел, то проще всего сделать cd до папки с программой и оттуда уже запустить gcc с именем файла без пути.
статический на шаблонах, динамический на вирт функциях, ad hoc через перегрузку функций
3 вида
изи
кстати, эти знания никак не помогают мне найти работу и не сдохнуть от голода в будущем
Я так и сделал, закинул файл с кодом на рабочий стол и в командной строке прописал путь до него
Я плюсы в основном для универа осваиваю. А чтоб деньги были, подамся в бекенд, хоть и не нравится он мне.
Сколько места занимает стек и почему он может дорасти до границы кучи?
Где в памяти располагаются стек и куча?
Я могу сказать тебе только то, что ты написал его неправильно. Как обойти необходимость в изучении кавычек я уже сказал, ты не послушал.
>>1048936
> стек может переполниться?
Ограничен десятком мегабайт в большинстве популярных ОС. А вообще это не про плюсы вопрос, в стандарте ничего про то, что ты спрашиваешь, нет.
те тупи
просто делай все лабы на выбранном тобой языке - явка, js, в общем все что угодно кроме крестов
да, в универе любят на нем лабы давать
но как для специалиста это будет для тебя путь в никуда
Ну и даун, тут в перезвоним-треде один крестовик устроился на работу с зп 250к.
На Java и C# (не говоря уже про PHP и прочее скриптоговно) у тебя таких денег никогда не будет.
А через 5 лет веб-разработки ты забудешь все алгоритмы и даже что означает буква O.
Ну тут скорее исключение из правил.
>Ну и даун, тут в перезвоним-треде один крестовик устроился на работу с зп 250к.
Лол, а еще на бейсике работа есть от 80к
https://chelyabinsk.hh.ru/vacancy/21903239?query=basic
Даже в мухосранях типа челябинска! Давайте учить бейсик
Ты про статистическую выборку не слышал?
>один крестовик устроился на работу с зп 250к
Чистые кресты никому не нужны, их и так все знают после универа. Нужны специфические узкие знания. Эмбед, драйвера, сетевой стек, потоковое видео - опыт. За это платят. Сферический Александреску в вакууме без знания предметки никому не нужен.
Нету.
За 250к вакансий вообще немного, в ДС 5 штук на C++:
https://chelyabinsk.hh.ru/vacancy/22237944?query=c++
https://chelyabinsk.hh.ru/vacancy/22203976?query=c++
https://chelyabinsk.hh.ru/vacancy/22359974?query=c++
https://chelyabinsk.hh.ru/vacancy/22282829?query=c++
https://chelyabinsk.hh.ru/vacancy/22292120?query=c++
За 80к - навалом. Анон не говорил, что полно работы, он утверждал, якобы веб-разработка оплачивается выше, чем проекты на С++, что очевидно не так.
>>1049012
Ясное дело, джуна со знанием STL и Qt на такой оклад не возьмут.
Нашел работу на крестах/qt джуном без опыта читай, на работе учил
Работаю уже полгода, зп пока 40к, скоро планируется повышение.
Но мне кажется что такое уже есть и я буду изобретать велосипед. А если нету, то думаете взлетит?
несомненно! это будет инновационное программное обеспечение, достойное занесения в "Единый реестр российский программ", например
ты, как автор, получишь уважение мирового комьюнити, сможешь организовать стартап, монетизирующий проект, выйти на ipo и с продажи опционов получить доходы, обеспечивающие тебя до глубокой старости!
охуенно наверное из обоссаной челябы облизыватся на >250k вакухи в great mockow :D
Вот только это не определение
Да, аноны, скажите, что примерно нужно знать ии уметь чтобы вкатиться джуном? Сейчас имею только одну лабу из шараги, там простая база данных в виде дерева, поиск добавление удаление вершин-ветвей. В стль почти ничего не знаю, кроме основных структур, в бусте и подавно.
Учить нужно то, что в конторе будет. Поскольку кресты не нашли себя в какой-то конкретной сфере, подсказать тяжело.
Алсо, в STL есть способ синхронизировать потоки без примитивов синхронизации. Что это за способ?
Там везде что-то в духе, начальные навыки c++, ни в одной вакансии я не увидел что именно они хотят. Неужели я прямо сейчас могу вписаться джуном?
За еду кем хочешь можно устроиться. Гей-шлюхам ещё платят, я слышал.
Я начинал работать в банке, вакансия что-то вроде такой была:
https://career.ru/vacancy/22470998?query=c++
В основном хранимки на SQL писал, C++/Delphi 50/50. Платили нихуя, только что люди там хорошие работали.
Перекатываюсь на пыху в итоге. Вот такой суксесс стори.
Да, я бы в такое вкатился, но не могу 40 часов в неделю пока работать.
Там особо ничего такого нет.
http://en.cppreference.com/w/cpp/thread/lock_guard
У винды есть свои реализации.
Ещё есть Boost.Interprocess со всеми нужными тебе структурами и даже больше.
std::condition_variable есть как способ заблокировать один или несколько потоков до срабатывания какого-то условия в другом потоке, к примеру. Используется все так же с мьютексом, потому что так надо и во всех системах так.
Критических секций нихуя нету, так что используй мьютекс с std::lock_guard и тебе не придется потом ебаться по поводу того, какого хуя у тебя все залипло в один момент (кинуло исключение, мьютекс залочен и все ... пиздос)
Можешь попробовать неблокирующие методы там используются атомики. Суть, в общем, состоит в том, что треды пытаются в постоянном цикле "захватить" атомарную переременную, записав туда свой идентификатор через compare_exchange, и потом на короткое время выхватить кусок из общего ресурса и высвободить атомарную переменную. Тема хорошая, но не для всего на самом деле. Если собираешься делать какой-нибудь реактор или проактор (на stl хахаха блять, удачки), то лучше пользоваться системными примитивами синхронизациями и condition_variable.
Сразу сеньором.
>>Откуда 6?
>Два раза шифт.
Для '\n' ни разу шифт нажимать не надо.
>>Что ты имеешь в виду?
>На маке - \r, на винде - \r\n. Хотя, там же, вроде ,везде конверсия, так что это неважно.
Вот именно. std::endl это просто '\n' плюс flush.
Так что чем он портабельнее — непонятно.
писать на JS
Вот есть такое описание:
https://rsdn.org/article/submit/heap/heaps.xml#EFBAE
>> Данная операция полностью повторяет логику единичного инкремента. Пусть исходная биномиальная куча состоит из 11 элементов. ... какой-то пример на довичных числах, алгоритма нет нихуя ...
Как это работает? Насколько я понял, когда в биномиальную кучу добавляется элемент, он представляется вырожденным случаем биномиального дерева, имеющего только корень. Только вот так если подумать, если сращивать узлы в уже отсортированном порядке, тогда они должны выстроиться в одну длинную цепочку, разве нет?! Что за хуйня?!
Стандартных реализаций нету. В бусте почти наверняка есть, но не там, где ожидаешь. В Boost.Heap нету кучи с таким функционалом, например.
Можешь в Интернете поискать. Например:
https://gist.github.com/truncs/1810804
В куче же родитель легко находится. Битовый сдвиг вправо на один бит (то есть целочисленное деление на 2) даст тебе индекс родительской ноды.
С потомками сложнее, нужно смотреть смещения, хотя там все подчиняется тому же закону.
А конкретнее?
Я как-то хотел лямбда-исчисление на темплейтах сделать, но руки не дошли. Может, на выходных.
>все миллионы способов инициализации (value initialization, direct initialization, copy initialization, list initialization, aggregate initialization, reference initialization, default initialization, static initialization, dynamic initialization и наверное ещё куча)
>callable
>r/l/x/gl/pr-values
>SFINAE
>ADL
>Most Vexing Parse
>как инферятся типы в лямдах и просто в функциях
>RTTI
>std::allocator
>perfect forwarding, decay и правила переводов референсов на референсы
>даже простые move semantics
Я тут подумал, и понял. Блин, реально сложный язык, в которого понапихано слишком много. Как-то не доходило раньше. Зато джоб секьюрити.
Он везде есть, просто нужно проверять __cpp_lib_experimental_string_view или __cpp_lib_string_view и инжектить алиас string_view в std в первом случае. Если совсем старый стандарт — буст/eastl/sgi stl/хуйнянейм все равно тащить придется. Ну или навелосипедить свое, там делов-то на 15 строк.
>>1050310
Дык уже давно.
>>1050307
Это намного быстрее и гибче. Как минимум именно в качестве параметра вместо строки всегда нужно принимать string_view — ибо это простой слайс (поинтер+длинна), и ты полностью контроллируешь аллокации. В твоём текущем коде при передаче вообще чего угодно у тебя будут создаваться временные объекты, которые твой код повторно аллоцирует и копирует. Олсо, для того же нужен emplace_back() у стдшных контейнеров и perfect forwarding (а еще интрузивные контейнеры) но тебе ещё рано, лол.
>>1050332
При чём тут итераторы-то, поехавший?
>Как минимум именно в качестве параметра вместо строки всегда нужно принимать string_view — ибо это простой слайс (поинтер+длинна)
Длинна в каких единицах? Давно кресты utf8 поддерживать начали?
>>Most Vexing Parse
>>как инферятся типы в лямдах и просто в функциях
Остальое понятно, но вот это нахуя знать-то?
>Most Vexing Parse
Все с этим сталкивались, когда-нибудь написав new T().
>как инферятся типы в лямдах и просто в функциях
Да просто так, честно, запэддить лист
>Длинна в каких единицах?
В байтах, в чём ещё в плюсах меряют длинну? Просто так уж сложилось что char = 1 байту, и теперь пойди объясни кто тут верблюд.
>Давно кресты utf8 поддерживать начали?
Смотря что ты имеешь в виду.
Если строковые литералы — u8"דיק" ещё в 11-х завезли.
Если просто строки в которые пользователь сможет срать что на иврите, что на китайском — в плюсах, опять же, все измеряется в байтах, так что абсолютно похуй что туда пихать. std::string — обычный вектор с опциональным SSO и рефкаунтом. Другое дело как ты эту хуйню обработаешь.
И нахуя с ты перескочил с невладеющих строк к юникоду — ЯННП.
>Все с этим сталкивались, когда-нибудь написав new T()
Я понимаю, что мы живём в 18 веке, у нас медведи по улице ходят, но нет, нихуя.
>>Most Vexing Parse
>Все с этим сталкивались, когда-нибудь написав new T()
new T() под это правило как раз не попадает.
>В байтах
И нахуя оно тогда нужно? Чтобы работать с данными все равно нужно 3rd party представление. Твоя хуитка поможет только в случае не-nullterminated строк.
При чём тут юникод и владеющие и невладеющие строки, поехавший. Ты меня доебал уже блядь. Одна история ахуеннее другой.
Я ему про временные объекты и перформанс, он мне про нуль терминатор, ахуеть теперь.
Сразу вспомнился комикс про старый C++.
А все, допер по поводу биномиальной кучи. Почему-то мне казалось, что деревья там плоские, как в куче, но потом стал рисовать по объяснению и понял, что все слегка иначе.
>std::string — обычный вектор с опциональным SSO и рефкаунтом.
Рефкаунт не соответствует стандарту.
>Так передавай const wchar_t* size_t
Пиздец просто.
Переменная длина utf8 нас не устраивает значит, а вот переменная длина utf16 это совсем другое дело, да? Не хочу совместимую с ASCII кодирование, хочу использовать windows-only решение. Пиздец ты даун. И да, напоминаю, в юникоде один символ может состоять из нескольких знаков, удачи в ковырянии вилкой всего этого добра.
>>1050426
>Чтобы работать с данными все равно нужно 3rd party представление.
В 95% случаев вся работа заключается в достал-передал дальше. На самом деле, не так часто нужно что-то со строками ручками делать.
Надо прогу с гуем сделать. Чтение с последовательного порта (виртуального, который с USB, ну да пох), рисование графиков, запись log-файлы и в базу маленько.
Раньше все на дельфи7 делал - на форму мышкой-хуяк-хуяк, компонент нагуглил для com-порта, чтение списка портов с реестра, графики - еще один компонент нагуглил, базы данных - компонент интербейс-коннект и к firebird без установки серверов (портативная версия). Еще и в Excel отчетики если надо. Всё заебись за считанные часы выполняется, всё вместе пять мегабайт.
Но дельфи7 же умер, это ведь говно мамонта 2002 года, без юникода, без антиалиасинга, да и вообще, сейчас опенсорс, кросс-платформа, C++14 и прочая хуйня, к тому же мне уже за 30, и пора бы уже вместо меня в этой шаражке взять малолетнего пиздюка, а они про дельфи и не знают небось.
На да ладно.
Сперва беру C# конечно же. Ну заебись, разобрался мало-мальски, правда в ini-файлы он что-то не умеет. Но сейчас уже 21 век, xml-костыль конечно же есть. Но, ебана, я ведь скачал Community Edition, а все равно регистрацию просит и посылает нахуй, да и при установке так систему засирает, что не по себе становится.
Ладно, хуй с ней с этой хуитой от микрософт. Тем более всюду (на дваче) посирают, что говно, тяжелое и неповоротное, да и приложения нельзя свои без коммерческой лицензии распространять.
Итак, беру труЪ-опенсорсный CodeLite, wxWidget, ну потрахался (какой же там уебищный GUI-дизайнер), последовательный порт через WinAPI, всё, сука, в ручную, автоподставновка через раз работает, как графики добавить, так и не понял. Хуита какая-то. Сколько гуглишь - На форумах древнее говно мамонта. Стопицот костылей, ничего простого. Либо не рисует, либо криво, либо не понять как ставить на эту версию.
Еще напрягает, что установка wxWidget охуеть долгая - библиотеку то компилить надо.
Радует хоть, что приложение статически собирается и весит мегайбат 7.
Дальше вот нагуглил, все нормальные пацаны обоссали этот wxWidget и делают на Qt.
Окей, качаю последний, 5.9.1 версия.
Гуй-дизайнер заебись, редактор кода заебись, сразу есть компоненты последовательно порта и графики, которые через жопу, но вполне юзабельно. Как перенести на другой комп? О_о Ладно есть там windeployqt приблуда. Вот она мне копирнула 45 мб библиотек, кучку из 23 штук (минус папку translations) епта. Да и то три штуки пропустила (которые к mingw). На вин10 работает, на вин7 работает, а на винХР не работает, ёбана. Да, вы тут все модные продвинуетые, на core i7 и прочее. А у меня в цехе несколько десятков компов и обновлять винду там нельзя, т.к. к ним идет оборудования забугорного на миллионы денег и, вообще блядь, лучше не там ничего трогать.
Что-то про статическую сборку пишут. Типа и DLL все в исполняемом файле - так то охуеть конечно, екзешник на писят метров, но зато, должно тогда на winXP запуститься.
Третий день читаю форумы - всюду есть тема про старые версии Qt, а про 5.9 нихера. И так пробую, и так - на выходе какие-то компиляции целый час, а толку все равно нет - в сборках пишешь, а оно не работает. Какого хуя это не из коробки? Зачем я должен пердолится с этим?
Надо прогу с гуем сделать. Чтение с последовательного порта (виртуального, который с USB, ну да пох), рисование графиков, запись log-файлы и в базу маленько.
Раньше все на дельфи7 делал - на форму мышкой-хуяк-хуяк, компонент нагуглил для com-порта, чтение списка портов с реестра, графики - еще один компонент нагуглил, базы данных - компонент интербейс-коннект и к firebird без установки серверов (портативная версия). Еще и в Excel отчетики если надо. Всё заебись за считанные часы выполняется, всё вместе пять мегабайт.
Но дельфи7 же умер, это ведь говно мамонта 2002 года, без юникода, без антиалиасинга, да и вообще, сейчас опенсорс, кросс-платформа, C++14 и прочая хуйня, к тому же мне уже за 30, и пора бы уже вместо меня в этой шаражке взять малолетнего пиздюка, а они про дельфи и не знают небось.
На да ладно.
Сперва беру C# конечно же. Ну заебись, разобрался мало-мальски, правда в ini-файлы он что-то не умеет. Но сейчас уже 21 век, xml-костыль конечно же есть. Но, ебана, я ведь скачал Community Edition, а все равно регистрацию просит и посылает нахуй, да и при установке так систему засирает, что не по себе становится.
Ладно, хуй с ней с этой хуитой от микрософт. Тем более всюду (на дваче) посирают, что говно, тяжелое и неповоротное, да и приложения нельзя свои без коммерческой лицензии распространять.
Итак, беру труЪ-опенсорсный CodeLite, wxWidget, ну потрахался (какой же там уебищный GUI-дизайнер), последовательный порт через WinAPI, всё, сука, в ручную, автоподставновка через раз работает, как графики добавить, так и не понял. Хуита какая-то. Сколько гуглишь - На форумах древнее говно мамонта. Стопицот костылей, ничего простого. Либо не рисует, либо криво, либо не понять как ставить на эту версию.
Еще напрягает, что установка wxWidget охуеть долгая - библиотеку то компилить надо.
Радует хоть, что приложение статически собирается и весит мегайбат 7.
Дальше вот нагуглил, все нормальные пацаны обоссали этот wxWidget и делают на Qt.
Окей, качаю последний, 5.9.1 версия.
Гуй-дизайнер заебись, редактор кода заебись, сразу есть компоненты последовательно порта и графики, которые через жопу, но вполне юзабельно. Как перенести на другой комп? О_о Ладно есть там windeployqt приблуда. Вот она мне копирнула 45 мб библиотек, кучку из 23 штук (минус папку translations) епта. Да и то три штуки пропустила (которые к mingw). На вин10 работает, на вин7 работает, а на винХР не работает, ёбана. Да, вы тут все модные продвинуетые, на core i7 и прочее. А у меня в цехе несколько десятков компов и обновлять винду там нельзя, т.к. к ним идет оборудования забугорного на миллионы денег и, вообще блядь, лучше не там ничего трогать.
Что-то про статическую сборку пишут. Типа и DLL все в исполняемом файле - так то охуеть конечно, екзешник на писят метров, но зато, должно тогда на winXP запуститься.
Третий день читаю форумы - всюду есть тема про старые версии Qt, а про 5.9 нихера. И так пробую, и так - на выходе какие-то компиляции целый час, а толку все равно нет - в сборках пишешь, а оно не работает. Какого хуя это не из коробки? Зачем я должен пердолится с этим?
>Зачем я должен пердолится с этим?
Любители ХР должны страдать, да...
В новых студиях для компиляции под ХР у компилятора отдельный тулсет есть. Если используешь другой компилятор - хз, попробуй настройки потеребить, может там тоже есть отдельная опция для этого.
Еще один вариант, взять dependency walker и просто посмотреть чего бинарнику не хватает под ХР.
статическая сборка +10мб к твоему хеловорду, ужмешь upx до 5мб. орну в голосину, если xp у тебя 32битный, а собирал под 64.
>Community Edition, а все равно регистрацию просит
Она потому и коммьюнити, что майкрософт получает твой адрес для спама.
>CodeLite
Он немного забагованный, хоть в целом и работоспособен.
> Как перенести на другой комп?
Скомпилировать статически. Согласно LGPL ты можешь это сделать, тебе лишь нужно распространять вместе с программой объектные файлы и инструкцию о компиляции.
Работа на XP связана не с видом компиляции - статика или нет. Если ты заюзаешь несовместимую функцию, у тебя не либа не подгрузится, а экзешник целиком, или баг где-то вылезет. Чтобы XP поддержать, тебе нужна какая-нибудь полубородатая версия. Последняя версия для висты - 5.6.2, например.
https://wiki.qt.io/PlatformSupport
И КСТАТИ, ты можешь поставить этот 5.5.* и последний кутыкреактор, и оно будет работать.
>>1050701
>Еще один вариант, взять dependency walker и просто посмотреть чего бинарнику не хватает под ХР.
Бинарнику под XP не хватает того, что Qt Oy не тестила Qt под XP, импортов не хватает и прочее.
>Пиздец просто.
Ебаный дебил, замени на свою любимый char, но смысл ты понял. Нахуй разводить этот троллинг тупостью? пиздец wchar_t у него windows-only, передавай бате что надо было юзать гандоны
>В 95% случаев вся работа заключается в достал-передал дальше.
Ты просто нахуй конченный. Как и вся та орда дебилов которая тащит свое говно в стандарт, уже собрались CGI и curses тащить, ага блять.
мимоаллигатор
>пиздец wchar_t у него windows-only
А что это не так? Или может быть есть какие-то достоинства использования UTF16 не на windows? С удовольствием послушаю эти охуительные истории
>>1050727
>Ты просто нахуй конченный.
Ты членораздельно можешь сказать с чем ты не согласен? Нахуя тебе отдельные символы? Что ты с ними собрался делать?
>Как и вся та орда дебилов которая тащит свое говно в стандарт, уже собрались CGI и curses тащить, ага блять.
В стандарт ничего не тащат - попопок хуевая стандартная библиотека, ни как в дотнете/жабе, покпокпок, могли бы и в стандарт добавить либу чтобы жопу вытирала/окошки рисовала, покпокпок
В стандарт добавляют новые либы - покпокпок, они что поехали все это в стандарт тащить, горшочек не вари, спасите-помогите, убивают.
Полностью с тобой согласен, братишка, ТОЛЬКО ПРОИГРАЛИ
>UTF16
>wchar_t
Охуительные истории.
>Нахуя тебе отдельные символы?
Ну я блять даже не знаю нахуй как тебе и объяснить. Это походу особый клинический случай. Если тебе символы не нужны таскай все в voidptr.
все тот же аллигатор
Хули ты не смог то там. Для твоего случая, хватит с лихвой WxWidgets или fltk какой. Если ты не хочешь тянуть всего мамонта в лице Qt, придется тебе использовать эти либы.
Естественно, нужно хотя бы понимать, как устроен интерфейс. Ведь по сути, генератор форм Qt на выхлопе делает класс виджета с набором объектов, ничего больше. Таким же образом и ты должен создать гуй.
Если ты не понимешь ООП и что из себя представляет окно или форма, то тебе надо возвращаться в свой делфи, чтобы там мышкой программировать или все же осилить как создавать виды.
Я сказал вот что:
- про реализацию различного поведения одной и той же функции у обектов разных типов
- про удобство работы с иерархией классов через указатель или ссылку на базовый класс
- про рефакторинг: замена условной логики полиморфизмом
Но оказалось, что я не сказал самую СУТЬ.
Не связывайся со статической линковкой, для проворачивания этого фокуса кьют понадобится собирать руками.
И еще, тебя ждет веселье со старыми дровами для твоего драйвера виртуального порта. Когда я работал с CP2101 пришлось специально для ХР отключать автоопределение подключения через винапишные сигналы, глючило дико. Особенно мне нравилось выскакивающее окошко "Устройство не готово; Открыта дверца" при отсоединении кабеля. Кстати, делал такие штуки и на .NET, и на Qt, на первом больше гемора с портом было.
Статически они не слинкуются. Для этого тебе понадобится скачать сорцы, вызвать configure со --static и собрать. Ман http://doc.qt.io/qt-5/windows-deployment.html говорит, что держать две версии в одном месте одновременно не выйдет.
Только за коммерческую копию кути заплатить не забудь, статическая линковка это тебе не хуй собачий.
Qt под LGPL, а LGPL позволяет линковаться статически и распространять только объектные файлы, без сорцев.
https://www.gnu.org/licenses/gpl-faq.en.html#LGPLStaticVsDynamic
>Зайди на сайт кути и прочитай условия. Она бесплатна пока юзер может выковырять и поменять её исполняемые файлы, что при статической линковке без исходников не очень хорошо получается.
Сто раз обсосано на форуме qt.io, линковать статически и распространять объектники МОЖНО.
>Зайди на сайт кути и прочитай условия.
Как действует LGPL определяют не Qt-шники.
> Она бесплатна пока юзер может выковырять и поменять её исполняемые файлы, что при статической линковке без исходников не очень хорошо получается.
Для линковки с другой версией библиотеки достаточно распространять только объектные файлы.
>В одном из прошлых тредов даже кидали выдержку из стандарта, поищи.
Ты скозал — ты тащи пруфы.
Что ты хочешь услышать? Это философский вопрос на который есть тысячи ответов и все правильные.
Тебе интересно — ты и ищи их, мне чота влом.
>>1050943
Линковаться статически чтобы тащить с собой хуй пойми сколько неслинкованного дерьма, половина из которого этим самыи линкером ещё и будет вырезана — бесценно.
>>1050853
Скажи интервьюеру что он абстрактный пидарас, либо просто ответь что это дохуя гибко. Что это значит — пусть сам думает с такими вопросами.
>Тебе интересно — ты и ищи их, мне чота влом.
В общем, слив защитан.
>Линковаться статически чтобы тащить с собой
Ничего тащить с собой не надо. GPL не заставляет распространять исходники с программой, а только предъявлять их по требованию (высылать диск с ними или ссылку давать на то, где они лежат). LGPL, думаю, так же.
А ценно или бесценно — похуй, главное ясно, что для статической линковки коммерческая лицензия на Qt не обязательна.
Ты всё о динамическом полиморфизме, подумай о статическом.
Полиморфизм - инструмент единоразового описания алгоритмов в отрыве от конкретных применений.
Меня спрашивают про динамический.
>В общем, слив защитан.
С такой логикой ты это, давай или откопай параграф стандарта, где обязуют гарантировать sso.
>>1051045
>>1051044
Не знаю в чем суть вашей спецолимпиады, но очевидно:
>Every object of type basic_string<charT,
traits, Allocator> shall use an object of type Allocator to allocate and free storage for the contained
charT objects as needed. The Allocator object used shall be obtained as described in 23.2.1.
Использование статически аллоцированного объекта для оптимизации нарушает гарантию выделения всех строк в переданном аллокаторе.
>Использование статически аллоцированного объекта для оптимизации нарушает гарантию выделения всех строк в переданном аллокаторе.
Неуважаемый дебил №2, про "всех" там ни слова не написано. Там написано "as needed". Перевод сам найдёшь или тебе принести?
>Every object of type basic_string<charT,
traits, Allocator shall use an object of type Allocator to allocate and free storage
Передай своей учительнице английского что она падшая женщина.
Там такого не написано, не пизди.
Написано, что аллокатором нужно выделять память при необходимости (as needed). Пока необходимости нет — выделять не надо.
Я же тебе жирным выделил что every, shall use. Если у объекта есть данные во владении - они needed. Зачем ты продолжаешь защищать свою ошибку?
>Я же тебе жирным выделил что every, shall use.
Ну да, каждый basic_string<charT, traits, Allocator> должен использовать аллокатор для выделения и освобождения памяти для charT, при необходимости.
Про "для выделения всех строк", как ты написал в >>1051053 , там не написано. Единственное слово, которое можно было бы перевести как "все" это Every, но оно переводится здесь как "каждый" и относится к объектам типа basic_string<...>, а не к хранимым в них charT.
> Если у объекта есть данные во владении - они needed. Зачем ты продолжаешь защищать свою ошибку?
Зачем ты продолжаешь вырывать фразы и слова из контекста и фантазировать? Написано, что память надо выделять при необходимости (as needed). А не то, что хранимые charT внутри needed.
>но оно переводится здесь как "каждый"
Да даже если ты переведёшь как "Все объекты типа basic_string<...>", то по-прежнему "все" будет относиться к basic_string<...>, а не к хранимым там charT.
Естественно, относится к basic_string, которые должны по требованию должны выделять пул предоставленным аллокатором.
А, возможно ты не очень понимаешь какой мета контекст у аллокатора в стандарте:
Containers are objects that store other objects. They control allocation and deallocation of these objects
through constructors, destructors, insert and erase operations.
For the components affected by this subclause that declare an allocator_type, objects stored in these
components shall be constructed using the allocator_traits<allocator_type>::construct function and
destroyed using the allocator_traits<allocator_type>::destroy function (20.8.8.2). These functions
are called only for the container’s element type, not for internal types used by the container. [ Note: This
means, for example, that a node-based container might need to construct nodes containing aligned buffers
and call construct to place the element into the buffer. — end note ]
Unless otherwise specified, all containers defined in this clause obtain memory using an allocator
Попробуй воспринять в этом контексте то что тебе пытались выше объяснить, возможно ты поймешь.
В процитированном тобой [container.requirements.general]/3 говорится про construct и destroy. Что-то запрещает делать construct и destroy в SSO-буфере?
> Unless otherwise specified, all containers defined in this clause obtain memory using an allocator
Список "all containers defined in this clause" прикладываю картинкой. Да даже если бы <string> сюда относился, то тут написано, что получать память нужно с использованием аллокатора. Использовать память внутри объекта это никак не запрещает.
> Попробуй воспринять в этом контексте то что тебе пытались выше объяснить
Не собираюсь воспринимать <string> в контексте, который к <string> не относится.
>Не собираюсь воспринимать <string> в контексте, который к <string> не относится.
Твои проблемы. Сколько я понимаю выше по треду ты спрашивал почему нет SSO в мейнстримных имплементациях, пусть останется тайной лол.
Алсо, чтобы у тебя еще остался шанс:
>The Allocator object used shall be obtained as described in 23.2.1.
Строка не является контейнером (наркоманы, лол), но во всех своих аспектах ссылается на клаузы контейнеров.
>>Не собираюсь воспринимать <string> в контексте, который к <string> не относится.
>Твои проблемы.
Да нет, твои. Это ты полез тыкать меня в правила, которые относятся к контейнерам в таблице. Где нет <string>.
> Сколько я понимаю выше по треду ты спрашивал почему нет SSO в мейнстримных имплементациях
Лолчто? В libstdc++ (GCC) SSO, в libc++ (clang) SSO, в MSVC SSO.
>>1051072
>Строка не является контейнером (наркоманы, лол), но во всех своих аспектах ссылается на клаузы контейнеров.
Где необходимо — пусть ссылается. Главное, что глава Containers не ссылается на <string> в таблице контейнеров.
Так кучи же их, начиная от clang tidy и cppcheck до PVS. Кстати, о каких различных IDE ты говоришь, небось об Idea и VS, так первые с давних времен свою IDE под жабу пилили, так что времени добавить анализатор было предостаточно, а вторые делает майкрософт, который и создавал язык c#, так что неудивительно, что поддержка этого и там есть. А что ты хотел услышать?!
Я пробовал CLion для hello world. Так вот, анализатор там пиздец какой скудный. После java - будто перекрыли кислород.
>Что думаете насчёт rust?
Там вообще никаких иде нет.
Может быть жетбраинс когда нибудь выпустит свою иде для него, если он взлетит
Свой там слабенький да. clang tidy тоже не очень, нужно по коду гонять сторонними утилитами, заточенными специально под это дело, если уж на то пошло.
В пизде, уёбок.
https://forum.qt.io/search?term=lgpl static linking&in=posts&sortBy=relevance&sortDirection=&showAs=posts
>>1051063
>Если у объекта есть данные во владении - они needed.
Какой упёртый! Если данные можно разместить в объекте, то выделение памяти не needed.
>>1051070
>Что-то запрещает делать construct и destroy в SSO-буфере?
Какбе объект сам-то знает о том, что строка в нём находится. Это всего лишь деталь реализации, а не гарантированный UB.
>>1051088
>Поясните за статический анализ кода на c++
Часть задач анализатора выполняется компилятором и стандартом языка.
Эм. Та же андроид студия - просто набор плагинов. Что изменится если запилить standalone-сборку с Rust-плагином?
И как раз в начале августа JetBrains объявила официальную поддержку Rust-плагина (до этого это был типа pet-проект пары чуваков из JB).
>Если данные можно разместить в объекте, то выделение памяти не needed.
В приличных языках за такое ебут раскаленной кочергой пока до кукаретеков не дойдет. Но это кресты, тут всем похуй лол, на фоне общего пиздеца никто и не заметит.
Нужно открыть консоль через ярлык в папке студии, он туда все пути загонит.
Там mingw тулчейн должен быть. Все, дальше сам. Надеюсь про CFLAGS, CXXFLAGS, CC, CXX, LDFLAGS ты уже знаешь
Лолшто? Иди посмотри на плагин для какой нибудь скалы или котлина — там фич больше чем для шарпа у какой нибудь студии, без шюток. И вообще открой, сука, доку по архитектуре идеи — это одна большая платформа для плагинов, в которой даже жаву уже вынесли в плагин, что как бы намекает.
Отдельные иде они выпускают только когда есть конторы которые будут закупать лицензии сотнями и тысячами, чтобы потом выпускать мажорные релизы по 3 раза в год и предлагать обновлять лицензии с 20% скидкой как они это регулярно делают, эти же похуеитрожопее челиков из PVS.
Нету ещё никакого драфта 20-го стандарта, коммитет только 17-й закончил. Есть кучка пропозалов которые хуй знает ещё сколько мусолить будут.
Они там пол века решают экспортировать макросы или нет, дальше сам можешь закончить мою прошлую мысль.
Лол, скинь ссылку.
Недавно же только финальное собрание коммитета было и принятие 17-х плюсов.
Хотя энивей — даже наличие в драфте ничего не меняет.
Благодарю
Это называется "абстракция". У объекта есть члены и аллокатор, а что он с ними делает - тебя ебать не должно, если ты не опираешься на UB и ID.
Решил чуть чуть подкопнуть в сторону ассемблера, чтобы более менее понять как работают функции. Хотел спросить, указатель из записи стека ( второе имя для кадра стека ) и base pointer это одно и тоже?
Посоветуйте на ведро ньюфагу чтобы код писать, можно даже без компиляции наверное, главное чтобы подсветка была.
Мне бы на досуге код писать, а не капчи вводить, или это плохая затея?
Ведро 4.4, рут есть
pochemu ty takoy ueban i ne mozhesh poogoogleet'?
> filename.cpp
int x; // global'naya peremennaya, obyavlennaya v filerelated
> p 'filename.cpp'::x
>крестодаун не может даже примерно предсказать размер своих объектов
>абстракция, пацаны, вы че)))
зачем тебе нужны примерные размеры твоих объектов? тебе нужны размеры объектов - объектов, или размер данных которые он попросил у аллокатора?
что не так с needed? про small string optimization не слышали? или если строчка пустая, то она всё-равно должна выделить ровно 1 байт под зиротерминатор?
фгугл
олсо ideone.com и куча других.
>>1053045
Погуглил за тебя.
https://stackoverflow.com/questions/21694302/what-are-the-mechanics-of-short-string-optimization-in-libc
Ну, давай рассмотрим типовую задачу которая обычная успешная крестомакака может пилить, если она не QT-говноед. Есть очередная биткоин/хуеин или просто биржа где-нибудь в штатах и ты галеришь для нее бек. Тебе надо обеспечить защиту строковых данных от любой коррупции памяти, переполнения и прочего, при условии что ты ее отдаешь в третьи руки, возможно даже в объектник, или того хуже интерпретатор другого языка. Расскажи мне как ты это сделаешь без строкового пула.
Велосипедить ¯ \ _ (ツ) _ / ¯.
Или std::string должна решать вообще все задачи, которые только могут быть в мире?
А какие вообще задачи ты решаешь с помощью std::string в таком случае? Моя задача более чем типовая судя по StackOverflow и собственному опыту, лол. Мне казалось что кроме обработки данных на крестах/сях писать что-либо уже настолько моветон что и проектов таких нет.
на кикстартере уже $0,3 собрал!
SSO абсолютно прозрачна и соответствует стандарту. Если ты можешь найти пример использования string без UB и ID, в котором SSO что-то ломает - заноси.
Сибоярин хоть когда-нибудь смотрел на вывод компилятора в ассмблере и все те охуительные трюки, которые используются для ускорения программ на C? SSO - это название техники, которую применяют компиляторы, и тебе, как пользователю языка, ВООБЩЕ похуй на неё.
Блять, неужели даже коррапт стека не так критичен, как коррапт памяти в которой лежат строчки?
Да, я замечал такую хуйню что нонешним макакам вообще на всё похуй. Потом полны треды жопной боли что опять дали пинка под зад.
>SSO - это название техники, которую применяют компиляторы
Ты совсем долбоёб или прикалываешься?
>Моя задача более чем типовая судя по StackOverflow и собственному опыту, лол.
Охотно тебе верю. А у тех кто программирует графику совсем другие типовые задачи. И у тех кто драйвера для железок. И у тех кто UI. В каждой предметной области есть свои типовые задачи. Какой сюрприз да? Твоя ошибка в том что ты свой опыт распостраняешь на всю индустрию. Это во-первых.
Во-вторых, какай у языка лозунг? Не платишь за то что не используешь. Так почему все должны отказаться от удобной оптимизации ради тебя?
Ну и в-третьих, даже в твоем случае, это нужно только для части строк, так ведь? Т.Е. по хорошему для часть строк - свой самописный класс с пулом. А другая часть стандартная которой все это не нужно, и которая работает быстрее благодаря SSO.
Все критично, вообще любое повреждение данных. И тебе надо об этом орать в общую шину, что макака сидящая дальше данные портит, иначе тебе пиздец.
Просто память ты можешь отследить (примерно так же как обычный CrtMemoryCheck() в винде), а стек - хуй.
>>1053467
Нет, не для части - для всех. Кстати из всех кого ты перечислил работать с пользовательскими строковыми данными будут и только в дебаге... а хуй знает, может игроделы, в теории, но это должна быть какая то совсем уж унылая шарага где такие вещи в ресурсах не хронятся.
>ты совсем долбоеб
>не задавай мне тупые вопросы!!!!
Ебать у вас тут весело, давно я в тематике так не проигрывал.
Implementation Defined (behaviour)
Анон предлагаю 2000 рублей за 2лабы и 1 игру C++/CLI ООП.
Вот сами задания:
-------------------
1. Разработать класс «Множество» на основе массива с полной системой функций, включая интерфейсную функцию просмотра содержимого множества.
2. Используя множество как структуру хранения данных, решить прикладную задачу.
Дана последовательность символов. Сформировать множество, представляющее собой частотный алфавит указанной последовательности.
---------------------------------------------------
Прикладная задача (использовать хэш-таблицы)
Кот Матроскин владеет стадом коров, а также организовал производство молока, сметаны, творога, масла. Ежедневно он учитывает дневной сбыт каждого вида продукции, причем цены товара у Матроскина могут изменяться, и цены ему приходится тоже ежедневно записывать.
В конце месяца необходимо подвести итог по результатам торговли, чтобы выяснить, какая продукция пользуется наибольшим и наименьшим спросом, а также какая продукция приносит наибольшую и наименьшую прибыль.
В конце года необходимо решить ту же задачу для подведения итогов года.
Задание
1. Разработать сущности для сохранения необходимой информации, реализовать необходимые методы.
2. Организовать список записей на основе одного из контейнерных типов Net.Framework, реализовать интерфейс для добавления и отображения записей. Сохранить список в текстовом файле.
3. Реализовать интерфейс для ежедневного ввода данных.
Реализовать механизм подведения итогов и вывод результатов, результаты сохранить в текстовом файле
--------------------------
Написать программу — игру тренажер клавиатуры «Гонки за хвостом».
С нормальным ООП, использовать структуры данных
Кто у умеет писать хороший код на c++/cli и хочет заработать пишите в телегу @totlds
нужно как можно быстрее, дедлайн 2 сентября.
Тебе рановато отсылать тестовые задания, когда ты даже нихуя не понимаешь о чём пишешь.
Обосрался — обтекай.
Никто это говно за 2к делать не будет, это смешно.
За 2к ты можешь купить час моего внерабочего времени. За этот час, ты не сможешь даже описать чего именно от тебя хотят. Потому что хуйня вроде "гонки за хвостом" - какая-то местечковая параша в голове твоего препода.
Зачем это в треде понимает 1.5 человека, еще 1.5 делает вид что понимает итого выйдет унылый срач полный маняфантазий.
В остальных тредах прикладные задачи решают, а в этом в основном борятся с языком и проблемами с памятью
Мне надо написать GUI с ползунком, значение с этого ползунка будут передаваться в консоль игры.
нужно, чтобы эта хуйня была в форме экзешника, и при запуске экзешника запускался еще и экзешник игры.
Какую либу использовать для гуи, как замутить экзешник? Не обоссывайте, суки
> Ведь кресты - язык без задач.
ты хотел сказать что пад него нет специально выдуманных задач, как для других языкоф
Я знаю, как сделать это в Qt. Как сделать ползунок - сам догадаешься, а как передать:
http://doc.qt.io/qt-5/qprocess.html#communicating-via-channels
http://doc.qt.io/qt-5/qprocess.html#setInputChannelMode
http://doc.qt.io/qt-5/qprocess.html#writeData
Олсо, там традиционно есть еботня с текстовыми кодировками - нужно писать в той же кодировке, в которой читает программа. Самый простой способ сделать это - не менять локаль ни в одной программе, ни в другой.
Либо, если игре не нужно принимать текстовые команды вообще, ты можешь поменять режим записи и чтения на бинарный в обоих программах (чтобы \r и \n никогда нигде не конвертировалось) и писать числа по какому-нибудь простому протоколу:
https://stackoverflow.com/questions/1598985/c-read-binary-stdin
cin и cout получают свои данные через stdin и stdout, поэтому нужно поменять режим в stdin и stdout. Читать из cin надо с помощью cin.read(), писать - с помощью cout.write(), использовать sizeof() в обоих случаях.
>>1054387
http://en.cppreference.com/w/cpp/language/memory_model
Прочитал. Зачем сраться? Есть модель памяти, которой все придерживаются, и модель параллельного взаимодействия, применение которой минимизирует оверхед, не вижу никакой проблемы в этом. Есть задачи, в которых это неоптимально?
>Прочитал. Зачем сраться?
Я имел в виду срач не о самой модели памяти, а о том, чтобы пришёл какой-нибудь ньюфаг с её непониманием и начал молоть ерунду. Было бы весело покормить его г-ном.
зачем в std контейнерах потокобезопасность? почему нельзя сказать "если вы std string в разных потоках используете, это UB, если вы в потоках используете atomic<string> то всё ок"?
Как-то этот may be слишком неуверенно звучит. Вот так лучше:
The template argument for T shall be trivially copyable
-- http://eel.is/c++draft/atomics.types.generic#1
Тогда рассказываю.
0) Не бывает абстрактной thread-безопасности для контейнера, может быть лишь конкреный набор безопасных операций с предсказуемым результатом.
1) std::atomic - это инструмент для ускорения параллельных программ. Мьютексы - довольно дорогая операция, и в некоторых случаях ты можешь сделать алгоритм взаимодействия без мьютексов вообще, используя atomic. При этом atomic не использует мьютексы не во всех случаях, а только тогда, когда это возможно. То есть, если ты захочешь сделать atomic<array<char,90001>load(), то внутри будет использован мьютекс почти на всех ЦП.
2) std::atomic<string> - это фингербокс, так как единственная полезная операция, которая становится безопасной по сравнению со string - это swap (exchange). У atomic есть лишь ограниченный набор операций, которые становятся безопасными, читай:
http://en.cppreference.com/w/cpp/atomic/
Конкатенация строк? Получаешь UB - перемещается область данных из-за реаллока, за тебя никто это проверять не будет. Хочешь search&replace - получаешь data race, если другой тред пишет в строку. Когда ты пишешь atomic<string>.load(), ты получаешь обычную копию строки, которая использует ту же динамическую область данных.
3) как я уже сказал, просто потокобезности не бывает, есть определённый набор безопасных операций. Потокобезопасность контейнеров максимально примитивна - она означает то, что если разные треды используют строго разные элементы, то нету data race.
http://eel.is/c++draft/container.requirements.dataraces#2
Ну и ещё некоторые требования:
http://eel.is/c++draft/res.on.data.races
которые обозначают самую милипиздрическую потокобезопасность - то есть, ты гарантированно не отстрелишь ногу, пока ты ничего не делаешь.
Имеется базовый класс и несколько наследуемых от него.
В базовом классе есть функция Touch которая принимает указатель на базовый класс пикрелейтед.
В наследниках эта функция как-то определяется по своему.
Для кого-то функция не будет делать ничего, например.
Так вот суть вопроса.
Можно ли как-нибудь сделать идентификацию типа чтобы избежать динамик_каста?
Ну или сделать виртуальную функцию которая бы возвращала имя класса.
То есть сделать что-то такое https://pastebin.com/qYASThE5 ?
>Это инструмент для написания параллельных программ, вот обчитаются такой хуйни и потом городят.
Там дальше в посте объяснение этого утверждения, так что иди нахуй.
>>1055182
>чтобы избежать динамик_каста?
Нахуя? Если ты уже проверил динамический тип, ты можешь использовать статический каст, так как динамический - это проверка RTTI и статический каст. И даже в этом случае - нахуя?
>Можно ли как-нибудь сделать идентификацию типа
enum class в каждой корневой базе сделай, только компилятор делает примерно то же самое для RTTI, так что ты только свой велосипед городишь.
>enum class в каждой корневой базе сделай, только компилятор делает примерно то же самое для RTTI, так что ты только свой велосипед городишь.
Загугли llvm style rtti, у них была статья об этом в их доках в которой рассказывается что и как, и почему ты хуйню сморозил.
Спустя сутки я так и не понял, что ты хочешь сделать. То, что ты говоришь - один в один причина для использования виртуальных функций, где там у тебя динамик-каст-то? Ты хочешь избежать милипиздрического оверхеда виртуальных функций?
>>1055572
>Загугли llvm style rtti
Загуглил - ёбаная каша для создания багов с максимальной производительностью. Ты хочешь сказать, что то, что я предложил - это оно? Ну и ладно, посыл тот же - вопрос ОПа нихуя не понятен.
Да, это оно.
И если разработчики одного из главных (в мире ойти гигиантов — главного) компилятора считают что это может чувствительно просадить перформанс и ради этого месят подобную лапшу (и запрещают в своём кодстайле использовать RTTI c dynamic_сast и прочим, как и гугловцы) — мне кажется они что-то да знают.
Бля, я с этой капчей скоро снова считать без калькулятора научусь, лул.
Я бы сказал хуёвая...
>что это может чувствительно просадить перформанс
Что угодно может просадить перформанс.
>мне кажется
Тебе кажется, а в статье конкретно написано, что нужно это для быстрого динамик_каста, для специализации функций под разные динамические типы аргумента это нах не нужно, достаточно свитча по hash_code из type_info и reinterpret_cast (видимо, ОПу вопроса это и нужно, но хуй дождёшься его).
Что там у них за юзкейс, в котором обязательно нужно использовать кучу кода с огромными возможностями для багов (инбифо есть тулза) - хуй знает, рыть исходники я не буду.
>>1055703
И тут ты рассказываешь о том, зачем тебе нужны атомарные операции с объектами, которые используются в одном потоке.
>Что там у них за юзкейс, в котором обязательно нужно использовать кучу кода с огромными возможностями для багов (инбифо есть тулза) - хуй знает, рыть исходники я не буду
Ну тогда я тебе, гению, подскажу. Они пишут компиляторы, и им нужно AST составлять, причём по которому нужно очень быстро бегать. Когда у тебя только от одного ебаного <iostream> 40+ к нод (попробуй шланг с -ast-dump на хэловорд натравить) — дохуя весело наверно это дело обходить по 5 раз (надеюсь зачем это делать сам догадаешься?).
Хуй знает какие тут могут быть баги. Допустить опечатку в названии енума?
А вообще, я сейчас 5 раз перечитал вопрос того пацан и понял что он ебётся со стеной и ему тупо нужно почитать про паттерн посетитель (благо в плюсах на шаблонах его можно сделать без виртуальных функций, привет буст, гы).
>Хуй знает какие тут могут быть баги. Допустить опечатку в названии енума?
Ты сам-то читал статью, блядь?
https://llvm.org/docs/HowToSetUpLLVMStyleRTTI.html
>Ну тогда я тебе, гению, подскажу. Они пишут компиляторы, и им нужно AST составлять, причём по которому нужно очень быстро бегать. Когда у тебя только от одного ебаного <iostream> 40+ к нод (попробуй шланг с -ast-dump на хэловорд натравить) — дохуя весело наверно это дело обходить по 5 раз (надеюсь зачем это делать сам догадаешься?).
О, совсем забыл, я хотел сегодня компилятор написать!
Читал, и не понял нахуя сравнивать с какими-то усреднёнными значениями из енума. Единственный непонятный и спорный момент.
>О, совсем забыл, я хотел сегодня компилятор написать!
Ну вот ты сам сказал — что ты безграмотное хуйло, ни разу не сталкивавшееся с необходимостью построения кучи древовидного говна, которое встречается почти везде в том или ином виде кроме гуй-кружошлёпства мб. Ведь мало оверхеда от того что эту парашу нельзя ужать в единый массив, и она в памяти растекается как жир итт и примерно никогда не попадает в кэш, нужно ещё виртуальных вызовов и динамик каста насобачить.
Это называется примитивом синхронизации, неуч. Многие параллельные операции можно делать и без синхронизации.
Про инструмент и ускорение это какое-нибудь Intel Parallel Studio.
Скоро (через год) во всех (на самом деле нет) компиляторах мира (на самом деле только Земли)
Это уже во всех кроме отсталой хуиты вроде оракловского и интеловского компилеров которые в своих вселенных живут.
Ну, проще говоря, это делается для того, чтобы можно было выполнить unqualified name lookup. Так лучше?
http://en.cppreference.com/w/cpp/language/unqualified_lookup
Ну ебана, а как тебе объяснить что оно делает, если ты не понимаешь ничего из того, с чем оно это делает? Пока не пройдешь неймспейсы просто забей хуй и прими как должное - "надо писать это шоб та функция работала, почему - пока хз".
А если совсем грубо объяснять:
Вот ты написал класс class Huy, и хочешь, чтобы другие, когда подключали твою йоба-либу, не получали кучу ошибок из-за того, что твой класс конфликтует с их классом, который тоже называется Huy. Поэтому ты используешь неймспейс - namespace HuyLib { class Huy };
Теперь, когда другие подключат твою либу, они не смогут просто сразу писать a = new Huy, потому что там, где они это пишут, нет такого имени - оно в другом пространстве имен. Чтобы оно было, надо либо явно указывать неймспейс каждый раз - HuyLib::Huy (так же, как ты можешь явно писать везде std:: для стандартных функций вместо using), либо просто написать один раз using namespace HuyLib, и теперь все имена из неймспейса становятся видны (если ты уверен, что в твоем файле нет конфликтующих имен и можно просто юзать как есть).
>Читал, и не понял нахуя сравнивать с какими-то усреднёнными значениями из енума. Единственный непонятный и спорный момент.
Динамик каст узнаёт, является ли объект запрошенным типом или имеет ли предка запрошенного типа. Числа элементам энума присваиваются строго в порядке следования. Дерево наследования с единственным наследованием ложится на шкалу значений ( порядок определяется обходом в глубину), после этого все производные типы для динамик_каста оказываются в отрезке от базы до последнего наследника, и когда запрашивается динамик_каст в некоторый класса, то статический метод этого класса проверяет, находится ли Kind конвертируемого класса в нужном отрезке.
Если наследование множественное, начинается пиздец - надо сравнивать с несколькими отрезками.
>>1056066
Иди-ка ты нахуй, дебил. Примитив синхронизации - мьютекс. atomic можно целиком сделать через мьютексы и не определять никаких специальных операций для объектов вида сложения, инкремента, подмены или ещё чего, они определены только потому, что они довольно часто используются и на некоторых ЦП они МОГУТ быть выполнены без мьютекса. Примитивом атомик не является.
>>1056254
фгугл
>Примитив синхронизации - мьютекс.
А это где-то сказано в стандарте или это так, твоё МНЕНИЕ?
>не подскажете можно ли мне реализовать что-то другое помимо событий
Можно. Гугли в сторону functional reactive programming.
>Если наследование множественное, начинается пиздец - надо сравнивать с несколькими отрезками.
Вот оно что, михалыч. Спасибо что выше столько капитанской фигни написал, графоман, я ж не осилил бы.
foo (const int const m);
Принимать должке двумерный массив созданный неизвестным образом
А куда звёздочки делись-то?
Да.
>>1056324
Показываешь место в стандарте, где написано, что atomic - это примитив - покажу, где написано, что mutex - это примитив.
>>1056373
Это неконстантный указатель на константный указатель на константный инт.
>Принимать должке двумерный массив созданный неизвестным образом
Нахуй тогда указатели, делай template.
template<typename T>
foo(T n)
Вот так ты вообще любой массив примешь, включая ассоциативный контейнер (а не только кусок памяти).
- работа с мультимедиа (видео, игры)
- Java и андроид
- отличное знание C++
Что читать?
За пол года это не особо реально.
Минет. Не можешь написать буль с атомарными операциями на мьютексах - вон из профессии.
Вон из профессии, дебил
Operations on an object of type atomic_flag shall be lock-free.
http://eel.is/c++draft/atomics.flag#2
То есть, всё-таки atomic нужен для улучшения производительности? То есть, всё-таки, он не является примитивом?
Я влез в вашу дебильную беседу только после того, как ты начал пиздеть, что любой атомик можно реализовать на мьютексах. Причём ты не остановился даже после того, когда я явно спросил про atomic_flag. Который должен быть lock-free.
Кто там у вас примитив — это ты выясняй со своими дебильными собеседниками.
>Который должен быть lock-free.
У lock-free есть какое-то другое свойство, кроме производительности? Примитив - это то, через что можно сделать всё остальное, атомик флаг пишется на мьютексах и примитивом не является, отличие будет только в производительности.
>атомик флаг пишется на мьютексах
Дебил, как ты на мьютексах удовлетворишь требованию lock-free?
У lock-free есть какое-то другое свойство, кроме производительности?
Как ты вообще удовлетворишь это требование на ЦП, на котором нужной инструкции нет?
Никак. А что?
>другое свойство, кроме производительности
У него одно свойство - операции (некоторые) с ним выполняются за один такт. К производительности это никаким краем.
>У него одно свойство - операции (некоторые) с ним выполняются за один такт.
Ёбаное гонево.
1) Ты не можешь за один такт сказать всем ядрам процессора о том, что ты сейчас будешь менять один бит.
2) То, что оно сделано за один такт, не означает того, что нету data race.
>К производительности это никаким краем.
Тогда для чего нужно требование lock-free? Есть другие применения у lock-free-операций?
>Ты не можешь за один такт сказать всем ядрам процессора
Зачем мне им это говорить? Для того и ввели понятие "атомарных" операций, чтобы не было пересечений ни по кешам ни по пайплайну. см. >>1056630
>Тогда для чего нужно требование lock-free?
https://en.wikipedia.org/wiki/Linearizability
>>1056631
О, отлично, попёр конструктив.
>>1056630
Никакое свойство mutex не препятствует исполнению atomic_flag через мьютекс (кроме самого требования не делать это через мьютекс). address-free - это о меняемом значении и о том, что оно должно обновиться во всех адресных пространствах сразу. Когда ты залочил буль и пишешь новый буль, это обеспечивается механизмами когерентности кэша физической памяти в ЦП. Когда ты делаешь это с помощью одной инструкции, происходит то же самое, просто очередью управляет процессор без мьютексов - если несколько потоков подряд решат записать в буль в одно время, они либо залочатся на разное время, либо залочатся на большОе время (достаточное для того, чтобы разрулить все ядра в самом худшем случае) - в зависимости от того, как процессор сделан.
>>1056631
>Зачем мне им это говорить?
>чтобы не было пересечений ни по кешам ни по пайплайну.
atomic_flag zalupa;
........
и тут такие 2 треда (которые не на одном ядре выполняются) одновременно решают сделать:
result=zalupa.test_and_set();
Что произойдёт дальше? Оба треда получают false?
>Обе инструкции выполнятся последовательно
Как одно ядро узнает о том, что на втором ядре выполняется инструкция для того же адреса?
>Никакое свойство mutex не препятствует исполнению atomic_flag через мьютекс
У mutex есть гарантия address-free?
>address-free - это о меняемом значении и о том, что оно должно обновиться во всех адресных пространствах сразу.
Цитату из стандарта, плиз.
20 минут плясок с бубном и студия снова работает.
Так называемая питерская АйТи-элита сделала программу, которая перестает работать, а затем начинает работать без всякой логики.
Заработало после того, как я поудалял все проекты, все cmake кэши попробовал создать проект заново.
>У mutex есть гарантия address-free?
Мьютекс содержится в памяти - ясен пень, он address-free, это свойство памяти, расшаренной между процессами средствами ОС, блядь. Попробуй найти хоть одну ОС, в которой изменения в расшаренной памяти видны не всем процессам сразу, это естественное свойство расшаренной памяти, она только для этого и нужна. Попробуй найти хоть одну архитектуру ЦП, в которой видимость записи в память зависит от того, какая таблица виртуальной памяти была загружена.
>Цитату из стандарта, плиз.
http://eel.is/c++draft/atomics.lockfree#4
>Мьютекс содержится в памяти - ясен пень, он address-free
Без пней, пожалуйста. Гарантию address-free принеси. На уровне стандарта.
Щас у меня голова вскипит, ты заебал меня. Это ты так ведёшь меня к тому, что в плюсах мьютексы только для тредов, и что комитет вставил атомик_флаги, но до сих пор не сделал межпроцессные мьютексы обязательными, которые можно запросто написать на тех же инструкциях? Ладно, я всё понял. Да, действительно, с точки зрения STL атомик_флаг - незаменим в строгом смысле.
http://eel.is/c++draft/thread#req.lockable.general-1
>An execution agent is an entity such as a thread that may perform work in parallel with other execution agents. [ Note: Implementations or users may introduce other kinds of agents such as processes or thread-pool tasks. — end note ] The calling agent is determined by context, e.g. the calling thread that contains the call, and so on.
Здесь говорится, что агент - это тред, процесс и т.д., но не говорится, что процесс должен быть агентом. Грубо говоря, заменимость атомик_флага мьютексом зависит от implementation.
>>1056829
Ага, и мемори-фенс у нас за один так выполняется, да? Я уже не говорю о том, что в большинстве процессоров за один такт вообще ничего не выполняется, так как гиперскалярность. В терминологии силён не особо, но этот твой мемори-фенс означает то, что одно ядро должно сказать всем остальным об изменении буля ДО ТОГО, как они тоже попытаются это сделать, сделают и уже выполнят другие инструкции с использованием полученного значения. В этом вы меня не наебёте - из атомарности операции следует не то, что она за такт выполняется, а чаще всего то, что она выполняется одной инструкцией.
>но этот твой мемори-фенс означает то,
Нет. Это просто инструкция, которая учитывается при наполнении пайплайна.
>В этом вы меня не наебёте - из атомарности операции следует не то, что она за такт выполняется, а чаще всего то, что она выполняется одной инструкцией.
Вопрос терминологии, не более. В ряде случаев обе формулировки верны.
Я вообще не пойму, чего ты так вцепился в мьютексы как примитивы. Ты это в какой-то книжке прочитал?
В общем случае атомики можно выразить через мьютексы, а мьютексы через атомики. (Но это в общем случае. Не в общем есть atomic_flag.) Почему одно примитивнее другого?
Сотни нефти тебе.
imbue для операторов std::wcout, std::wcin, std::cin, std::cout, и посмотри сразу какие там типы данных используются, чтобы потом меньше ебли было.
>Почему одно примитивнее другого?
Изначально речь шла об std::atomic.
>>1056881
>imbue для операторов std::wcout, std::wcin
Во-первых это не операторы. Во-вторых wcout и wcin на винде мёртворождены, нету их там.
>>1056885
Какой ещё выпадающий список? Откуда выпадает хоть? Питон нахуя для этого?
Очевидное очевидно: возьми исходники mintty или другого терминала и прикрути. Без винапи ты это не осилишь, если сам не сделаешь терминал на Qt.
>>1056910
>Программа должна переводить из десятичной системы в двоичную,
Делается в две строчки с помощью модификаторов вывода.
>>1056910
>Почему при переборе с последнего элемента до первого и с первого до последнего получаются разные числа?
Потому что int i проходит разные значения, посмотри внимательно на свой for.
bin[bin.size()] - это выстрел в ногу.
http://ru.cppreference.com/w/cpp/container/vector
Вот, ищи, где там написано, что там будет ноль.
Пройди с помощью бумажки все значения i в обоих for-ах. Если ты не знаешь, как это сделать - тряси препода.
гугли sfinae
P.S. чтобы было ещё веселее можно использовать вот такой макрос, но он работает только под визуалкой ждем концептов
https://ideone.com/YZazpy
>он работает только под визуалкой
Потому что нахуя Y::##_arg_type ?
https://ideone.com/od5Vxv
Так я хотел склеить Y:: и аргумент, кто же знал что там можно и без склейки
да и под визуалкой работает, мне большего и не надо
Ты вообще знаешь, зачем ## нужен?
> да и под визуалкой работает
Она известна своим кривым препроцессором. Чаще он не осиливает валидный код, но тут «осилил» (т.е. выдал ожидаемый результат) невалидный. Считать ли это плюсом? Не думаю.
чуть-чуть не корректный пример привел
#define FOO(a, b) (a##b)
int c2h = 10;
std::cout << FOO(c2, h);//"10"
вот так вот
а # обрамляет лексему в двойные кавычки
Разве что MOC, да отдельные утилиты для кодогенерации. Но это не делает макросы менее отвратительными
Что так категорично?
SDL - не рабочая библиотека. Я всё аккуратно скопировал в папки MinGW, подключил библиотеку к проекта и он мне выдают, что в самой библиотеке не может найти функции:
c:/MinGW/i686-w64-mingw32/lib/libSDL2.a(SDL_systimer.o): In function `SDL_SetSystemTimerResolution':
/Users/slouken/release/SDL/SDL2-2.0.5-source/foo-x86/../src/timer/windows/SDL_systimer.c:57: undefined reference to `_imp__timeBeginPeriod@4'
и ещё 100500 аналогичных строчек...
Видимо выкладывают какие-то битые сборки и не проверяют их.
https://github.com/spurious/SDL-mirror
Попробуй отсюда ее вытянуть и сбилдить на том же cmake, к примеру, самое простое, что можно придумать.
А вообще, если ты решил копошиться под MinGW, то советую лучше вытянуть MSYS2 или Cygwin (второй будет по-жирнее, но и по-лучше, вроде как). MSYS2 самый простой вариант для тебя, как мне кажется. Установишь его и потом pacman-ом поставишь еще sdl и всего-то делов.
И что тебе не понравилось? Ну если ты скучающий аутист, то можешь Кнута навернуть.
>и он мне выдают, что в самой библиотеке не может найти функции:
timeBeginPeriod - это функция из винды. Видимо, тебе нужно ручками подключить "Winmm.lib". Я не знаю, есть ли в GCC вообще это автоматическое подтягивание либ, я никогда не видел его. Судя по километрам "-lХУЙПИЗДА" в мефкфайлах, которые я видел - нет.
>>1057559
Это часть языка, что значит "нахуя"? От того, что он не может быть перегружен, он не перестаёт быть оператором.
я дебил, соре, не так написал вопрос
нахуя в комитете идут разговоры о возможности перегрузки оператора точка? зачем нам перегружать ТОЧКУ БЛЯТЬ, чтобы ещё сильнее язык усложнить?
Можно и нужно, glut устарел уже лет как 10.
SFML, GLFW, SDL, ну или писать напрямую без сторонних библиотек.
Хотят сделать компилируемый LISP, небось. Хуй что выйдеет, впрочем. То, что разговоры идут, ничего не значит.
>>1057687
> не знаю, есть ли в GCC вообще это автоматическое подтягивание либ, я никогда не видел его. Судя по километрам "-lХУЙПИЗДА" в мефкфайлах, которые я видел - нет.
Только что проверил скачанный архив с SDL - там есть pkgconfig, в котором написано всё это:
>Libs.private: -lmingw32 -lSDL2main -lSDL2 -mwindows -Wl,--no-undefined -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -static-libgcc
То есть, всё должно линковаться. Куда ты распаковал архив? Нужно распаковывать так, чтобы папка i686-w64-mingw32 слилась с такой же папкой МинГВ.
Разве что совсем чуть-чуть, я только Схемку знаю немного (там ООП нету, вроде, но есть полноценные макропреобразования). Дело в том, что, имея интерпретатор (с JIT или без - вопрос производительности) можно писать некоторые специфичные вещи так коротко, что на плюсах ты заебёшься писать. Макро в ЛИСПе - это как препроцессинг, только его можно делать в любом месте и использовать состояние программы и все возможности языка, а не только всякие примитивы типа define, #, простой подстановки и так далее. Шаблоны - это то, что приближает C++ к ЛИСПу. Constexpr if, constexpr array и прочее - это перетягивание возможностей языка на сторону компилятора. Для того, чтобы сделать double dispatch - т.е. вызов метода соотв. динамическому типу и вызов метода, соотв. динам. типу аргумента - в плюсах надо городить стену кода из одинаковых методов, так как это единственный способ автоматического выбора перегруженной функции по типу, даже dynamic_cast тебя не может спасти. Некоторые вещи можно добавить в плюсы ПОЧТИ безболезненно (статики создаются в каждом инстансе generic lambda вместо одного на всех, http://coliru.stacked-crooked.com/a/ae480e8cfdf344d1, нахуй это надо?), некоторые - со страшной болью, как constexpr if.
Без встроенного компилятора и возможности записи кода в исполняемую память (привет защите от исполнения в большинстве современных ОС) C++ ЛИСПом не станет, и если это хоть когда-то случится, стандарт языка станет занимать шкаф, а ошибок в стандарте и компиляторах будет море.
Ну про лисповые макросы, и изменения кода без перезагрузки программы я слышал, но каким боком тут "оператор точка"? :D
Про инстансы статиков - логично, а вдруг
static decltype(hui) Ggurda;?
тогда без многих инстансов точно не обойтись, а городить проверки "зависит ли тип статической переменной от типа одного из аргументов?" было бы лишним, вот честно
Почитал пропосал и понял, что это у меня синдром утёнка.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1990/WG21 1990/X3J16_90 WG21 Request for Consideration - Overloadable Unary operator.pdf
В целом неплохо написано. Это и есть ответ на твой вопрос о том, зачем это нужно. Но то, что из плюсов пытаются сделать ЛИСП - всё равно отчасти правда.
>>1057852
Собственно, это не только к лямбдам относится. Иногда по коду сразу не видно, будет инстанциирован тимплейт ещё раз или нет. Но практическихх примеров для иллюстрации у меня нет.
А вот и быдлецо подъехало, почему не на заводе или не в школе?
>нахуя в комитете идут разговоры о возможности перегрузки оператора точка?
Зачем задавать такие вопросы? Находишь пропозал о перегрузке оператора точка и читаешь мотивационную часть.
A a();
auto f = std::async(std::launch::async, a.do);
Ошибка invalid use of non-static member function, но должен же быть вариант запустить эту шляпу.
В лямбду оберни.
Придется ловить все сообщения об изменении родительского окна и двигать дочерние. Но лучше переосмыслить дизайн и сделать контейнеры.
Кто объяснит поведение этого кода, тому нихуя
Посмотрим, что местные маньки знают о цепепе.
>Посмотрим, что местные маньки знают о цепепе.
При чем здесь язык? Видимо данный компилятор считает себя умнее тебя так и есть
Это что, объяснение?
компилятор выкинул цикл при включенной оптимизации, например потому что нет эффектов. Тоже мне загадка века
Благодарю
Что ты этим хочешь сказать?
Уебанцы без нормального тулчейна, вот кто вы. Ваш тулчейн специально на плюсах написан чтобы вы страдали сильнее.
Какие выводы то? аккуратнее с бесконечными циклами без побочных эффектов? юз онли волатайл перменные в вайлах? cl > clang? Не лучшие оптимизации меняют поведение программы? о каких выводах ты говоришь?
>аккуратнее с бесконечными циклами без побочных эффектов?
Да, ибо UB.
> юз онли волатайл перменные в вайлах?
Это ещё зачем?
> cl > clang?
Лол, нет.
> Не лучшие оптимизации меняют поведение программы?
Тут UB, так что никто больше не обязан сохранять какое-то поведение программы. О жид аемое ли не о жид аемое.
> о каких выводах ты говоришь?
Которые ты должен сделать для себя.
Что-то я не понял.
http://coliru.stacked-crooked.com/a/8f5d0c3d27bcf38c
Почему на строчке 23 он сам дедусит, а на строчке 25 без тимплейт аргументов обламывается?
Может потому что std::async это шаблон функции, а std::function это шаблон класса?
Почему
std::vector v {1, 2, 3}
обламывается у тебя тоже вызывает вопросы?
>Может потому что std::async это шаблон функции, а std::function это шаблон класса?
Правда, в C++17 будут deduction guides, но для member function не завезли.
Вектор у меня не вызывает вопросы, там другое совсем.
>template< class Function, class... Args>
>std::future<std::result_of_t<std::decay_t<Function>(std::decay_t<Args>...)>>
async( Function&& f, Args&&... args );
Function - это что такое?
Почему он так называется и почему указатель на метод подходит под это название?
http://en.cppreference.com/w/cpp/language/function_template
Это он? Каким боком указатель на мембера подходит под это определение?
Как async догадывается до того, что нужно делать с указателем на метод, и до того, что первый аргумент в списке - это lhs для .*?
Где в доках написано, что async принимает указатели на методы таким образом?
Function - это тип удовлетворяющий требованиям Callable.
Что такое Callable написано здесь https://en.cppreference.com/w/cpp/concept/Callable
http://coliru.stacked-crooked.com/a/082c14891a5ad4f5
>для бинда эти гайдлайны есть
Какие гайдлайны, поехавший? Это обычный шаблон функции. Deduction guides нужны для классов.
Ах ты блет!
>>1058791
>Правда, в C++17 будут deduction guides, но для member function не завезли.
http://en.cppreference.com/w/cpp/language/class_template_argument_deduction
> If C is defined, for each constructor (or constructor template) Ci declared in the named primary template (if it is defined), a fictional function template Fi, is constructed, such that
> template parameters of Fi are the template parameters of C followed (if Ci is a constructor template) by the template parameters of Ci (default template arguments are included too)
> the function parameters of Fi are the constructor parameters
> the return type of Fi is C followed by the template parameters of the class template enclosed in <>
> If C is not defined or does not declare any constructors, an additional fictional function template is added, derived as above from a hypothetical constructor C()
> In any case, an additional fictional function template derived as above from a hypothetical constructor C(C) is added, called the copy deduction candidate.
Я правильно понял, что дедукшн для класса определён через дедукшн для функций? Тогда всё есть!
>Я правильно понял, что дедукшн для класса определён через дедукшн для функций?
Автоматический — через вывод типов для конструктора.
user-defined через функцию спец. вида.
> Тогда всё есть!
Что есть? deduction guides для std::function при инициализации её с использованием member function нету. http://en.cppreference.com/w/cpp/utility/functional/function/deduction_guides
Вот теперь точно допедрил.
Ну код был не о том как оно там реально сделано, а о том как можно, например, отличить мембер функтцион от не мембер.
Ок.
Нет
Что там кидать?
В ширину: у тебя есть граф из спичек. Выбираешь наугад вершину и поджигаешь ее. Когда огонь потухнет, проверяешь, есть ли не загоревшиеся спички. Если есть, повторяешь операцию.
В глубину. У тебя есть граф-лабиринт. Идешь куда хочешь, на каждом ходу помечаешь пройденную вершину. Если некуда идти, возвращаешься назад до первой развилки и идешь в новую сторону. Продолжаешь до тех пор, пока не вернешься к самому началу. Проходишь таким образом каждую компоненту связности.
Код есть где угодно.
https://ideone.com/DakJUF
Почему у него m не равен m, что ему не нравится?
алсо, смысла нет сравнивать более половины символов.
Не угадает он нихуя, он не умеет читать написанное.
Память освобождается в дестракторе. Хочу передавать объект такого класса по значению, по цепочке, из внутренних вызовов во внешние и чтобы память освобождалась в деструкторе последнего внешнего объекта. Хочу тупо добавить bool owner
class C
{
...
buf ....
bool owner
~C() { if (owner) { free(buf); } }
}
и добавить copy constructor и assignment operator чтобы передавать оwnership
C (const C& copy)
{
this->owner = true;
copy.owner = false;
this->buf = copy.buf;
....
}
Проблема в const - его нужно дропнуть, но тогда не будет работать передача в верхние вызовы, так как будет создаваться временный объект типа reference и он обязан быть const.
Что делать?
инетересно. микрософт это хавает без проблем.
а гнусь ругается на отсутствие const в копи конструкторе.
Для этого в этой иде нужно создавать проект и муторно добавлять туда файлы, не считая других препятствий этих иде. Может быть есть софт, или способ как можно сходу начать исследовать код.
Это embedded, плюсовость должна быть минимальная, даже не с++98, просто C с классами. Нет никаких STL примочек не говоря уже о С++11 rvalue references и тп. А обойти мою проблему можно разными способами - делать deep сopy например и тд. Просто интересно есть ли другие альтернативы сделать вручную без примочек
>>1060954
тогда беда и нужно все усложнять. reference counting какой-нибудь. подразумеваю простой
пример где последний owner всегда переживает всех предыдущих>>1060933
Микрософт хуй ложил на стандарт.
>>1060913
>Что делать?
Rvalue reference.
>>1060913
http://coliru.stacked-crooked.com/a/3b1c1f4a891fa9dc
>>1060936
>Для этого в этой иде нужно создавать проект и муторно добавлять туда файлы,
В кутыкреакторе - несколько кликов (import existing project).
>>1060958
>Это embedded, плюсовость должна быть минимальная, даже не с++98, просто C с классами.
Ох, блядь. Что у тебя за компилятор такой с поддержкой стадарта "си с классами"? Какой флаг хоть?
http://coliru.stacked-crooked.com/a/2e5a60b842cb35ea
Можно при передаче передавать новый объект, что-то типа
foo(C(otherC, deep_copy{}})
И пытаться эмулировать так мувы.
да компилятор нормальный, свежий гнусь. я имею ввиду общий стиль заточен под "си с классами" чтобы размер кода минимизировать. никаких string STL, exceptions, даже new желательно избегать. твой пример работает нормально с флагом -std=c++11, спасибо.
>чтобы размер кода минимизировать.
С unique_ptr тащится какой-то шмоток кода, который тебе не нужен. Ты можешь сделать свой вариант на буле ручками. Никакого другого оверхеда там нет. Ты просто так написал:
>Это embedded, плюсовость должна быть минимальная, даже не с++98, просто C с классами. Нет никаких STL примочек не говоря уже о С++11 rvalue references и тп.
как будто там у тебя рили си с классами. rvalue reference - это указатель с другой семантикой, почему ты отмахиваешься от него?
Ну так то ты прав, раз оверхеда нет, надо попробовать. Отмахиваюсь инстинктивно так как привык по старинке. Байтоебство же в основном на голых сях и чуток плюсов для эстетики. В 99% случаях (прочитать сенсоры и кнопочки и включить пимпочку) вполне хватает. Здесь просто особый случай с кучей динамических буферов.
Олсо, rtti и exceptions отключил флагом компилятора?
Что делает флаг gcc -O0 ?
Ну это не то, чтобы оптимизация...
Т.е. конечно это оптимизация, но не в том смысле чтобы луп раскрутить или функцию заинлайнить, а в том, что стандарт явно разрешает её делать.
нужны воркараунды для 14ого стандарта.
38-я это где статик ассерт
>Пачаны, как запустить лямбду в компайл тайме?
1) Никак.
2) GC_IS_HAS_METHOD - это что за хрень? Хули там лишняя запятая делает?
Ты хоть покажи, что у тебя этот макрос должен делать. Если ты проверяешь наличие метода, то есть такая идиома, как Member Detection, подробно тут https://en.wikibooks.org/wiki/More_C++_Idioms/Member_Detector
дададдаадад, именно это, но там чтобы это работало - надо генерировать класс перед его использованием, у меня же всё без этого, не нужно никакого дополнительного кода перед использованием но в статик ассерт не засунешь без констэкспра
https://ideone.com/84nJkZ
тебе нужно не возвращать true/false из лямбды, а делать возвращаемый тип std::false_type или std::true_type, тогда должно прокатить
перед return надо typename написать)
Но всёравно до с++17 в статик ассерт не засунешь, обида(
Тебе нужно в ресурсы его запихать и после создания QApplication задать стиль из файла, хули ты как дурак?!
Это копия, сохраненная 26 сентября 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.